diff options
423 files changed, 28975 insertions, 9979 deletions
diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 46a9228616..0000a061d7 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -78,8 +78,8 @@ jobs: - name: Linux dependencies for tests if: ${{ matrix.proj-test }} run: | + sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo add-apt-repository ppa:kisak/kisak-mesa - sudo apt-get update sudo apt-get install -qq mesa-vulkan-drivers - name: Setup Godot build cache diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index a3722e19ce..6c92922185 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -15,9 +15,9 @@ jobs: - name: Install dependencies run: | + sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main" - sudo apt-get update sudo apt-get install -qq dos2unix clang-format-15 libxml2-utils python3-pip moreutils sudo update-alternatives --remove-all clang-format || true sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-15 100 diff --git a/core/core_bind.cpp b/core/core_bind.cpp index c752bdd057..f2eb7823e2 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -1590,8 +1590,12 @@ Vector<String> Engine::get_singleton_list() const { return ret; } -void Engine::register_script_language(ScriptLanguage *p_language) { - ScriptServer::register_language(p_language); +Error Engine::register_script_language(ScriptLanguage *p_language) { + return ScriptServer::register_language(p_language); +} + +Error Engine::unregister_script_language(const ScriptLanguage *p_language) { + return ScriptServer::unregister_language(p_language); } int Engine::get_script_language_count() { @@ -1662,6 +1666,7 @@ void Engine::_bind_methods() { ClassDB::bind_method(D_METHOD("get_singleton_list"), &Engine::get_singleton_list); ClassDB::bind_method(D_METHOD("register_script_language", "language"), &Engine::register_script_language); + ClassDB::bind_method(D_METHOD("unregister_script_language", "language"), &Engine::unregister_script_language); ClassDB::bind_method(D_METHOD("get_script_language_count"), &Engine::get_script_language_count); ClassDB::bind_method(D_METHOD("get_script_language", "index"), &Engine::get_script_language); diff --git a/core/core_bind.h b/core/core_bind.h index 8852463234..675da48591 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -499,7 +499,8 @@ public: void unregister_singleton(const StringName &p_name); Vector<String> get_singleton_list() const; - void register_script_language(ScriptLanguage *p_language); + Error register_script_language(ScriptLanguage *p_language); + Error unregister_script_language(const ScriptLanguage *p_language); int get_script_language_count(); ScriptLanguage *get_script_language(int p_index) const; diff --git a/core/input/gamecontrollerdb.txt b/core/input/gamecontrollerdb.txt index dcb6aefb00..59461959d5 100644 --- a/core/input/gamecontrollerdb.txt +++ b/core/input/gamecontrollerdb.txt @@ -69,7 +69,7 @@ 03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001230000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, @@ -383,7 +383,7 @@ 0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, -030000008f0e00001030000000000000,Mayflash Sega Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, +030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, 0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, 03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -407,7 +407,6 @@ 03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, 03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows, 03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, @@ -484,8 +483,8 @@ 030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, 030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,leftshoulder:b10,leftstick:b1,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, 030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, 030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, @@ -542,8 +541,9 @@ 030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, 030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, 030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, -030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, -030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,x:b0,y:b5,back:b2,guide:b10,start:b3,leftshoulder:b6,rightshoulder:b7,dpup:b12,dpleft:b14,dpdown:b13,dpright:b15,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows, 03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -574,7 +574,7 @@ 030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, 03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, 03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, @@ -678,7 +678,7 @@ 030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, 03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, 03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b10,x:b3,y:b4,platform:Windows, +03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, 03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, @@ -798,7 +798,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, @@ -843,6 +843,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -881,6 +882,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, 0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X, 0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, 03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X, 03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, @@ -897,6 +899,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000d620000011a7000010050000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X, 030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X, 030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, @@ -919,6 +922,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, 03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -940,7 +944,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X, 030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X, 03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00008701000005010000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X, 03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X, 03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, @@ -973,6 +979,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, 03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X, 030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, @@ -985,6 +992,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X, 030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, @@ -1029,8 +1037,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000631000014010000,8BitDo Pro 2 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00001030000011010000,8BitDo Pro 2 Wired Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000020000000000000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +06000000c82d00000020000006010000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, @@ -1053,7 +1064,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, @@ -1116,12 +1127,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, 19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, @@ -1149,6 +1162,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux, 030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1173,6 +1187,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux, 03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux, 03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, @@ -1230,8 +1245,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, 0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, 03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, 03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux, @@ -1276,12 +1293,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, 030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, 03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, +060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, 03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux, 030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, @@ -1312,7 +1331,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e00008501000011010000,PDP Nintendo Switch Fightpad Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00008701000011010000,PDP Rock Nintendo Switch Candy Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006f0e00000901000011010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1330,6 +1348,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1369,6 +1388,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, 03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, 03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, 03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -1400,6 +1420,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00008701000011010000,Rock Candy Switch Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, @@ -1429,6 +1450,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, 03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, 03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, 03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, @@ -1482,6 +1504,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, 030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, 03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, @@ -1656,9 +1679,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, 436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, 65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, 535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, 30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, -484a5a204d6179666c61736820576969,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android, 31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, 37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, 64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, @@ -1737,10 +1762,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, 526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, 64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, 66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, 32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, -37316565396364386635383230353365,Saturn,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, 38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, 61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, 30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, @@ -1753,6 +1778,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, 63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, 476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, 0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, diff --git a/core/input/godotcontrollerdb.txt b/core/input/godotcontrollerdb.txt index e11099f380..eb4a1a1578 100644 --- a/core/input/godotcontrollerdb.txt +++ b/core/input/godotcontrollerdb.txt @@ -32,7 +32,7 @@ Linux046dc216,046d-c216-Logitech Logitech Dual Action,a:b1,b:b2,y:b3,x:b0,start: Linux20d6a713,Bensussen Deutsch & Associates Inc.(BDA) NSW Wired controller,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:-a5,dpleft:-a4,dpdown:+a5,dpright:+a4,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Web Linux054c05c4,Sony Computer Entertainment Wireless Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web Linux18d19400,18d1-9400-Google LLC Stadia Controller rev. A,a:b0,b:b1,y:b3,x:b2,start:b7,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Web -Linux054c0268,054c-0268-Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web +Linux054c0268,054c-0268-Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,y:b2,x:b3,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web # UWP __UWP_GAMEPAD__,Xbox Controller,a:b2,b:b3,x:b4,y:b5,start:b0,back:b1,leftstick:b12,rightstick:b13,leftshoulder:b10,rightshoulder:b11,dpup:b6,dpdown:b7,dpleft:b8,dpright:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:UWP, diff --git a/core/input/input.cpp b/core/input/input.cpp index 071d9ba648..b2164b8e76 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -231,14 +231,17 @@ Input::VelocityTrack::VelocityTrack() { bool Input::is_anything_pressed() const { _THREAD_SAFE_METHOD_ + if (!keys_pressed.is_empty() || !joy_buttons_pressed.is_empty() || !mouse_button_mask.is_empty()) { + return true; + } + for (const KeyValue<StringName, Input::Action> &E : action_state) { if (E.value.pressed) { return true; } } - return !keys_pressed.is_empty() || - !joy_buttons_pressed.is_empty() || - !mouse_button_mask.is_empty(); + + return false; } bool Input::is_key_pressed(Key p_keycode) const { @@ -1362,8 +1365,9 @@ void Input::parse_mapping(String p_mapping) { JoyButton output_button = _get_output_button(output); JoyAxis output_axis = _get_output_axis(output); - ERR_CONTINUE_MSG(output_button == JoyButton::INVALID && output_axis == JoyAxis::INVALID, - vformat("Unrecognized output string \"%s\" in mapping:\n%s", output, p_mapping)); + if (output_button == JoyButton::INVALID && output_axis == JoyAxis::INVALID) { + print_verbose(vformat("Unrecognized output string \"%s\" in mapping:\n%s", output, p_mapping)); + } ERR_CONTINUE_MSG(output_button != JoyButton::INVALID && output_axis != JoyAxis::INVALID, vformat("Output string \"%s\" matched both button and axis in mapping:\n%s", output, p_mapping)); diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index 7c4642a8a5..a6c1bb168c 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -1186,14 +1186,14 @@ static const char *_joy_button_descriptions[(size_t)JoyButton::SDL_MAX] = { }; String InputEventJoypadButton::as_text() const { - String text = "Joypad Button " + itos((int64_t)button_index); + String text = vformat(RTR("Joypad Button %d"), (int64_t)button_index); if (button_index > JoyButton::INVALID && button_index < JoyButton::SDL_MAX) { - text += vformat(" (%s)", _joy_button_descriptions[(size_t)button_index]); + text += vformat(" (%s)", TTRGET(_joy_button_descriptions[(size_t)button_index])); } if (pressure != 0) { - text += ", Pressure:" + String(Variant(pressure)); + text += ", " + RTR("Pressure:") + " " + String(Variant(pressure)); } return text; diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp index cacbcb28a4..0e9084de84 100644 --- a/core/io/file_access.cpp +++ b/core/io/file_access.cpp @@ -856,6 +856,8 @@ void FileAccess::_bind_methods() { ClassDB::bind_method(D_METHOD("store_pascal_string", "string"), &FileAccess::store_pascal_string); ClassDB::bind_method(D_METHOD("get_pascal_string"), &FileAccess::get_pascal_string); + ClassDB::bind_method(D_METHOD("close"), &FileAccess::close); + ClassDB::bind_static_method("FileAccess", D_METHOD("file_exists", "path"), &FileAccess::exists); ClassDB::bind_static_method("FileAccess", D_METHOD("get_modified_time", "file"), &FileAccess::get_modified_time); diff --git a/core/io/file_access.h b/core/io/file_access.h index 3e51ba11ed..47770cad87 100644 --- a/core/io/file_access.h +++ b/core/io/file_access.h @@ -166,6 +166,8 @@ public: void store_var(const Variant &p_var, bool p_full_objects = false); + virtual void close() = 0; + virtual bool file_exists(const String &p_name) = 0; ///< return true if a file exists virtual Error reopen(const String &p_path, int p_mode_flags); ///< does not change the AccessType diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index c256668af0..da59ae8c59 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -385,6 +385,10 @@ Error FileAccessCompressed::_set_unix_permissions(const String &p_file, uint32_t return FAILED; } +void FileAccessCompressed::close() { + _close(); +} + FileAccessCompressed::~FileAccessCompressed() { _close(); } diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index 136fcede06..601b74a9c1 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -97,6 +97,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override; virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual void close() override; + FileAccessCompressed() {} virtual ~FileAccessCompressed(); }; diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index 8282f2515c..c39d19d52b 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -294,6 +294,10 @@ Error FileAccessEncrypted::_set_unix_permissions(const String &p_file, uint32_t return ERR_UNAVAILABLE; } +void FileAccessEncrypted::close() { + _close(); +} + FileAccessEncrypted::~FileAccessEncrypted() { _close(); } diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index d8cd0df6d1..9702b5a517 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -88,6 +88,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override; virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual void close() override; + FileAccessEncrypted() {} ~FileAccessEncrypted(); }; diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index adc29f74be..43fe6ab658 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -71,6 +71,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } + virtual void close() override {} + FileAccessMemory() {} }; diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp index e765eb2d42..7fabff26ac 100644 --- a/core/io/file_access_network.cpp +++ b/core/io/file_access_network.cpp @@ -469,6 +469,15 @@ void FileAccessNetwork::configure() { GLOBAL_DEF(PropertyInfo(Variant::INT, "network/remote_fs/page_read_ahead", PROPERTY_HINT_RANGE, "0,8,1,or_greater"), 4); } +void FileAccessNetwork::close() { + _close(); + + FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton; + nc->lock_mutex(); + nc->accesses.erase(id); + nc->unlock_mutex(); +} + FileAccessNetwork::FileAccessNetwork() { FileAccessNetworkClient *nc = FileAccessNetworkClient::singleton; nc->lock_mutex(); diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h index 16e8920114..78c19347ce 100644 --- a/core/io/file_access_network.h +++ b/core/io/file_access_network.h @@ -156,6 +156,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override; virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual void close() override; + static void configure(); FileAccessNetwork(); diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index 7c392c005a..9553f35b19 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -366,6 +366,10 @@ bool FileAccessPack::file_exists(const String &p_name) { return false; } +void FileAccessPack::close() { + f = Ref<FileAccess>(); +} + FileAccessPack::FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file) : pf(p_file), f(FileAccess::open(pf.pack, FileAccess::READ)) { diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index baa62e4516..8bfabc9529 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -178,6 +178,8 @@ public: virtual bool file_exists(const String &p_name) override; + virtual void close() override; + FileAccessPack(const String &p_path, const PackedData::PackedFile &p_file); }; diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp index b71dd5e9bd..064353476f 100644 --- a/core/io/file_access_zip.cpp +++ b/core/io/file_access_zip.cpp @@ -336,6 +336,10 @@ bool FileAccessZip::file_exists(const String &p_name) { return false; } +void FileAccessZip::close() { + _close(); +} + FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) { open_internal(p_path, FileAccess::READ); } diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index 63f1012f99..f8b640946c 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -109,6 +109,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } + virtual void close() override; + FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file); ~FileAccessZip(); }; diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 0fa82bb8c1..078320d620 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -31,6 +31,7 @@ #ifndef MATH_FUNCS_H #define MATH_FUNCS_H +#include "core/error/error_macros.h" #include "core/math/math_defs.h" #include "core/math/random_pcg.h" #include "core/typedefs.h" @@ -225,6 +226,7 @@ public: } static _ALWAYS_INLINE_ int64_t posmod(int64_t p_x, int64_t p_y) { + ERR_FAIL_COND_V_MSG(p_y == 0, 0, "Division by zero in posmod is undefined. Returning 0 as fallback."); int64_t value = p_x % p_y; if (((value < 0) && (p_y > 0)) || ((value > 0) && (p_y < 0))) { value += p_y; diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp index d732f1e8b2..ae009fc4ef 100644 --- a/core/math/vector3.cpp +++ b/core/math/vector3.cpp @@ -108,7 +108,9 @@ Vector3 Vector3::octahedron_decode(const Vector2 &p_oct) { } Vector2 Vector3::octahedron_tangent_encode(const float sign) const { + const float bias = 1.0f / 32767.0f; Vector2 res = this->octahedron_encode(); + res.y = MAX(res.y, bias); res.y = res.y * 0.5f + 0.5f; res.y = sign >= 0.0f ? res.y : 1 - res.y; return res; diff --git a/core/math/vector3.h b/core/math/vector3.h index bd8739d024..18943a820f 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -76,6 +76,14 @@ struct _NO_DISCARD_ Vector3 { return x < y ? (y < z ? Vector3::AXIS_Z : Vector3::AXIS_Y) : (x < z ? Vector3::AXIS_Z : Vector3::AXIS_X); } + Vector3 min(const Vector3 &p_vector3) const { + return Vector3(MIN(x, p_vector3.x), MIN(y, p_vector3.y), MIN(z, p_vector3.z)); + } + + Vector3 max(const Vector3 &p_vector3) const { + return Vector3(MAX(x, p_vector3.x), MAX(y, p_vector3.y), MAX(z, p_vector3.z)); + } + _FORCE_INLINE_ real_t length() const; _FORCE_INLINE_ real_t length_squared() const; diff --git a/core/math/vector3i.h b/core/math/vector3i.h index 96f9beef12..53d3829a99 100644 --- a/core/math/vector3i.h +++ b/core/math/vector3i.h @@ -69,6 +69,14 @@ struct _NO_DISCARD_ Vector3i { Vector3i::Axis min_axis_index() const; Vector3i::Axis max_axis_index() const; + Vector3i min(const Vector3i &p_vector3i) const { + return Vector3i(MIN(x, p_vector3i.x), MIN(y, p_vector3i.y), MIN(z, p_vector3i.z)); + } + + Vector3i max(const Vector3i &p_vector3i) const { + return Vector3i(MAX(x, p_vector3i.x), MAX(y, p_vector3i.y), MAX(z, p_vector3i.z)); + } + _FORCE_INLINE_ int64_t length_squared() const; _FORCE_INLINE_ double length() const; diff --git a/core/math/vector4.h b/core/math/vector4.h index 0509261f33..f16b040317 100644 --- a/core/math/vector4.h +++ b/core/math/vector4.h @@ -68,6 +68,14 @@ struct _NO_DISCARD_ Vector4 { Vector4::Axis min_axis_index() const; Vector4::Axis max_axis_index() const; + Vector4 min(const Vector4 &p_vector4) const { + return Vector4(MIN(x, p_vector4.x), MIN(y, p_vector4.y), MIN(z, p_vector4.z), MIN(w, p_vector4.w)); + } + + Vector4 max(const Vector4 &p_vector4) const { + return Vector4(MAX(x, p_vector4.x), MAX(y, p_vector4.y), MAX(z, p_vector4.z), MAX(w, p_vector4.w)); + } + _FORCE_INLINE_ real_t length_squared() const; bool is_equal_approx(const Vector4 &p_vec4) const; bool is_zero_approx() const; diff --git a/core/math/vector4i.h b/core/math/vector4i.h index d38a9de6f1..b815aa8e76 100644 --- a/core/math/vector4i.h +++ b/core/math/vector4i.h @@ -71,6 +71,14 @@ struct _NO_DISCARD_ Vector4i { Vector4i::Axis min_axis_index() const; Vector4i::Axis max_axis_index() const; + Vector4i min(const Vector4i &p_vector4i) const { + return Vector4i(MIN(x, p_vector4i.x), MIN(y, p_vector4i.y), MIN(z, p_vector4i.z), MIN(w, p_vector4i.w)); + } + + Vector4i max(const Vector4i &p_vector4i) const { + return Vector4i(MAX(x, p_vector4i.x), MAX(y, p_vector4i.y), MAX(z, p_vector4i.z), MAX(w, p_vector4i.w)); + } + _FORCE_INLINE_ int64_t length_squared() const; _FORCE_INLINE_ double length() const; diff --git a/core/object/class_db.h b/core/object/class_db.h index 0e408e8845..0b62cf40f7 100644 --- a/core/object/class_db.h +++ b/core/object/class_db.h @@ -40,6 +40,8 @@ #include "core/object/callable_method_pointer.h" #include "core/templates/hash_set.h" +#include <type_traits> + #define DEFVAL(m_defval) (m_defval) #ifdef DEBUG_METHODS_ENABLED @@ -241,6 +243,24 @@ public: static uint64_t get_api_hash(APIType p_api); + template <typename> + struct member_function_traits; + + template <typename R, typename T, typename... Args> + struct member_function_traits<R (T::*)(Args...)> { + using return_type = R; + }; + + template <typename R, typename T, typename... Args> + struct member_function_traits<R (T::*)(Args...) const> { + using return_type = R; + }; + + template <typename R, typename... Args> + struct member_function_traits<R (*)(Args...)> { + using return_type = R; + }; + template <class N, class M, typename... VarArgs> static MethodBind *bind_method(N p_method_name, M p_method, VarArgs... p_args) { Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. @@ -249,6 +269,9 @@ public: argptrs[i] = &args[i]; } MethodBind *bind = create_method_bind(p_method); + if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) { + bind->set_return_type_is_raw_object_ptr(true); + } return bind_methodfi(METHOD_FLAGS_DEFAULT, bind, p_method_name, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); } @@ -261,6 +284,9 @@ public: } MethodBind *bind = create_static_method_bind(p_method); bind->set_instance_class(p_class); + if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) { + bind->set_return_type_is_raw_object_ptr(true); + } return bind_methodfi(METHOD_FLAGS_DEFAULT, bind, p_method_name, sizeof...(p_args) == 0 ? nullptr : (const Variant **)argptrs, sizeof...(p_args)); } @@ -273,6 +299,9 @@ public: bind->set_name(p_name); bind->set_default_arguments(p_default_args); + if constexpr (std::is_same<typename member_function_traits<M>::return_type, Object *>::value) { + bind->set_return_type_is_raw_object_ptr(true); + } String instance_type = bind->get_instance_class(); diff --git a/core/object/message_queue.cpp b/core/object/message_queue.cpp index ebed6c21e9..decf030e27 100644 --- a/core/object/message_queue.cpp +++ b/core/object/message_queue.cpp @@ -55,9 +55,9 @@ Error MessageQueue::push_set(ObjectID p_id, const StringName &p_prop, const Vari if (ObjectDB::get_instance(p_id)) { type = ObjectDB::get_instance(p_id)->get_class(); } - print_line("Failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id)); + ERR_PRINT("Failed set: " + type + ":" + p_prop + " target ID: " + itos(p_id) + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); statistics(); - ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); + return ERR_OUT_OF_MEMORY; } Message *msg = memnew_placement(&buffer[buffer_end], Message); @@ -82,9 +82,9 @@ Error MessageQueue::push_notification(ObjectID p_id, int p_notification) { uint8_t room_needed = sizeof(Message); if ((buffer_end + room_needed) >= buffer_size) { - print_line("Failed notification: " + itos(p_notification) + " target ID: " + itos(p_id)); + ERR_PRINT("Failed notification: " + itos(p_notification) + " target ID: " + itos(p_id) + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); statistics(); - ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); + return ERR_OUT_OF_MEMORY; } Message *msg = memnew_placement(&buffer[buffer_end], Message); @@ -117,9 +117,9 @@ Error MessageQueue::push_callablep(const Callable &p_callable, const Variant **p int room_needed = sizeof(Message) + sizeof(Variant) * p_argcount; if ((buffer_end + room_needed) >= buffer_size) { - print_line("Failed method: " + p_callable); + ERR_PRINT("Failed method: " + p_callable + ". Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); statistics(); - ERR_FAIL_V_MSG(ERR_OUT_OF_MEMORY, "Message queue out of memory. Try increasing 'memory/limits/message_queue/max_size_kb' in project settings."); + return ERR_OUT_OF_MEMORY; } Message *msg = memnew_placement(&buffer[buffer_end], Message); diff --git a/core/object/method_bind.h b/core/object/method_bind.h index 8334a7eef6..d37479f45b 100644 --- a/core/object/method_bind.h +++ b/core/object/method_bind.h @@ -49,6 +49,7 @@ class MethodBind { bool _static = false; bool _const = false; bool _returns = false; + bool _returns_raw_obj_ptr = false; protected: Variant::Type *argument_types = nullptr; @@ -121,6 +122,9 @@ public: _FORCE_INLINE_ bool has_return() const { return _returns; } virtual bool is_vararg() const { return false; } + _FORCE_INLINE_ bool is_return_type_raw_object_ptr() { return _returns_raw_obj_ptr; } + _FORCE_INLINE_ void set_return_type_is_raw_object_ptr(bool p_returns_raw_obj) { _returns_raw_obj_ptr = p_returns_raw_obj; } + void set_default_arguments(const Vector<Variant> &p_defargs); uint32_t get_hash() const; diff --git a/core/object/script_language.cpp b/core/object/script_language.cpp index 1d53cf66d4..71f40660f4 100644 --- a/core/object/script_language.cpp +++ b/core/object/script_language.cpp @@ -165,22 +165,30 @@ ScriptLanguage *ScriptServer::get_language(int p_idx) { return _languages[p_idx]; } -void ScriptServer::register_language(ScriptLanguage *p_language) { - ERR_FAIL_NULL(p_language); - ERR_FAIL_COND(_language_count >= MAX_LANGUAGES); +Error ScriptServer::register_language(ScriptLanguage *p_language) { + ERR_FAIL_NULL_V(p_language, ERR_INVALID_PARAMETER); + ERR_FAIL_COND_V_MSG(_language_count >= MAX_LANGUAGES, ERR_UNAVAILABLE, "Script languages limit has been reach, cannot register more."); + for (int i = 0; i < _language_count; i++) { + const ScriptLanguage *other_language = _languages[i]; + ERR_FAIL_COND_V_MSG(other_language->get_extension() == p_language->get_extension(), ERR_ALREADY_EXISTS, "A script language with extension '" + p_language->get_extension() + "' is already registered."); + ERR_FAIL_COND_V_MSG(other_language->get_name() == p_language->get_name(), ERR_ALREADY_EXISTS, "A script language with name '" + p_language->get_name() + "' is already registered."); + ERR_FAIL_COND_V_MSG(other_language->get_type() == p_language->get_type(), ERR_ALREADY_EXISTS, "A script language with type '" + p_language->get_type() + "' is already registered."); + } _languages[_language_count++] = p_language; + return OK; } -void ScriptServer::unregister_language(const ScriptLanguage *p_language) { +Error ScriptServer::unregister_language(const ScriptLanguage *p_language) { for (int i = 0; i < _language_count; i++) { if (_languages[i] == p_language) { _language_count--; if (i < _language_count) { SWAP(_languages[i], _languages[_language_count]); } - return; + return OK; } } + return ERR_DOES_NOT_EXIST; } void ScriptServer::init_languages() { diff --git a/core/object/script_language.h b/core/object/script_language.h index 14cc30e029..3ef121a8e7 100644 --- a/core/object/script_language.h +++ b/core/object/script_language.h @@ -70,8 +70,8 @@ public: static bool is_scripting_enabled(); _FORCE_INLINE_ static int get_language_count() { return _language_count; } static ScriptLanguage *get_language(int p_idx); - static void register_language(ScriptLanguage *p_language); - static void unregister_language(const ScriptLanguage *p_language); + static Error register_language(ScriptLanguage *p_language); + static Error unregister_language(const ScriptLanguage *p_language); static void set_reload_scripts_on_save(bool p_enable); static bool is_reload_scripts_on_save_enabled(); diff --git a/core/object/script_language_extension.cpp b/core/object/script_language_extension.cpp index 19c6fc3383..c7eb32c020 100644 --- a/core/object/script_language_extension.cpp +++ b/core/object/script_language_extension.cpp @@ -36,6 +36,7 @@ void ScriptExtension::_bind_methods() { GDVIRTUAL_BIND(_can_instantiate); GDVIRTUAL_BIND(_get_base_script); + GDVIRTUAL_BIND(_get_global_name); GDVIRTUAL_BIND(_inherits_script, "script"); GDVIRTUAL_BIND(_get_instance_base_type); diff --git a/core/string/translation_po.cpp b/core/string/translation_po.cpp index 2d3a9c7575..6b1595174a 100644 --- a/core/string/translation_po.cpp +++ b/core/string/translation_po.cpp @@ -254,11 +254,6 @@ StringName TranslationPO::get_plural_message(const StringName &p_src_text, const } ERR_FAIL_COND_V_MSG(translation_map[p_context][p_src_text].is_empty(), StringName(), "Source text \"" + String(p_src_text) + "\" is registered but doesn't have a translation. Please report this bug."); - if (translation_map[p_context][p_src_text].size() == 1) { - WARN_PRINT("Source string \"" + String(p_src_text) + "\" doesn't have plural translations. Use singular translation API for such as tr(), TTR() to translate \"" + String(p_src_text) + "\""); - return translation_map[p_context][p_src_text][0]; - } - int plural_index = _get_plural_index(p_n); ERR_FAIL_COND_V_MSG(plural_index < 0 || translation_map[p_context][p_src_text].size() < plural_index + 1, StringName(), "Plural index returned or number of plural translations is not valid. Please report this bug."); diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index b34d9f3271..1b3b070592 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -1157,6 +1157,14 @@ Vector<String> String::split_spaces() const { Vector<String> String::split(const String &p_splitter, bool p_allow_empty, int p_maxsplit) const { Vector<String> ret; + + if (is_empty()) { + if (p_allow_empty) { + ret.push_back(""); + } + return ret; + } + int from = 0; int len = length(); diff --git a/core/variant/container_type_validate.h b/core/variant/container_type_validate.h index ad679db9d0..ffe1dc90a3 100644 --- a/core/variant/container_type_validate.h +++ b/core/variant/container_type_validate.h @@ -73,7 +73,7 @@ struct ContainerTypeValidate { return type != p_type.type || class_name != p_type.class_name || script != p_type.script; } - // Coerces String and StringName into each other when needed. + // Coerces String and StringName into each other and int into float when needed. _FORCE_INLINE_ bool validate(Variant &inout_variant, const char *p_operation = "use") const { if (type == Variant::NIL) { return true; @@ -89,6 +89,9 @@ struct ContainerTypeValidate { } else if (type == Variant::STRING_NAME && inout_variant.get_type() == Variant::STRING) { inout_variant = StringName(inout_variant); return true; + } else if (type == Variant::FLOAT && inout_variant.get_type() == Variant::INT) { + inout_variant = (float)inout_variant; + return true; } ERR_FAIL_V_MSG(false, "Attempted to " + String(p_operation) + " a variable of type '" + Variant::get_type_name(inout_variant.get_type()) + "' into a " + where + " of type '" + Variant::get_type_name(type) + "'."); diff --git a/core/variant/variant.h b/core/variant/variant.h index b2f31a6d57..f694e59051 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -346,6 +346,10 @@ public: bool is_one() const; bool is_null() const; + // Make sure Variant is not implicitly cast when accessing it with bracket notation (GH-49469). + Variant &operator[](const Variant &p_key) = delete; + const Variant &operator[](const Variant &p_key) const = delete; + operator bool() const; operator signed int() const; operator unsigned int() const; // this is the real one diff --git a/core/variant/variant_op.cpp b/core/variant/variant_op.cpp index 59f562865d..33c285dc6d 100644 --- a/core/variant/variant_op.cpp +++ b/core/variant/variant_op.cpp @@ -1105,8 +1105,11 @@ bool Variant::in(const Variant &p_index, bool *r_valid) const { evaluate(OP_IN, p_index, *this, ret, valid); if (r_valid) { *r_valid = valid; + } + if (valid) { + ERR_FAIL_COND_V(ret.type != BOOL, false); + return *VariantGetInternalPtr<bool>::get_ptr(&ret); + } else { return false; } - ERR_FAIL_COND_V(ret.type != BOOL, false); - return *VariantGetInternalPtr<bool>::get_ptr(&ret); } diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 55810156a1..d5280cb548 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -803,7 +803,8 @@ Returns the result of [param base] raised to the power of [param exp]. In GDScript, this is the equivalent of the [code]**[/code] operator. [codeblock] - pow(2, 5) # Returns 32 + pow(2, 5) # Returns 32.0 + pow(4, 1.5) # Returns 8.0 [/codeblock] </description> </method> @@ -1287,14 +1288,14 @@ Converts a formatted [param string] that was returned by [method var_to_str] to the original [Variant]. [codeblocks] [gdscript] - var a = '{ "a": 1, "b": 2 }' # a is a String - var b = str_to_var(a) # b is a Dictionary - print(b["a"]) # Prints 1 + var data = '{ "a": 1, "b": 2 }' # data is a String + var dict = str_to_var(data) # dict is a Dictionary + print(dict["a"]) # Prints 1 [/gdscript] [csharp] - string a = "{ \"a\": 1, \"b\": 2 }"; // a is a string - var b = GD.StrToVar(a).AsGodotDictionary(); // b is a Dictionary - GD.Print(b["a"]); // Prints 1 + string data = "{ \"a\": 1, \"b\": 2 }"; // data is a string + var dict = GD.StrToVar(data).AsGodotDictionary(); // dict is a Dictionary + GD.Print(dict["a"]); // Prints 1 [/csharp] [/codeblocks] </description> @@ -2272,7 +2273,7 @@ Command (on macOS) or Meta/Windows key mask. </constant> <constant name="KEY_MASK_CTRL" value="268435456" enum="KeyModifierMask" is_bitfield="true"> - Ctrl key mask. + Control key mask. </constant> <constant name="KEY_MASK_KPAD" value="536870912" enum="KeyModifierMask" is_bitfield="true"> Keypad key mask. @@ -2293,10 +2294,10 @@ Middle mouse button. </constant> <constant name="MOUSE_BUTTON_WHEEL_UP" value="4" enum="MouseButton"> - Mouse wheel up. + Mouse wheel scrolling up. </constant> <constant name="MOUSE_BUTTON_WHEEL_DOWN" value="5" enum="MouseButton"> - Mouse wheel down. + Mouse wheel scrolling down. </constant> <constant name="MOUSE_BUTTON_WHEEL_LEFT" value="6" enum="MouseButton"> Mouse wheel left button (only present on some mice). @@ -2760,6 +2761,7 @@ Hints that a string property is a password, and every character is replaced with the secret character. </constant> <constant name="PROPERTY_HINT_MAX" value="37" enum="PropertyHint"> + Represents the size of the [enum PropertyHint] enum. </constant> <constant name="PROPERTY_USAGE_NONE" value="0" enum="PropertyUsageFlags" is_bitfield="true"> The property is not stored, and does not display in the editor. This is the default for non-exported properties. @@ -2818,7 +2820,7 @@ When duplicating a resource with [method Resource.duplicate], and this flag is set on a property of that resource, the property should never be duplicated, regardless of the [code]subresources[/code] bool parameter. </constant> <constant name="PROPERTY_USAGE_HIGH_END_GFX" value="2097152" enum="PropertyUsageFlags" is_bitfield="true"> - The property is only shown in the editor if modern renderers are supported (GLES3 is excluded). + The property is only shown in the editor if modern renderers are supported (the Compatibility rendering method is excluded). </constant> <constant name="PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT" value="4194304" enum="PropertyUsageFlags" is_bitfield="true"> </constant> diff --git a/doc/classes/AnimationNodeAnimation.xml b/doc/classes/AnimationNodeAnimation.xml index 5a8bac1629..93839c6782 100644 --- a/doc/classes/AnimationNodeAnimation.xml +++ b/doc/classes/AnimationNodeAnimation.xml @@ -21,8 +21,10 @@ </members> <constants> <constant name="PLAY_MODE_FORWARD" value="0" enum="PlayMode"> + Plays animation in forward direction. </constant> <constant name="PLAY_MODE_BACKWARD" value="1" enum="PlayMode"> + Plays animation in backward direction. </constant> </constants> </class> diff --git a/doc/classes/AnimationNodeOneShot.xml b/doc/classes/AnimationNodeOneShot.xml index 9e8193868c..713296069d 100644 --- a/doc/classes/AnimationNodeOneShot.xml +++ b/doc/classes/AnimationNodeOneShot.xml @@ -5,6 +5,35 @@ </brief_description> <description> A resource to add to an [AnimationNodeBlendTree]. This node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters. + After setting the request and changing the animation playback, the one-shot node automatically clears the request on the next process frame by setting its [code]request[/code] value to [constant ONE_SHOT_REQUEST_NONE]. + [codeblocks] + [gdscript] + # Play child animation connected to "shot" port. + animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE) + # Alternative syntax (same result as above). + animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE + + # Abort child animation connected to "shot" port. + animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT) + # Alternative syntax (same result as above). + animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT + + # Get current state (read-only). + animation_tree.get("parameters/OneShot/active")) + # Alternative syntax (same result as above). + animation_tree["parameters/OneShot/active"] + [/gdscript] + [csharp] + // Play child animation connected to "shot" port. + animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE); + + // Abort child animation connected to "shot" port. + animationTree.Set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT); + + // Get current state (read-only). + animationTree.Get("parameters/OneShot/active"); + [/csharp] + [/codeblocks] </description> <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> @@ -13,6 +42,7 @@ <members> <member name="autorestart" type="bool" setter="set_autorestart" getter="has_autorestart" default="false"> If [code]true[/code], the sub-animation will restart automatically after finishing. + In other words, to start auto restarting, the animation must be played once with the [constant ONE_SHOT_REQUEST_FIRE] request. The [constant ONE_SHOT_REQUEST_ABORT] request stops the auto restarting, but it does not disable the [member autorestart] itself. So, the [constant ONE_SHOT_REQUEST_FIRE] request will start auto restarting again. </member> <member name="autorestart_delay" type="float" setter="set_autorestart_delay" getter="get_autorestart_delay" default="1.0"> The delay after which the automatic restart is triggered, in seconds. @@ -21,22 +51,30 @@ If [member autorestart] is [code]true[/code], a random additional delay (in seconds) between 0 and this value will be added to [member autorestart_delay]. </member> <member name="fadein_time" type="float" setter="set_fadein_time" getter="get_fadein_time" default="0.0"> + The fade-in duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a crossfade that starts at 0 second and ends at 1 second during the animation. </member> <member name="fadeout_time" type="float" setter="set_fadeout_time" getter="get_fadeout_time" default="0.0"> + The fade-out duration. For example, setting this to [code]1.0[/code] for a 5 second length animation will produce a crossfade that starts at 4 second and ends at 5 second during the animation. </member> <member name="mix_mode" type="int" setter="set_mix_mode" getter="get_mix_mode" enum="AnimationNodeOneShot.MixMode" default="0"> + The blend type. </member> </members> <constants> <constant name="ONE_SHOT_REQUEST_NONE" value="0" enum="OneShotRequest"> + The default state of the request. Nothing is done. </constant> <constant name="ONE_SHOT_REQUEST_FIRE" value="1" enum="OneShotRequest"> + The request to play the animation connected to "shot" port. </constant> <constant name="ONE_SHOT_REQUEST_ABORT" value="2" enum="OneShotRequest"> + The request to stop the animation connected to "shot" port. </constant> <constant name="MIX_MODE_BLEND" value="0" enum="MixMode"> + Blends two animations. See also [AnimationNodeBlend2]. </constant> <constant name="MIX_MODE_ADD" value="1" enum="MixMode"> + Blends two animations additively. See also [AnimationNodeAdd2]. </constant> </constants> </class> diff --git a/doc/classes/AnimationNodeStateMachinePlayback.xml b/doc/classes/AnimationNodeStateMachinePlayback.xml index 17a946bb3e..4772c1d819 100644 --- a/doc/classes/AnimationNodeStateMachinePlayback.xml +++ b/doc/classes/AnimationNodeStateMachinePlayback.xml @@ -24,12 +24,15 @@ <method name="get_current_length" qualifiers="const"> <return type="float" /> <description> + Returns the current state length. + [b]Note:[/b] It is possible that any [AnimationRootNode] can be nodes as well as animations. This means that there can be multiple animations within a single state. Which animation length has priority depends on the nodes connected inside it. Also, if a transition does not reset, the remaining length at that point will be returned. </description> </method> <method name="get_current_node" qualifiers="const"> <return type="StringName" /> <description> Returns the currently playing animation state. + [b]Note:[/b] When using a cross-fade, the current state changes to the next state immediately after the cross-fade begins. </description> </method> <method name="get_current_play_position" qualifiers="const"> diff --git a/doc/classes/AnimationNodeStateMachineTransition.xml b/doc/classes/AnimationNodeStateMachineTransition.xml index bccab4613a..537120aec5 100644 --- a/doc/classes/AnimationNodeStateMachineTransition.xml +++ b/doc/classes/AnimationNodeStateMachineTransition.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="AnimationNodeStateMachineTransition" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + A resource to connect each node to make a path for [AnimationNodeStateMachine]. </brief_description> <description> + The path generated when using [method AnimationNodeStateMachinePlayback.travel] is limited to the nodes connected by [AnimationNodeStateMachineTransition]. + You can set the timing and conditions of the transition in detail. </description> <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> diff --git a/doc/classes/AnimationNodeSync.xml b/doc/classes/AnimationNodeSync.xml index 21cac11d50..c0e7741ac0 100644 --- a/doc/classes/AnimationNodeSync.xml +++ b/doc/classes/AnimationNodeSync.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="AnimationNodeSync" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + The base class for [AnimationNode] which has more than two input ports and needs to synchronize them. </brief_description> <description> </description> diff --git a/doc/classes/AnimationNodeTimeSeek.xml b/doc/classes/AnimationNodeTimeSeek.xml index 0a7da8ba07..5033059927 100644 --- a/doc/classes/AnimationNodeTimeSeek.xml +++ b/doc/classes/AnimationNodeTimeSeek.xml @@ -4,25 +4,26 @@ A time-seeking animation node to be used with [AnimationTree]. </brief_description> <description> - This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an [Animation] from the start or a certain playback position inside the [AnimationNodeBlendTree]. After setting the time and changing the animation playback, the seek node automatically goes into sleep mode on the next process frame by setting its [code]seek_position[/code] value to [code]-1.0[/code]. + This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an [Animation] from the start or a certain playback position inside the [AnimationNodeBlendTree]. + After setting the time and changing the animation playback, the time seek node automatically goes into sleep mode on the next process frame by setting its [code]seek_request[/code] value to [code]-1.0[/code]. [codeblocks] [gdscript] # Play child animation from the start. - animation_tree.set("parameters/Seek/seek_position", 0.0) + animation_tree.set("parameters/TimeSeek/seek_request", 0.0) # Alternative syntax (same result as above). - animation_tree["parameters/Seek/seek_position"] = 0.0 + animation_tree["parameters/TimeSeek/seek_request"] = 0.0 # Play child animation from 12 second timestamp. - animation_tree.set("parameters/Seek/seek_position", 12.0) + animation_tree.set("parameters/TimeSeek/seek_request", 12.0) # Alternative syntax (same result as above). - animation_tree["parameters/Seek/seek_position"] = 12.0 + animation_tree["parameters/TimeSeek/seek_request"] = 12.0 [/gdscript] [csharp] // Play child animation from the start. - animationTree.Set("parameters/Seek/seek_position", 0.0); + animationTree.Set("parameters/TimeSeek/seek_request", 0.0); // Play child animation from 12 second timestamp. - animationTree.Set("parameters/Seek/seek_position", 12.0); + animationTree.Set("parameters/TimeSeek/seek_request", 12.0); [/csharp] [/codeblocks] </description> diff --git a/doc/classes/AnimationNodeTransition.xml b/doc/classes/AnimationNodeTransition.xml index bc3e5716dd..4eeaf15b53 100644 --- a/doc/classes/AnimationNodeTransition.xml +++ b/doc/classes/AnimationNodeTransition.xml @@ -5,6 +5,36 @@ </brief_description> <description> Simple state machine for cases which don't require a more advanced [AnimationNodeStateMachine]. Animations can be connected to the inputs and transition times can be specified. + After setting the request and changing the animation playback, the transition node automatically clears the request on the next process frame by setting its [code]transition_request[/code] value to empty. + [b]Note:[/b] When using a cross-fade, [code]current_state[/code] and [code]current_index[/code] change to the next state immediately after the cross-fade begins. + [codeblocks] + [gdscript] + # Play child animation connected to "state_2" port. + animation_tree.set("parameters/Transition/transition_request", "state_2") + # Alternative syntax (same result as above). + animation_tree["parameters/Transition/transition_request"] = "state_2" + + # Get current state name (read-only). + animation_tree.get("parameters/Transition/current_state") + # Alternative syntax (same result as above). + animation_tree["parameters/Transition/current_state"] + + # Get current state index (read-only). + animation_tree.get("parameters/Transition/current_index")) + # Alternative syntax (same result as above). + animation_tree["parameters/Transition/current_index"] + [/gdscript] + [csharp] + // Play child animation connected to "state_2" port. + animationTree.Set("parameters/Transition/transition_request", "state_2"); + + // Get current state name (read-only). + animationTree.Get("parameters/Transition/current_state"); + + // Get current state index (read-only). + animationTree.Get("parameters/Transition/current_index"); + [/csharp] + [/codeblocks] </description> <tutorials> <link title="AnimationTree">$DOCS_URL/tutorials/animation/animation_tree.html</link> diff --git a/doc/classes/AnimationRootNode.xml b/doc/classes/AnimationRootNode.xml index d364c15f77..cdcec3787a 100644 --- a/doc/classes/AnimationRootNode.xml +++ b/doc/classes/AnimationRootNode.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="AnimationRootNode" inherits="AnimationNode" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + The [AnimationNode] which can be set as the root of an [AnimationTree]. </brief_description> <description> </description> diff --git a/doc/classes/AnimationTree.xml b/doc/classes/AnimationTree.xml index 98256f0a38..ed98f47f58 100644 --- a/doc/classes/AnimationTree.xml +++ b/doc/classes/AnimationTree.xml @@ -33,7 +33,7 @@ <method name="get_root_motion_position" qualifiers="const"> <return type="Vector3" /> <description> - Retrieve the motion of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere. + Retrieve the motion delta of position with the [member root_motion_track] as a [Vector3] that can be used elsewhere. If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_POSITION_3D], returns [code]Vector3(0, 0, 0)[/code]. See also [member root_motion_track] and [RootMotionView]. The most basic example is applying position to [CharacterBody3D]: @@ -50,12 +50,46 @@ move_and_slide() [/gdscript] [/codeblocks] + By using this in combination with [method get_root_motion_position_accumulator], you can apply the root motion position more correctly to account for the rotation of the node. + [codeblocks] + [gdscript] + func _process(delta): + if Input.is_action_just_pressed("animate"): + state_machine.travel("Animate") + set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation()) + var velocity: Vector3 = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta + set_velocity(velocity) + move_and_slide() + [/gdscript] + [/codeblocks] + </description> + </method> + <method name="get_root_motion_position_accumulator" qualifiers="const"> + <return type="Vector3" /> + <description> + Retrieve the blended value of the position tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere. + This is useful in cases where you want to respect the initial key values of the animation. + For example, if an animation with only one key [code]Vector3(0, 0, 0)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(1, 0, 1)[/code] is played in the next frame, the difference can be calculated as follows: + [codeblocks] + [gdscript] + var prev_root_motion_position_accumulator: Vector3 + + func _process(delta): + if Input.is_action_just_pressed("animate"): + state_machine.travel("Animate") + var current_root_motion_position_accumulator: Vector3 = animation_tree.get_root_motion_position_accumulator() + var difference: Vector3 = current_root_motion_position_accumulator - prev_root_motion_position_accumulator + prev_root_motion_position_accumulator = current_root_motion_position_accumulator + transform.origin += difference + [/gdscript] + [/codeblocks] + However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases. </description> </method> <method name="get_root_motion_rotation" qualifiers="const"> <return type="Quaternion" /> <description> - Retrieve the motion of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere. + Retrieve the motion delta of rotation with the [member root_motion_track] as a [Quaternion] that can be used elsewhere. If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_ROTATION_3D], returns [code]Quaternion(0, 0, 0, 1)[/code]. See also [member root_motion_track] and [RootMotionView]. The most basic example is applying rotation to [CharacterBody3D]: @@ -69,10 +103,33 @@ [/codeblocks] </description> </method> + <method name="get_root_motion_rotation_accumulator" qualifiers="const"> + <return type="Quaternion" /> + <description> + Retrieve the blended value of the rotation tracks with the [member root_motion_track] as a [Quaternion] that can be used elsewhere. + This is necessary to apply the root motion position correctly, taking rotation into account. See also [method get_root_motion_position]. + Also, this is useful in cases where you want to respect the initial key values of the animation. + For example, if an animation with only one key [code]Quaternion(0, 0, 0, 1)[/code] is played in the previous frame and then an animation with only one key [code]Quaternion(0, 0.707, 0, 0.707)[/code] is played in the next frame, the difference can be calculated as follows: + [codeblocks] + [gdscript] + var prev_root_motion_rotation_accumulator: Quaternion + + func _process(delta): + if Input.is_action_just_pressed("animate"): + state_machine.travel("Animate") + var current_root_motion_rotation_accumulator: Quaternion = animation_tree.get_root_motion_Quaternion_accumulator() + var difference: Quaternion = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator + prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator + transform.basis *= difference + [/gdscript] + [/codeblocks] + However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases. + </description> + </method> <method name="get_root_motion_scale" qualifiers="const"> <return type="Vector3" /> <description> - Retrieve the motion of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere. + Retrieve the motion delta of scale with the [member root_motion_track] as a [Vector3] that can be used elsewhere. If [member root_motion_track] is not a path to a track of type [constant Animation.TYPE_SCALE_3D], returns [code]Vector3(0, 0, 0)[/code]. See also [member root_motion_track] and [RootMotionView]. The most basic example is applying scale to [CharacterBody3D]: @@ -92,6 +149,27 @@ [/codeblocks] </description> </method> + <method name="get_root_motion_scale_accumulator" qualifiers="const"> + <return type="Vector3" /> + <description> + Retrieve the blended value of the scale tracks with the [member root_motion_track] as a [Vector3] that can be used elsewhere. + For example, if an animation with only one key [code]Vector3(1, 1, 1)[/code] is played in the previous frame and then an animation with only one key [code]Vector3(2, 2, 2)[/code] is played in the next frame, the difference can be calculated as follows: + [codeblocks] + [gdscript] + var prev_root_motion_scale_accumulator: Vector3 + + func _process(delta): + if Input.is_action_just_pressed("animate"): + state_machine.travel("Animate") + var current_root_motion_scale_accumulator: Vector3 = animation_tree.get_root_motion_scale_accumulator() + var difference: Vector3 = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator + prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator + transform.basis = transform.basis.scaled(difference) + [/gdscript] + [/codeblocks] + However, if the animation loops, an unintended discrete change may occur, so this is only useful for some simple use cases. + </description> + </method> </methods> <members> <member name="active" type="bool" setter="set_active" getter="is_active" default="false"> diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml index 8a98921a60..100a71abef 100644 --- a/doc/classes/Area2D.xml +++ b/doc/classes/Area2D.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Area2D" inherits="CollisionObject2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - 2D area for detection and physics and audio influence. + 2D area for detection, as well as physics and audio influence. </brief_description> <description> 2D area that detects [CollisionObject2D] nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses. diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml index bd046b7cb8..cf9e865064 100644 --- a/doc/classes/Area3D.xml +++ b/doc/classes/Area3D.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="Area3D" inherits="CollisionObject3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - 3D area for detection and physics and audio influence. + 3D area for detection, as well as physics and audio influence. </brief_description> <description> 3D area that detects [CollisionObject3D] nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping) and route audio to custom audio buses. diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index 60225275f3..e72aa373f7 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -215,10 +215,11 @@ If [code]true[/code], the object is rendered at the same size regardless of distance. </member> <member name="grow" type="bool" setter="set_grow_enabled" getter="is_grow_enabled" default="false"> - If [code]true[/code], enables the vertex grow setting. See [member grow_amount]. + If [code]true[/code], enables the vertex grow setting. This can be used to create mesh-based outlines using a second material pass and its [member cull_mode] set to [constant CULL_FRONT]. See also [member grow_amount]. + [b]Note:[/b] Vertex growth cannot create new vertices, which means that visible gaps may occur in sharp corners. This can be alleviated by designing the mesh to use smooth normals exclusively using [url=https://wiki.polycount.com/wiki/Face_weighted_normals]face weighted normals[/url] in the 3D authoring software. In this case, grow will be able to join every outline together, just like in the original mesh. </member> <member name="grow_amount" type="float" setter="set_grow" getter="get_grow" default="0.0"> - Grows object vertices in the direction of their normals. + Grows object vertices in the direction of their normals. Only effective if [member grow] is [code]true[/code]. </member> <member name="heightmap_deep_parallax" type="bool" setter="set_heightmap_deep_parallax" getter="is_heightmap_deep_parallax_enabled" default="false"> If [code]true[/code], uses parallax occlusion mapping to represent depth in the material instead of simple offset mapping (see [member heightmap_enabled]). This results in a more convincing depth effect, but is much more expensive on the GPU. Only enable this on materials where it makes a significant visual difference. @@ -277,7 +278,7 @@ If [code]true[/code], depth testing is disabled and the object will be drawn in render order. </member> <member name="normal_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> - If [code]true[/code], normal mapping is enabled. + If [code]true[/code], normal mapping is enabled. This has a slight performance cost, especially on mobile GPUs. </member> <member name="normal_scale" type="float" setter="set_normal_scale" getter="get_normal_scale" default="1.0"> The strength of the normal map's effect. @@ -344,7 +345,8 @@ Specifies the channel of the [member roughness_texture] in which the roughness information is stored. This is useful when you store the information for multiple effects in a single texture. For example if you stored metallic in the red channel, roughness in the blue, and ambient occlusion in the green you could reduce the number of textures you use. </member> <member name="shading_mode" type="int" setter="set_shading_mode" getter="get_shading_mode" enum="BaseMaterial3D.ShadingMode" default="1"> - Sets whether the shading takes place per-pixel or per-vertex. Per-vertex lighting is faster, making it the best choice for mobile applications, however it looks considerably worse than per-pixel. + Sets whether the shading takes place, per-pixel, per-vertex or unshaded. Per-vertex lighting is faster, making it the best choice for mobile applications, however it looks considerably worse than per-pixel. Unshaded rendering is the fastest, but disables all interactions with lights. + [b]Note:[/b] Setting the shading mode vertex shading currently has no effect, as vertex shading is not implemented yet. </member> <member name="shadow_to_opacity" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], enables the "shadow to opacity" render mode where lighting modifies the alpha so shadowed areas are opaque and non-shadowed areas are transparent. Useful for overlaying shadows onto a camera feed in AR. @@ -388,7 +390,7 @@ Repeat flags for the texture. See [enum TextureFilter] for options. </member> <member name="transparency" type="int" setter="set_transparency" getter="get_transparency" enum="BaseMaterial3D.Transparency" default="0"> - If [code]true[/code], transparency is enabled on the body. See also [member blend_mode]. + If [code]true[/code], transparency is enabled on the body. Some transparency modes will disable shadow casting. Any transparency mode other than Disabled has a greater performance impact compared to opaque rendering. See also [member blend_mode]. </member> <member name="use_particle_trails" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], enables parts of the shader required for [GPUParticles3D] trails to function. This also requires using a mesh with appropriate skinning, such as [RibbonTrailMesh] or [TubeTrailMesh]. Enabling this feature outside of materials used in [GPUParticles3D] meshes will break material rendering. @@ -431,7 +433,7 @@ </member> <member name="vertex_color_is_srgb" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], vertex colors are considered to be stored in sRGB color space and are converted to linear color space during rendering. If [code]false[/code], vertex colors are considered to be stored in linear color space and are rendered as-is. See also [member albedo_texture_force_srgb]. - [b]Note:[/b] Only effective when using the Vulkan Clustered or Vulkan Mobile backends. + [b]Note:[/b] Only effective when using the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="vertex_color_use_as_albedo" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], the vertex color is used as albedo color. @@ -523,31 +525,31 @@ Use [code]UV2[/code] with the detail texture. </constant> <constant name="TRANSPARENCY_DISABLED" value="0" enum="Transparency"> - The material will not use transparency. + The material will not use transparency. This is the fastest to render. </constant> <constant name="TRANSPARENCY_ALPHA" value="1" enum="Transparency"> - The material will use the texture's alpha values for transparency. + The material will use the texture's alpha values for transparency. This is the slowest to render, and disables shadow casting. </constant> <constant name="TRANSPARENCY_ALPHA_SCISSOR" value="2" enum="Transparency"> - The material will cut off all values below a threshold, the rest will remain opaque. The opaque portions will be rendered in the depth prepass. + The material will cut off all values below a threshold, the rest will remain opaque. The opaque portions will be rendered in the depth prepass. This is faster to render than alpha blending, but slower than opaque rendering. This also supports casting shadows. </constant> <constant name="TRANSPARENCY_ALPHA_HASH" value="3" enum="Transparency"> - The material will cut off all values below a spatially-deterministic threshold, the rest will remain opaque. + The material will cut off all values below a spatially-deterministic threshold, the rest will remain opaque. This is faster to render than alpha blending, but slower than opaque rendering. This also supports casting shadows. Alpha hashing is suited for hair rendering. </constant> <constant name="TRANSPARENCY_ALPHA_DEPTH_PRE_PASS" value="4" enum="Transparency"> - The material will use the texture's alpha value for transparency, but will discard fragments with an alpha of less than 0.99 during the depth prepass and fragments with an alpha less than 0.1 during the shadow pass. + The material will use the texture's alpha value for transparency, but will discard fragments with an alpha of less than 0.99 during the depth prepass and fragments with an alpha less than 0.1 during the shadow pass. This also supports casting shadows. </constant> <constant name="TRANSPARENCY_MAX" value="5" enum="Transparency"> Represents the size of the [enum Transparency] enum. </constant> <constant name="SHADING_MODE_UNSHADED" value="0" enum="ShadingMode"> - The object will not receive shadows. + The object will not receive shadows. This is the fastest to render, but it disables all interactions with lights. </constant> <constant name="SHADING_MODE_PER_PIXEL" value="1" enum="ShadingMode"> - The object will be shaded per pixel. Useful for realistic shading effect. + The object will be shaded per pixel. Useful for realistic shading effects. </constant> <constant name="SHADING_MODE_PER_VERTEX" value="2" enum="ShadingMode"> - The object will be shaded per vertex. Useful when you want cheaper shaders and do not care about visual quality. + The object will be shaded per vertex. Useful when you want cheaper shaders and do not care about visual quality. Not implemented yet (this mode will act like [constant SHADING_MODE_PER_PIXEL]). </constant> <constant name="SHADING_MODE_MAX" value="3" enum="ShadingMode"> Represents the size of the [enum ShadingMode] enum. @@ -623,13 +625,13 @@ Objects will not write their depth to the depth buffer, even during the depth prepass (if enabled). </constant> <constant name="CULL_BACK" value="0" enum="CullMode"> - Default cull mode. The back of the object is culled when not visible. Back face triangles will be culled when facing the camera. This results in only the front side of triangles being drawn. For closed-surface meshes this means that only the exterior of the mesh will be visible. + Default cull mode. The back of the object is culled when not visible. Back face triangles will be culled when facing the camera. This results in only the front side of triangles being drawn. For closed-surface meshes, this means that only the exterior of the mesh will be visible. </constant> <constant name="CULL_FRONT" value="1" enum="CullMode"> - Front face triangles will be culled when facing the camera. This results in only the back side of triangles being drawn. For closed-surface meshes this means that the interior of the mesh will be drawn instead of the exterior. + Front face triangles will be culled when facing the camera. This results in only the back side of triangles being drawn. For closed-surface meshes, this means that the interior of the mesh will be drawn instead of the exterior. </constant> <constant name="CULL_DISABLED" value="2" enum="CullMode"> - No culling is performed. + No face culling is performed; both the front face and back face will be visible. </constant> <constant name="FLAG_DISABLE_DEPTH_TEST" value="0" enum="Flags"> Disables the depth test, so this object is drawn on top of all others drawn before it. This puts the object in the transparent draw pass where it is sorted based on distance to camera. Objects drawn after it in the draw order may cover it. This also disables writing to depth. @@ -639,7 +641,7 @@ </constant> <constant name="FLAG_SRGB_VERTEX_COLOR" value="2" enum="Flags"> Vertex colors are considered to be stored in sRGB color space and are converted to linear color space during rendering. See also [member vertex_color_is_srgb]. - [b]Note:[/b] Only effective when using the Vulkan Clustered or Vulkan Mobile backends. + [b]Note:[/b] Only effective when using the Forward+ and Mobile rendering methods. </constant> <constant name="FLAG_USE_POINT_SIZE" value="3" enum="Flags"> Uses point size to alter the size of primitive points. Also changes the albedo texture lookup to use [code]POINT_COORD[/code] instead of [code]UV[/code]. @@ -717,7 +719,7 @@ Toon blob which changes size based on roughness. </constant> <constant name="SPECULAR_DISABLED" value="2" enum="SpecularMode"> - No specular blob. + No specular blob. This is slightly faster to render than other specular modes. </constant> <constant name="BILLBOARD_DISABLED" value="0" enum="BillboardMode"> Billboard mode is disabled. @@ -760,10 +762,10 @@ Smoothly fades the object out based on each pixel's distance from the camera using the alpha channel. </constant> <constant name="DISTANCE_FADE_PIXEL_DITHER" value="2" enum="DistanceFadeMode"> - Smoothly fades the object out based on each pixel's distance from the camera using a dither approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA]. + Smoothly fades the object out based on each pixel's distance from the camera using a dithering approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware, this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA]. </constant> <constant name="DISTANCE_FADE_OBJECT_DITHER" value="3" enum="DistanceFadeMode"> - Smoothly fades the object out based on the object's distance from the camera using a dither approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA]. + Smoothly fades the object out based on the object's distance from the camera using a dithering approach. Dithering discards pixels based on a set pattern to smoothly fade without enabling transparency. On certain hardware, this can be faster than [constant DISTANCE_FADE_PIXEL_ALPHA] and [constant DISTANCE_FADE_PIXEL_DITHER]. </constant> </constants> </class> diff --git a/doc/classes/CPUParticles3D.xml b/doc/classes/CPUParticles3D.xml index 3a15a117f5..df31fa9621 100644 --- a/doc/classes/CPUParticles3D.xml +++ b/doc/classes/CPUParticles3D.xml @@ -143,7 +143,7 @@ Maximum damping. </member> <member name="damping_min" type="float" setter="set_param_min" getter="get_param_min" default="0.0"> - Minimum damping + Minimum damping. </member> <member name="direction" type="Vector3" setter="set_direction" getter="get_direction" default="Vector3(1, 0, 0)"> Unit vector specifying the particles' emission direction. diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index 4156c9451a..6a99647e46 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -178,6 +178,7 @@ </member> <member name="zoom" type="Vector2" setter="set_zoom" getter="get_zoom" default="Vector2(1, 1)"> The camera's zoom. A zoom of [code]Vector(2, 2)[/code] doubles the size seen in the viewport. A zoom of [code]Vector(0.5, 0.5)[/code] halves the size seen in the viewport. + [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [Camera2D] zoom into account. This means that zooming in/out will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated unless the font is part of a [CanvasLayer] that makes it ignore camera zoom. To ensure text remains crisp regardless of zoom, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector. </member> </members> <constants> diff --git a/doc/classes/CameraAttributesPhysical.xml b/doc/classes/CameraAttributesPhysical.xml index a61e735932..9512fd11a8 100644 --- a/doc/classes/CameraAttributesPhysical.xml +++ b/doc/classes/CameraAttributesPhysical.xml @@ -7,6 +7,7 @@ [CameraAttributesPhysical] is used to set rendering settings based on a physically-based camera's settings. It is responsible for exposure, auto-exposure, and depth of field. When used in a [WorldEnvironment] it provides default settings for exposure, auto-exposure, and depth of field that will be used by all cameras without their own [CameraAttributes], including the editor camera. When used in a [Camera3D] it will override any [CameraAttributes] set in the [WorldEnvironment] and will override the [Camera3D]s [member Camera3D.far], [member Camera3D.near], [member Camera3D.fov], and [member Camera3D.keep_aspect] properties. When used in [VoxelGI] or [LightmapGI], only the exposure settings will be used. The default settings are intended for use in an outdoor environment, tips for settings for use in an indoor environment can be found in each setting's documentation. + [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </description> <tutorials> </tutorials> diff --git a/doc/classes/CameraAttributesPractical.xml b/doc/classes/CameraAttributesPractical.xml index 924b02fc79..cd914c9eb7 100644 --- a/doc/classes/CameraAttributesPractical.xml +++ b/doc/classes/CameraAttributesPractical.xml @@ -24,6 +24,7 @@ </member> <member name="dof_blur_far_enabled" type="bool" setter="set_dof_blur_far_enabled" getter="is_dof_blur_far_enabled" default="false"> Enables depth of field blur for objects further than [member dof_blur_far_distance]. Strength of blur is controlled by [member dof_blur_amount] and modulated by [member dof_blur_far_transition]. + [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="dof_blur_far_transition" type="float" setter="set_dof_blur_far_transition" getter="get_dof_blur_far_transition" default="5.0"> When positive, distance over which (starting from [member dof_blur_far_distance]) blur effect will scale from 0 to [member dof_blur_amount]. When negative, uses physically-based scaling so depth of field effect will scale from 0 at [member dof_blur_far_distance] and will increase in a physically accurate way as objects get further from the [Camera3D]. @@ -33,6 +34,7 @@ </member> <member name="dof_blur_near_enabled" type="bool" setter="set_dof_blur_near_enabled" getter="is_dof_blur_near_enabled" default="false"> Enables depth of field blur for objects closer than [member dof_blur_near_distance]. Strength of blur is controlled by [member dof_blur_amount] and modulated by [member dof_blur_near_transition]. + [b]Note:[/b] Depth of field blur is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="dof_blur_near_transition" type="float" setter="set_dof_blur_near_transition" getter="get_dof_blur_near_transition" default="1.0"> When positive, distance over which blur effect will scale from 0 to [member dof_blur_amount], ending at [member dof_blur_near_distance]. When negative, uses physically-based scaling so depth of field effect will scale from 0 at [member dof_blur_near_distance] and will increase in a physically accurate way as objects get closer to the [Camera3D]. diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index c3c768c12d..f99d90d32c 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -292,6 +292,7 @@ <param index="2" name="scale" type="Vector2" default="Vector2(1, 1)" /> <description> Sets a custom transform for drawing via components. Anything drawn afterwards will be transformed by this. + [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [param scale] into account. This means that scaling up/down will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated. To ensure text remains crisp regardless of scale, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector. </description> </method> <method name="draw_set_transform_matrix"> diff --git a/doc/classes/CanvasLayer.xml b/doc/classes/CanvasLayer.xml index ce999c06d3..cc8c84d082 100644 --- a/doc/classes/CanvasLayer.xml +++ b/doc/classes/CanvasLayer.xml @@ -50,7 +50,7 @@ Scales the layer when using [member follow_viewport_enabled]. Layers moving into the foreground should have increasing scales, while layers moving into the background should have decreasing scales. </member> <member name="layer" type="int" setter="set_layer" getter="get_layer" default="1"> - Layer index for draw order. Lower values are drawn first. + Layer index for draw order. Lower values are drawn behind higher values. </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2(0, 0)"> The layer's base offset. diff --git a/doc/classes/CharacterBody2D.xml b/doc/classes/CharacterBody2D.xml index 7395556d05..51cc752cae 100644 --- a/doc/classes/CharacterBody2D.xml +++ b/doc/classes/CharacterBody2D.xml @@ -71,10 +71,10 @@ print("Collided with: ", collision.collider.name) [/gdscript] [csharp] - for (int i = 0; i < GetSlideCount(); i++) + for (int i = 0; i < GetSlideCollisionCount(); i++) { KinematicCollision2D collision = GetSlideCollision(i); - GD.Print("Collided with: ", (collision.Collider as Node).Name); + GD.Print("Collided with: ", (collision.GetCollider() as Node).Name); } [/csharp] [/codeblocks] diff --git a/doc/classes/CodeEdit.xml b/doc/classes/CodeEdit.xml index df40d2a4cf..1bc214aea7 100644 --- a/doc/classes/CodeEdit.xml +++ b/doc/classes/CodeEdit.xml @@ -486,7 +486,7 @@ Sets whether line folding is allowed. </member> <member name="line_length_guidelines" type="int[]" setter="set_line_length_guidelines" getter="get_line_length_guidelines" default="[]"> - Draws vertical lines at the provided columns. The first entry is considered a main hard guideline and is draw more prominently + Draws vertical lines at the provided columns. The first entry is considered a main hard guideline and is draw more prominently. </member> <member name="symbol_lookup_on_click" type="bool" setter="set_symbol_lookup_on_click_enabled" getter="is_symbol_lookup_on_click_enabled" default="false"> Set when a validated word from [signal symbol_validate] is clicked, the [signal symbol_lookup] should be emitted. diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index cee0e3ef7d..faa658971d 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -203,18 +203,18 @@ <return type="Color" /> <param index="0" name="hex" type="int" /> <description> - Returns the [Color] associated with the provided [param hex] integer in 32-bit ARGB format (8 bits per channel, alpha channel first). + Returns the [Color] associated with the provided [param hex] integer in 32-bit RGBA format (8 bits per channel, alpha channel first). In GDScript and C#, the [int] is best visualized with hexadecimal notation ([code]"0x"[/code] prefix). [codeblocks] [gdscript] - var red = Color.hex(0xffff0000) - var dark_cyan = Color.hex(0xff008b8b) - var my_color = Color.hex(0xa4bbefd2) + var red = Color.hex(0xff0000ff) + var dark_cyan = Color.hex(0x008b8bff) + var my_color = Color.hex(0xbbefd2a4) [/gdscript] [csharp] - var red = new Color(0xffff0000); - var dark_cyan = new Color(0xff008b8b); - var my_color = new Color(0xa4bbefd2); + var red = new Color(0xff0000ff); + var dark_cyan = new Color(0x008b8bff); + var my_color = new Color(0xbbefd2a4); [/csharp] [/codeblocks] </description> @@ -223,7 +223,7 @@ <return type="Color" /> <param index="0" name="hex" type="int" /> <description> - Returns the [Color] associated with the provided [param hex] integer in 64-bit ARGB format (16 bits per channel, alpha channel first). + Returns the [Color] associated with the provided [param hex] integer in 64-bit RGBA format (16 bits per channel, alpha channel first). In GDScript and C#, the [int] is best visualized with hexadecimal notation ([code]"0x"[/code] prefix). </description> </method> diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index 7d7925d61e..f45ddf2738 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -558,7 +558,7 @@ <return type="void" /> <description> Steal the focus from another control and become the focused control (see [member focus_mode]). - [b]Note[/b]: Using this method together with [method Callable.call_deferred] makes it more reliable, especially when called inside [method Node._ready]. + [b]Note:[/b] Using this method together with [method Callable.call_deferred] makes it more reliable, especially when called inside [method Node._ready]. </description> </method> <method name="has_focus" qualifiers="const"> @@ -1007,7 +1007,8 @@ </member> <member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2(1, 1)"> The node's scale, relative to its [member size]. Change this property to scale the node around its [member pivot_offset]. The Control's [member tooltip_text] will also scale according to this value. - [b]Note:[/b] This property is mainly intended to be used for animation purposes. Text inside the Control will look pixelated or blurry when the Control is scaled. To support multiple resolutions in your project, use an appropriate viewport stretch mode as described in the [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of scaling Controls individually. + [b]Note:[/b] This property is mainly intended to be used for animation purposes. To support multiple resolutions in your project, use an appropriate viewport stretch mode as described in the [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of scaling Controls individually. + [b]Note:[/b] [member FontFile.oversampling] does [i]not[/i] take [Control] [member scale] into account. This means that scaling up/down will cause bitmap fonts and rasterized (non-MSDF) dynamic fonts to appear blurry or pixelated. To ensure text remains crisp regardless of scale, you can enable MSDF font rendering by enabling [member ProjectSettings.gui/theme/default_font_multichannel_signed_distance_field] (applies to the default project font only), or enabling [b]Multichannel Signed Distance Field[/b] in the import options of a DynamicFont for custom fonts. On system fonts, [member SystemFont.multichannel_signed_distance_field] can be enabled in the inspector. [b]Note:[/b] If the Control node is a child of a [Container] node, the scale will be reset to [code]Vector2(1, 1)[/code] when the scene is instantiated. To set the Control's scale when it's instantiated, wait for one frame using [code]await get_tree().process_frame[/code] then set its [member scale] property. </member> <member name="shortcut_context" type="Node" setter="set_shortcut_context" getter="get_shortcut_context"> diff --git a/doc/classes/Decal.xml b/doc/classes/Decal.xml index b63f6e7252..ddfa64891d 100644 --- a/doc/classes/Decal.xml +++ b/doc/classes/Decal.xml @@ -8,6 +8,7 @@ They are made of an [AABB] and a group of [Texture2D]s specifying [Color], normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals are projected within their [AABB] so altering the orientation of the Decal affects the direction in which they are projected. By default, Decals are projected down (i.e. from positive Y to negative Y). The [Texture2D]s associated with the Decal are automatically stored in a texture atlas which is used for drawing the decals so all decals can be drawn at once. Godot uses clustered decals, meaning they are stored in cluster data and drawn when the mesh is drawn, they are not drawn as a post-processing effect after. [b]Note:[/b] Decals cannot affect an underlying material's transparency, regardless of its transparency mode (alpha blend, alpha scissor, alpha hash, opaque pre-pass). This means translucent or transparent areas of a material will remain translucent or transparent even if an opaque decal is applied on them. + [b]Note:[/b] Decals are only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, only 8 decals can be displayed on each mesh resource. Attempting to display more than 8 decals on a single mesh resource will result in decals flickering in and out as the camera moves. [b]Note:[/b] When using the Mobile rendering method, decals will only correctly affect meshes whose visibility AABB intersects with the decal's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the decal may not be visible on the mesh. </description> <tutorials> @@ -87,7 +88,8 @@ [b]Note:[/b] Setting [member normal_fade] to a value greater than [code]0.0[/code] has a small performance cost due to the added normal angle computations. </member> <member name="size" type="Vector3" setter="set_size" getter="get_size" default="Vector3(2, 2, 2)"> - Sets the size of the [AABB] used by the decal. The AABB goes from [code]-size/2[/code] to [code]size/2[/code]. + Sets the size of the [AABB] used by the decal. All dimensions must be set to a value greater than zero (they will be clamped to [code]0.001[/code] if this is not the case). The AABB goes from [code]-size/2[/code] to [code]size/2[/code]. + [b]Note:[/b] To improve culling efficiency of "hard surface" decals, set their [member upper_fade] and [member lower_fade] to [code]0.0[/code] and set the Y component of the [member size] as low as possible. This will reduce the decals' AABB size without affecting their appearance. </member> <member name="texture_albedo" type="Texture2D" setter="set_texture" getter="get_texture"> [Texture2D] with the base [Color] of the Decal. Either this or the [member texture_emission] must be set for the Decal to be visible. Use the alpha channel like a mask to smoothly blend the edges of the decal with the underlying object. diff --git a/doc/classes/DirectionalLight2D.xml b/doc/classes/DirectionalLight2D.xml index f825a9e082..eb710efda2 100644 --- a/doc/classes/DirectionalLight2D.xml +++ b/doc/classes/DirectionalLight2D.xml @@ -5,6 +5,7 @@ </brief_description> <description> A directional light is a type of [Light2D] node that models an infinite number of parallel rays covering the entire scene. It is used for lights with strong intensity that are located far away from the scene (for example: to model sunlight or moonlight). + [b]Note:[/b] [DirectionalLight2D] does not support light cull masks (but it supports shadow cull masks). It will always light up 2D nodes, regardless of the 2D node's [member CanvasItem.light_mask]. </description> <tutorials> <link title="2D lights and shadows">$DOCS_URL/tutorials/2d/2d_lights_and_shadows.html</link> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index 55ba1f4f0c..fc5de1b771 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -651,7 +651,7 @@ <param index="1" name="idx" type="int" /> <param index="2" name="checkable" type="bool" /> <description> - Sets the type of the item at the specified index [param idx] to radio button. If [code]false[/code], sets the type of the item to plain text + Sets the type of the item at the specified index [param idx] to radio button. If [code]false[/code], sets the type of the item to plain text. [b]Note:[/b] This is purely cosmetic; you must add the logic for checking/unchecking items in radio groups. [b]Note:[/b] This method is implemented on macOS. </description> @@ -1453,6 +1453,7 @@ Sets the V-Sync mode of the given window. See also [member ProjectSettings.display/window/vsync/vsync_mode]. See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application. Depending on the platform and used renderer, the engine will fall back to [constant VSYNC_ENABLED] if the desired mode is not supported. + [b]Note:[/b] V-Sync modes other than [constant VSYNC_ENABLED] are only supported in the Forward+ and Mobile rendering methods, not Compatibility. </description> </method> <method name="window_set_window_buttons_offset"> @@ -1615,7 +1616,7 @@ I-beam cursor shape. This is used by default when hovering a control that accepts text input, such as [LineEdit] or [TextEdit]. </constant> <constant name="CURSOR_POINTING_HAND" value="2" enum="CursorShape"> - Pointing hand cursor shape. This is used by default when hovering a [LinkButton] or an URL tag in a [RichTextLabel].â‹… + Pointing hand cursor shape. This is used by default when hovering a [LinkButton] or an URL tag in a [RichTextLabel]. </constant> <constant name="CURSOR_CROSS" value="3" enum="CursorShape"> Crosshair cursor. This is intended to be displayed when the user needs precise aim over an element, such as a rectangle selection tool or a color picker. @@ -1744,17 +1745,17 @@ [b]Note:[/b] This flag is implemented on macOS. </constant> <constant name="VSYNC_DISABLED" value="0" enum="VSyncMode"> - No vertical synchronization, which means the engine will display frames as fast as possible (tearing may be visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]). + No vertical synchronization, which means the engine will display frames as fast as possible (tearing may be visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]). Not supported when using the Compatibility rendering method. </constant> <constant name="VSYNC_ENABLED" value="1" enum="VSyncMode"> Default vertical synchronization mode, the image is displayed only on vertical blanking intervals (no tearing is visible). Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]). </constant> <constant name="VSYNC_ADAPTIVE" value="2" enum="VSyncMode"> - Behaves like [constant VSYNC_DISABLED] when the framerate drops below the screen's refresh rate to reduce stuttering (tearing may be visible). Otherwise, vertical synchronization is enabled to avoid tearing. Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]). + Behaves like [constant VSYNC_DISABLED] when the framerate drops below the screen's refresh rate to reduce stuttering (tearing may be visible). Otherwise, vertical synchronization is enabled to avoid tearing. Framerate is limited by the monitor refresh rate (nonwithstanding [member Engine.max_fps]). Not supported when using the Compatibility rendering method. </constant> <constant name="VSYNC_MAILBOX" value="3" enum="VSyncMode"> Displays the most recent image in the queue on vertical blanking intervals, while rendering to the other images (no tearing is visible). Framerate is unlimited (nonwithstanding [member Engine.max_fps]). - Although not guaranteed, the images can be rendered as fast as possible, which may reduce input lag (also called "Fast" V-Sync mode). [constant VSYNC_MAILBOX] works best when at least twice as many frames as the display refresh rate are rendered. + Although not guaranteed, the images can be rendered as fast as possible, which may reduce input lag (also called "Fast" V-Sync mode). [constant VSYNC_MAILBOX] works best when at least twice as many frames as the display refresh rate are rendered. Not supported when using the Compatibility rendering method. </constant> <constant name="DISPLAY_HANDLE" value="0" enum="HandleType"> Display handle: diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml index d583e07f59..461ffcb2e0 100644 --- a/doc/classes/Engine.xml +++ b/doc/classes/Engine.xml @@ -244,10 +244,14 @@ </description> </method> <method name="register_script_language"> - <return type="void" /> + <return type="int" enum="Error" /> <param index="0" name="language" type="ScriptLanguage" /> <description> Registers a [ScriptLanguage] instance to be available with [code]ScriptServer[/code]. + Returns: + - [constant OK] on success + - [constant ERR_UNAVAILABLE] if [code]ScriptServer[/code] has reached it limit and cannot register any new language + - [constant ERR_ALREADY_EXISTS] if [code]ScriptServer[/code] already contains a language with similar extension/name/type </description> </method> <method name="register_singleton"> @@ -258,6 +262,16 @@ Registers the given object as a singleton, globally available under [param name]. </description> </method> + <method name="unregister_script_language"> + <return type="int" enum="Error" /> + <param index="0" name="language" type="ScriptLanguage" /> + <description> + Unregisters the [ScriptLanguage] instance from [code]ScriptServer[/code]. + Returns: + - [constant OK] on success + - [constant ERR_DOES_NOT_EXIST] if the language is already not registered in [code]ScriptServer[/code] + </description> + </method> <method name="unregister_singleton"> <return type="void" /> <param index="0" name="name" type="StringName" /> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 33b6a786ae..7ee1f2dfd4 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -46,6 +46,7 @@ </member> <member name="adjustment_enabled" type="bool" setter="set_adjustment_enabled" getter="is_adjustment_enabled" default="false"> If [code]true[/code], enables the [code]adjustment_*[/code] properties provided by this resource. If [code]false[/code], modifications to the [code]adjustment_*[/code] properties will have no effect on the rendered scene. + [b]Note:[/b] Adjustments are only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="adjustment_saturation" type="float" setter="set_adjustment_saturation" getter="get_adjustment_saturation" default="1.0"> The global color saturation value of the rendered scene (default value is 1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code]. @@ -118,6 +119,7 @@ </member> <member name="glow_enabled" type="bool" setter="set_glow_enabled" getter="is_glow_enabled" default="false"> If [code]true[/code], the glow effect is enabled. + [b]Note:[/b] Glow is only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, glow will look different due to the lower dynamic range available in the Mobile rendering method. </member> <member name="glow_hdr_luminance_cap" type="float" setter="set_glow_hdr_luminance_cap" getter="get_glow_hdr_luminance_cap" default="12.0"> The higher threshold of the HDR glow. Areas brighter than this threshold will be clamped for the purposes of the glow effect. @@ -126,10 +128,10 @@ The bleed scale of the HDR glow. </member> <member name="glow_hdr_threshold" type="float" setter="set_glow_hdr_bleed_threshold" getter="get_glow_hdr_bleed_threshold" default="1.0"> - The lower threshold of the HDR glow. When using the OpenGL renderer (which doesn't support HDR), this needs to be below [code]1.0[/code] for glow to be visible. A value of [code]0.9[/code] works well in this case. + The lower threshold of the HDR glow. When using the Mobile rendering method (which only supports a lower dynamic range up to [code]2.0[/code]), this may need to be below [code]1.0[/code] for glow to be visible. A value of [code]0.9[/code] works well in this case. This value also needs to be decreased below [code]1.0[/code] when using glow in 2D, as 2D rendering is performed in SDR. </member> <member name="glow_intensity" type="float" setter="set_glow_intensity" getter="get_glow_intensity" default="0.8"> - The overall brightness multiplier of the glow effect. When using the OpenGL renderer, this should be increased to [code]1.5[/code] to compensate for the lack of HDR rendering. + The overall brightness multiplier of the glow effect. When using the Mobile rendering method (which only supports a lower dynamic range up to [code]2.0[/code]), this should be increased to [code]1.5[/code] to compensate. </member> <member name="glow_levels/1" type="float" setter="set_glow_level" getter="get_glow_level" default="0.0"> The intensity of the 1st level of glow. This is the most "local" level (least blurry). @@ -166,7 +168,7 @@ If [code]true[/code], glow levels will be normalized so that summed together their intensities equal [code]1.0[/code]. </member> <member name="glow_strength" type="float" setter="set_glow_strength" getter="get_glow_strength" default="1.0"> - The strength of the glow effect. This applies as the glow is blurred across the screen and increases the distance and intensity of the blur. When using the OpenGL renderer, this should be increased to 1.3 to compensate for the lack of HDR rendering. + The strength of the glow effect. This applies as the glow is blurred across the screen and increases the distance and intensity of the blur. When using the Mobile rendering method, this should be increased to compensate for the lower dynamic range. </member> <member name="reflected_light_source" type="int" setter="set_reflection_source" getter="get_reflection_source" enum="Environment.ReflectionSource" default="0"> The reflected (specular) light source. @@ -184,6 +186,7 @@ </member> <member name="sdfgi_enabled" type="bool" setter="set_sdfgi_enabled" getter="is_sdfgi_enabled" default="false"> If [code]true[/code], enables signed distance field global illumination for meshes that have their [member GeometryInstance3D.gi_mode] set to [constant GeometryInstance3D.GI_MODE_STATIC]. SDFGI is a real-time global illumination technique that works well with procedurally generated and user-built levels, including in situations where geometry is created during gameplay. The signed distance field is automatically generated around the camera as it moves. Dynamic lights are supported, but dynamic occluders and emissive surfaces are not. + [b]Note:[/b] SDFGI is only supported in the Forward+ rendering method, not Mobile or Compatibility. [b]Performance:[/b] SDFGI is relatively demanding on the GPU and is not suited to low-end hardware such as integrated graphics (consider [LightmapGI] instead). To improve SDFGI performance, enable [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution] in the Project Settings. [b]Note:[/b] Meshes should have sufficiently thick walls to avoid light leaks (avoid one-sided walls). For interior levels, enclose your level geometry in a sufficiently large box and bridge the loops to close the mesh. </member> @@ -230,6 +233,7 @@ </member> <member name="ssao_enabled" type="bool" setter="set_ssao_enabled" getter="is_ssao_enabled" default="false"> If [code]true[/code], the screen-space ambient occlusion effect is enabled. This darkens objects' corners and cavities to simulate ambient light not reaching the entire object as in real life. This works well for small, dynamic objects, but baked lighting or ambient occlusion textures will do a better job at displaying ambient occlusion on large static objects. Godot uses a form of SSAO called Adaptive Screen Space Ambient Occlusion which is itself a form of Horizon Based Ambient Occlusion. + [b]Note:[/b] SSAO is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="ssao_horizon" type="float" setter="set_ssao_horizon" getter="get_ssao_horizon" default="0.06"> The threshold for considering whether a given point on a surface is occluded or not represented as an angle from the horizon mapped into the [code]0.0-1.0[/code] range. A value of [code]1.0[/code] results in no occlusion. @@ -251,6 +255,7 @@ </member> <member name="ssil_enabled" type="bool" setter="set_ssil_enabled" getter="is_ssil_enabled" default="false"> If [code]true[/code], the screen-space indirect lighting effect is enabled. Screen space indirect lighting is a form of indirect lighting that allows diffuse light to bounce between nearby objects. Screen-space indirect lighting works very similarly to screen-space ambient occlusion, in that it only affects a limited range. It is intended to be used along with a form of proper global illumination like SDFGI or [VoxelGI]. Screen-space indirect lighting is not affected by individual light's [member Light3D.light_indirect_energy]. + [b]Note:[/b] SSIL is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="ssil_intensity" type="float" setter="set_ssil_intensity" getter="get_ssil_intensity" default="1.0"> The brightness multiplier for the screen-space indirect lighting effect. A higher value will result in brighter light. @@ -269,6 +274,7 @@ </member> <member name="ssr_enabled" type="bool" setter="set_ssr_enabled" getter="is_ssr_enabled" default="false"> If [code]true[/code], screen-space reflections are enabled. Screen-space reflections are more accurate than reflections from [VoxelGI]s or [ReflectionProbe]s, but are slower and can't reflect surfaces occluded by others. + [b]Note:[/b] SSR is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="ssr_fade_in" type="float" setter="set_ssr_fade_in" getter="get_ssr_fade_in" default="0.15"> The fade-in distance for screen-space reflections. Affects the area from the reflected material to the screen-space reflection). Only positive values are valid (negative values will be clamped to [code]0.0[/code]). @@ -314,7 +320,7 @@ </member> <member name="volumetric_fog_enabled" type="bool" setter="set_volumetric_fog_enabled" getter="is_volumetric_fog_enabled" default="false"> Enables the volumetric fog effect. Volumetric fog uses a screen-aligned froxel buffer to calculate accurate volumetric scattering in the short to medium range. Volumetric fog interacts with [FogVolume]s and lights to calculate localized and global fog. Volumetric fog uses a PBR single-scattering model based on extinction, scattering, and emission which it exposes to users as density, albedo, and emission. - [b]Note:[/b] Volumetric fog is only available in the forward plus renderer. It is not available in the mobile renderer or the compatibility renderer. + [b]Note:[/b] Volumetric fog is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="volumetric_fog_gi_inject" type="float" setter="set_volumetric_fog_gi_inject" getter="get_volumetric_fog_gi_inject" default="1.0"> Scales the strength of Global Illumination used in the volumetric fog's albedo color. A value of [code]0.0[/code] means that Global Illumination will not impact the volumetric fog. [member volumetric_fog_gi_inject] has a small performance cost when set above [code]0.0[/code]. diff --git a/doc/classes/FileAccess.xml b/doc/classes/FileAccess.xml index 687a64b8ff..526f7c22e6 100644 --- a/doc/classes/FileAccess.xml +++ b/doc/classes/FileAccess.xml @@ -33,7 +33,7 @@ [/csharp] [/codeblocks] In the example above, the file will be saved in the user data folder as specified in the [url=$DOCS_URL/tutorials/io/data_paths.html]Data paths[/url] documentation. - There is no method to close a file in order to free it from use. Instead, [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly. + [FileAccess] will close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly. [codeblocks] [gdscript] var file = FileAccess.open("res://something") # File is opened and locked for use. @@ -52,6 +52,13 @@ <link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link> </tutorials> <methods> + <method name="close"> + <return type="void" /> + <description> + Closes the currently opened file and prevents subsequent read/write operations. Use flush to persist the data to disk without closing the file. + [b]Note:[/b] [FileAccess] will automatically close when it's freed, which happens when it goes out of scope or when it gets assigned with [code]null[/code]. In C# the reference must be disposed after we are done using it, this can be done with the [code]using[/code] statement or calling the [code]Dispose[/code] method directly. + </description> + </method> <method name="eof_reached" qualifiers="const"> <return type="bool" /> <description> @@ -249,6 +256,7 @@ <param index="0" name="allow_objects" type="bool" default="false" /> <description> Returns the next [Variant] value from the file. If [param allow_objects] is [code]true[/code], decoding objects is allowed. + Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method. [b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution. </description> </method> @@ -447,6 +455,7 @@ <param index="1" name="full_objects" type="bool" default="false" /> <description> Stores any Variant value in the file. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code). + Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method. [b]Note:[/b] Not all properties are included. Only properties that are configured with the [constant PROPERTY_USAGE_STORAGE] flag set will be serialized. You can add a new usage flag to a property by overriding the [method Object._get_property_list] method in your class. You can also check how property usage is configured by calling [method Object._get_property_list]. See [enum PropertyUsageFlags] for the possible usage flags. </description> </method> diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml index 761e75339a..2f1c68c322 100644 --- a/doc/classes/Font.xml +++ b/doc/classes/Font.xml @@ -238,7 +238,7 @@ <param index="5" name="direction" type="int" enum="TextServer.Direction" default="0" /> <param index="6" name="orientation" type="int" enum="TextServer.Orientation" default="0" /> <description> - Returns the size of a bounding box of a single-line string, taking kerning and advance into account. See also [method get_multiline_string_size] and [method draw_string]. + Returns the size of a bounding box of a single-line string, taking kerning, advance and subpixel positioning into account. See also [method get_multiline_string_size] and [method draw_string]. For example, to get the string size as displayed by a single-line Label, use: [codeblocks] [gdscript] @@ -249,6 +249,7 @@ Vector2 stringSize = label.GetThemeFont("font").GetStringSize(label.Text, HorizontalAlignment.Left, -1, label.GetThemeFontSize("font_size")); [/csharp] [/codeblocks] + [b]Note:[/b] Since kerning, advance and subpixel positioning are taken into account by [method get_string_size], using separate [method get_string_size] calls on substrings of a string then adding the results together will return a different result compared to using a single [method get_string_size] call on the full string. [b]Note:[/b] Real height of the string is context-dependent and can be significantly different from the value returned by [method get_height]. </description> </method> diff --git a/doc/classes/FontVariation.xml b/doc/classes/FontVariation.xml index 5bc2606adb..11286e46a4 100644 --- a/doc/classes/FontVariation.xml +++ b/doc/classes/FontVariation.xml @@ -49,7 +49,7 @@ Extra spacing at the bottom of the line in pixels. </member> <member name="spacing_glyph" type="int" setter="set_spacing" getter="get_spacing" default="0"> - Extra spacing between graphical glyphs + Extra spacing between graphical glyphs. </member> <member name="spacing_space" type="int" setter="set_spacing" getter="get_spacing" default="0"> Extra width of the space glyphs. diff --git a/doc/classes/Light2D.xml b/doc/classes/Light2D.xml index 062d532464..9f1b1af60d 100644 --- a/doc/classes/Light2D.xml +++ b/doc/classes/Light2D.xml @@ -41,7 +41,8 @@ The Light2D's energy value. The larger the value, the stronger the light. </member> <member name="range_item_cull_mask" type="int" setter="set_item_cull_mask" getter="get_item_cull_mask" default="1"> - The layer mask. Only objects with a matching mask will be affected by the Light2D. + The layer mask. Only objects with a matching [member CanvasItem.light_mask] will be affected by the Light2D. See also [member shadow_item_cull_mask], which affects which objects can cast shadows. + [b]Note:[/b] [member range_item_cull_mask] is ignored by [DirectionalLight2D], which will always light a 2D node regardless of the 2D node's [member CanvasItem.light_mask]. </member> <member name="range_layer_max" type="int" setter="set_layer_range_max" getter="get_layer_range_max" default="0"> Maximum layer value of objects that are affected by the Light2D. @@ -68,7 +69,7 @@ Smoothing value for shadows. Higher values will result in softer shadows, at the cost of visible streaks that can appear in shadow rendering. [member shadow_filter_smooth] only has an effect if [member shadow_filter] is [constant SHADOW_FILTER_PCF5] or [constant SHADOW_FILTER_PCF13]. </member> <member name="shadow_item_cull_mask" type="int" setter="set_item_shadow_cull_mask" getter="get_item_shadow_cull_mask" default="1"> - The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders with a matching light mask will cast shadows. + The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders with a matching [member CanvasItem.light_mask] will cast shadows. See also [member range_item_cull_mask], which affects which objects can [i]receive[/i] the light. </member> </members> <constants> diff --git a/doc/classes/Light3D.xml b/doc/classes/Light3D.xml index 95c39d535e..2a0b2da46c 100644 --- a/doc/classes/Light3D.xml +++ b/doc/classes/Light3D.xml @@ -54,8 +54,9 @@ If [code]true[/code], the light only appears in the editor and will not be visible at runtime. </member> <member name="light_angular_distance" type="float" setter="set_param" getter="get_param" default="0.0"> - The light's angular size in degrees. Increasing this will make shadows softer at greater distances. Only available for [DirectionalLight3D]s. For reference, the Sun from the Earth is approximately [code]0.5[/code]. + The light's angular size in degrees. Increasing this will make shadows softer at greater distances (also called percentage-closer soft shadows, or PCSS). Only available for [DirectionalLight3D]s. For reference, the Sun from the Earth is approximately [code]0.5[/code]. Increasing this value above [code]0.0[/code] for lights with shadows enabled will have a noticeable performance cost due to PCSS. [b]Note:[/b] [member light_angular_distance] is not affected by [member Node3D.scale] (the light's scale or its parent's scale). + [b]Note:[/b] PCSS for directional lights is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="light_bake_mode" type="int" setter="set_bake_mode" getter="get_bake_mode" enum="Light3D.BakeMode" default="2"> The light's bake mode. This will affect the global illumination techniques that have an effect on the light's rendering. See [enum BakeMode]. @@ -89,10 +90,12 @@ <member name="light_projector" type="Texture2D" setter="set_projector" getter="get_projector"> [Texture2D] projected by light. [member shadow_enabled] must be on for the projector to work. Light projectors make the light appear as if it is shining through a colored but transparent object, almost like light shining through stained-glass. [b]Note:[/b] Unlike [BaseMaterial3D] whose filter mode can be adjusted on a per-material basis, the filter mode for light projector textures is set globally with [member ProjectSettings.rendering/textures/light_projectors/filter]. + [b]Note:[/b] Light projector textures are only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="light_size" type="float" setter="set_param" getter="get_param" default="0.0"> - The size of the light in Godot units. Only available for [OmniLight3D]s and [SpotLight3D]s. Increasing this value will make the light fade out slower and shadows appear blurrier. This can be used to simulate area lights to an extent. + The size of the light in Godot units. Only available for [OmniLight3D]s and [SpotLight3D]s. Increasing this value will make the light fade out slower and shadows appear blurrier (also called percentage-closer soft shadows, or PCSS). This can be used to simulate area lights to an extent. Increasing this value above [code]0.0[/code] for lights with shadows enabled will have a noticeable performance cost due to PCSS. [b]Note:[/b] [member light_size] is not affected by [member Node3D.scale] (the light's scale or its parent's scale). + [b]Note:[/b] PCSS for positional lights is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="light_specular" type="float" setter="set_param" getter="get_param" default="0.5"> The intensity of the specular blob in objects affected by the light. At [code]0[/code], the light becomes a pure diffuse light. When not baking emission, this can be used to avoid unrealistic reflections when placing lights above an emissive surface. diff --git a/doc/classes/Marshalls.xml b/doc/classes/Marshalls.xml index 1eeb0be7ce..e350f3212f 100644 --- a/doc/classes/Marshalls.xml +++ b/doc/classes/Marshalls.xml @@ -29,6 +29,7 @@ <param index="1" name="allow_objects" type="bool" default="false" /> <description> Returns a decoded [Variant] corresponding to the Base64-encoded string [param base64_str]. If [param allow_objects] is [code]true[/code], decoding objects is allowed. + Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method. [b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution. </description> </method> @@ -52,6 +53,7 @@ <param index="1" name="full_objects" type="bool" default="false" /> <description> Returns a Base64-encoded string of the [Variant] [param variant]. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code). + Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method. </description> </method> </methods> diff --git a/doc/classes/NavigationAgent2D.xml b/doc/classes/NavigationAgent2D.xml index 92fd8bcc6a..c6d03fb6d8 100644 --- a/doc/classes/NavigationAgent2D.xml +++ b/doc/classes/NavigationAgent2D.xml @@ -171,6 +171,8 @@ - [code]type[/code]: Always [constant NavigationPathQueryResult2D.PATH_SEGMENT_TYPE_LINK]. - [code]rid[/code]: The [RID] of the link. - [code]owner[/code]: The object which manages the link (usually [NavigationLink2D]). + - [code]link_entry_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point the agent is entering. + - [code]link_exit_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point which the agent is exiting. </description> </signal> <signal name="navigation_finished"> diff --git a/doc/classes/NavigationAgent3D.xml b/doc/classes/NavigationAgent3D.xml index 0ed11bc477..294fe49408 100644 --- a/doc/classes/NavigationAgent3D.xml +++ b/doc/classes/NavigationAgent3D.xml @@ -174,6 +174,8 @@ - [code]type[/code]: Always [constant NavigationPathQueryResult3D.PATH_SEGMENT_TYPE_LINK]. - [code]rid[/code]: The [RID] of the link. - [code]owner[/code]: The object which manages the link (usually [NavigationLink3D]). + - [code]link_entry_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point the agent is entering. + - [code]link_exit_position[/code]: If [code]owner[/code] is available and the owner is a [NavigationLink2D], it will contain the global position of the link's point which the agent is exiting. </description> </signal> <signal name="navigation_finished"> diff --git a/doc/classes/NavigationLink2D.xml b/doc/classes/NavigationLink2D.xml index b3f4367675..3f5b1fb184 100644 --- a/doc/classes/NavigationLink2D.xml +++ b/doc/classes/NavigationLink2D.xml @@ -10,6 +10,18 @@ <link title="Using NavigationLinks">$DOCS_URL/tutorials/navigation/navigation_using_navigationlinks.html</link> </tutorials> <methods> + <method name="get_global_end_position" qualifiers="const"> + <return type="Vector2" /> + <description> + Returns the [member end_position] that is relative to the link as a global position. + </description> + </method> + <method name="get_global_start_position" qualifiers="const"> + <return type="Vector2" /> + <description> + Returns the [member start_position] that is relative to the link as a global position. + </description> + </method> <method name="get_navigation_layer_value" qualifiers="const"> <return type="bool" /> <param index="0" name="layer_number" type="int" /> @@ -17,6 +29,20 @@ Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32. </description> </method> + <method name="set_global_end_position"> + <return type="void" /> + <param index="0" name="position" type="Vector2" /> + <description> + Sets the [member end_position] that is relative to the link from a global [param position]. + </description> + </method> + <method name="set_global_start_position"> + <return type="void" /> + <param index="0" name="position" type="Vector2" /> + <description> + Sets the [member start_position] that is relative to the link from a global [param position]. + </description> + </method> <method name="set_navigation_layer_value"> <return type="void" /> <param index="0" name="layer_number" type="int" /> diff --git a/doc/classes/NavigationLink3D.xml b/doc/classes/NavigationLink3D.xml index 4dff226042..4081426dcd 100644 --- a/doc/classes/NavigationLink3D.xml +++ b/doc/classes/NavigationLink3D.xml @@ -10,6 +10,18 @@ <link title="Using NavigationLinks">$DOCS_URL/tutorials/navigation/navigation_using_navigationlinks.html</link> </tutorials> <methods> + <method name="get_global_end_position" qualifiers="const"> + <return type="Vector3" /> + <description> + Returns the [member end_position] that is relative to the link as a global position. + </description> + </method> + <method name="get_global_start_position" qualifiers="const"> + <return type="Vector3" /> + <description> + Returns the [member start_position] that is relative to the link as a global position. + </description> + </method> <method name="get_navigation_layer_value" qualifiers="const"> <return type="bool" /> <param index="0" name="layer_number" type="int" /> @@ -17,6 +29,20 @@ Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32. </description> </method> + <method name="set_global_end_position"> + <return type="void" /> + <param index="0" name="position" type="Vector3" /> + <description> + Sets the [member end_position] that is relative to the link from a global [param position]. + </description> + </method> + <method name="set_global_start_position"> + <return type="void" /> + <param index="0" name="position" type="Vector3" /> + <description> + Sets the [member start_position] that is relative to the link from a global [param position]. + </description> + </method> <method name="set_navigation_layer_value"> <return type="void" /> <param index="0" name="layer_number" type="int" /> diff --git a/doc/classes/NavigationServer2D.xml b/doc/classes/NavigationServer2D.xml index 7270a19b4d..103de8eddb 100644 --- a/doc/classes/NavigationServer2D.xml +++ b/doc/classes/NavigationServer2D.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="NavigationServer2D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Server interface for low-level 2D navigation access + Server interface for low-level 2D navigation access. </brief_description> <description> NavigationServer2D is the server responsible for all 2D navigation. It handles several objects, namely maps, regions and agents. @@ -126,6 +126,12 @@ Destroys the given RID. </description> </method> + <method name="get_debug_enabled" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] when the NavigationServer has debug enabled. + </description> + </method> <method name="get_maps" qualifiers="const"> <return type="RID[]" /> <description> @@ -520,6 +526,13 @@ Sets the [param travel_cost] for this [param region]. </description> </method> + <method name="set_debug_enabled"> + <return type="void" /> + <param index="0" name="enabled" type="bool" /> + <description> + If [code]true[/code] enables debug mode on the NavigationServer. + </description> + </method> </methods> <signals> <signal name="map_changed"> diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml index 340821d41e..0d8cb78ff9 100644 --- a/doc/classes/NavigationServer3D.xml +++ b/doc/classes/NavigationServer3D.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="NavigationServer3D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> - Server interface for low-level 3D navigation access + Server interface for low-level 3D navigation access. </brief_description> <description> NavigationServer3D is the server responsible for all 3D navigation. It handles several objects, namely maps, regions and agents. @@ -126,6 +126,12 @@ Destroys the given RID. </description> </method> + <method name="get_debug_enabled" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] when the NavigationServer has debug enabled. + </description> + </method> <method name="get_maps" qualifiers="const"> <return type="RID[]" /> <description> @@ -422,15 +428,6 @@ Sets the map up direction. </description> </method> - <method name="process"> - <return type="void" /> - <param index="0" name="delta_time" type="float" /> - <description> - Process the collision avoidance agents. - The result of this process is needed by the physics server, so this must be called in the main thread. - [b]Note:[/b] This function is not thread safe. - </description> - </method> <method name="query_path" qualifiers="const"> <return type="void" /> <param index="0" name="parameters" type="NavigationPathQueryParameters3D" /> @@ -584,6 +581,13 @@ Control activation of this server. </description> </method> + <method name="set_debug_enabled"> + <return type="void" /> + <param index="0" name="enabled" type="bool" /> + <description> + If [code]true[/code] enables debug mode on the NavigationServer. + </description> + </method> </methods> <signals> <signal name="map_changed"> diff --git a/doc/classes/NinePatchRect.xml b/doc/classes/NinePatchRect.xml index 1592718c4b..4b406385e1 100644 --- a/doc/classes/NinePatchRect.xml +++ b/doc/classes/NinePatchRect.xml @@ -68,11 +68,9 @@ </constant> <constant name="AXIS_STRETCH_MODE_TILE" value="1" enum="AxisStretchMode"> Repeats the center texture across the NinePatchRect. This won't cause any visible distortion. The texture must be seamless for this to work without displaying artifacts between edges. - [b]Note:[/b] Only supported when using the Vulkan renderer. When using the OpenGL renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH]. </constant> <constant name="AXIS_STRETCH_MODE_TILE_FIT" value="2" enum="AxisStretchMode"> Repeats the center texture across the NinePatchRect, but will also stretch the texture to make sure each tile is visible in full. This may cause the texture to be distorted, but less than [constant AXIS_STRETCH_MODE_STRETCH]. The texture must be seamless for this to work without displaying artifacts between edges. - [b]Note:[/b] Only supported when using the Vulkan renderer. When using the OpenGL renderer, this will behave like [constant AXIS_STRETCH_MODE_STRETCH]. </constant> </constants> </class> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index 1aa71113e9..c199c1aae6 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -4,7 +4,7 @@ Most basic 3D game object, parent of all 3D-related nodes. </brief_description> <description> - Most basic 3D game object, with a 3D [Transform3D] and visibility settings. All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node to move, scale, rotate and show/hide children in a 3D project. + Most basic 3D game object, with a [Transform3D] and visibility settings. All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node to move, scale, rotate and show/hide children in a 3D project. Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the [Node3D] object is set as top-level. Affine operations in this coordinate system correspond to direct affine operations on the [Node3D]'s transform. The word local below refers to this coordinate system. The coordinate system that is attached to the [Node3D] object itself is referred to as object-local coordinate system. [b]Note:[/b] Unless otherwise specified, all methods that have angle parameters must have angles specified as [i]radians[/i]. To convert degrees to radians, use [method @GlobalScope.deg_to_rad]. </description> diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml index ab7ae82875..226a1948e1 100644 --- a/doc/classes/Object.xml +++ b/doc/classes/Object.xml @@ -345,7 +345,7 @@ node.Callv(Node3D.MethodName.Rotate, new Godot.Collections.Array { new Vector3(1f, 0f, 0f), 1.571f }); [/csharp] [/codeblocks] - [b]Note:[/b] In C#, [param method] must be in snake_case when referring to built-in Godot methods. Prefer using the names exposed in the [code]MethodName[/code] class to avoid allocating a new [StringName] on each call + [b]Note:[/b] In C#, [param method] must be in snake_case when referring to built-in Godot methods. Prefer using the names exposed in the [code]MethodName[/code] class to avoid allocating a new [StringName] on each call. </description> </method> <method name="can_translate_messages" qualifiers="const"> diff --git a/doc/classes/OmniLight3D.xml b/doc/classes/OmniLight3D.xml index c0e10574c8..7c5b9aff46 100644 --- a/doc/classes/OmniLight3D.xml +++ b/doc/classes/OmniLight3D.xml @@ -5,6 +5,7 @@ </brief_description> <description> An Omnidirectional light is a type of [Light3D] that emits light in all directions. The light is attenuated by distance and this attenuation can be configured by changing its energy, radius, and attenuation parameters. + [b]Note:[/b] When using the Mobile rendering method, only 8 omni lights can be displayed on each mesh resource. Attempting to display more than 8 omni lights on a single mesh resource will result in omni lights flickering in and out as the camera moves. When using the Compatibility rendering method, only 8 omni lights can be displayed on each mesh resource by default, but this can be increased by adjusting [member ProjectSettings.rendering/limits/opengl/max_lights_per_object]. [b]Note:[/b] When using the Mobile or Compatibility rendering methods, omni lights will only correctly affect meshes whose visibility AABB intersects with the light's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the light may not be visible on the mesh. </description> <tutorials> @@ -12,7 +13,8 @@ </tutorials> <members> <member name="omni_attenuation" type="float" setter="set_param" getter="get_param" default="1.0"> - The light's attenuation (drop-off) curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve. + The light's attenuation (drop-off) curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve. Zero and negative values are allowed but can produce unusual effects. + [b]Note:[/b] Very high [member omni_attenuation] values (typically above 10) can impact performance negatively if the light is made to use a larger [member omni_range] to compensate. This is because culling opportunities will become less common and shading costs will be increased (as the light will cover more pixels on screen while resulting in the same amount of brightness). To improve performance, use the lowest [member omni_attenuation] value possible for the visuals you're trying to achieve. </member> <member name="omni_range" type="float" setter="set_param" getter="get_param" default="5.0"> The light's radius. Note that the effectively lit area may appear to be smaller depending on the [member omni_attenuation] in use. No matter the [member omni_attenuation] in use, the light will never reach anything outside this radius. diff --git a/doc/classes/PacketPeer.xml b/doc/classes/PacketPeer.xml index ab2bc34672..5dd9c5c9f9 100644 --- a/doc/classes/PacketPeer.xml +++ b/doc/classes/PacketPeer.xml @@ -33,6 +33,7 @@ <param index="0" name="allow_objects" type="bool" default="false" /> <description> Gets a Variant. If [param allow_objects] is [code]true[/code], decoding objects is allowed. + Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method. [b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution. </description> </method> @@ -49,6 +50,7 @@ <param index="1" name="full_objects" type="bool" default="false" /> <description> Sends a [Variant] as a packet. If [param full_objects] is [code]true[/code], encoding objects is allowed (and can potentially include code). + Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method. </description> </method> </methods> diff --git a/doc/classes/PhysicsDirectSpaceState3D.xml b/doc/classes/PhysicsDirectSpaceState3D.xml index cc1cf8a323..f7bc74d9ad 100644 --- a/doc/classes/PhysicsDirectSpaceState3D.xml +++ b/doc/classes/PhysicsDirectSpaceState3D.xml @@ -21,7 +21,7 @@ </description> </method> <method name="collide_shape"> - <return type="PackedVector2Array[]" /> + <return type="PackedVector3Array[]" /> <param index="0" name="parameters" type="PhysicsShapeQueryParameters3D" /> <param index="1" name="max_results" type="int" default="32" /> <description> diff --git a/doc/classes/PhysicsServer2D.xml b/doc/classes/PhysicsServer2D.xml index c3387cf6bd..1fbe77b64b 100644 --- a/doc/classes/PhysicsServer2D.xml +++ b/doc/classes/PhysicsServer2D.xml @@ -4,7 +4,14 @@ Server interface for low-level 2D physics access. </brief_description> <description> - PhysicsServer2D is the server responsible for all 2D physics. It can create many kinds of physics objects, but does not insert them on the node tree. + PhysicsServer2D is the server responsible for all 2D physics. It can directly create and manipulate all physics objects: + - A [i]space[/i] is a self-contained world for a physics simulation. It contains bodies, areas, and joints. Its state can be queried for collision and intersection information, and several parameters of the simulation can be modified. + - A [i]shape[/i] is a geometric figure such as a circle, a rectangle, a capsule, or a polygon. It can be used for collision detection by adding it to a body/area, possibly with an extra transformation relative to the body/area's origin. Bodies/areas can have multiple (transformed) shapes added to them, and a single shape can be added to bodies/areas multiple times with different local transformations. + - A [i]body[/i] is a physical object which can be in static, kinematic, or rigid mode. Its state (such as position and velocity) can be queried and updated. A force integration callback can be set to customize the body's physics. + - An [i]area[/i] is a region in space which can be used to detect bodies and areas entering and exiting it. A body monitoring callback can be set to report entering/exiting body shapes, and similarly an area monitoring callback can be set. Gravity and damping can be overridden within the area by setting area parameters. + - A [i]joint[/i] is a constraint, either between two bodies or on one body relative to a point. Parameters such as the joint bias and the rest length of a spring joint can be adjusted. + Physics objects in the physics server may be created and manipulated independently; they do not have to be tied to nodes in the scene tree. + [b]Note:[/b] All the physics nodes use the physics server internally. Adding a physics node to the scene tree will cause a corresponding physics object to be created in the physics server. A rigid body node registers a callback that updates the node's transform with the transform of the respective body object in the physics server (every physics update). An area node registers a callback to inform the area node about overlaps with the respective area object in the physics server. The raycast node queries the direct state of the relevant space in the physics server. </description> <tutorials> </tutorials> @@ -16,7 +23,7 @@ <param index="2" name="transform" type="Transform2D" default="Transform2D(1, 0, 0, 1, 0, 0)" /> <param index="3" name="disabled" type="bool" default="false" /> <description> - Adds a shape to the area, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. + Adds a shape to the area, with the given local transform. The shape (together with its [param transform] and [param disabled] properties) is added to an array of shapes, and the shapes of an area are usually referenced by their index in this array. </description> </method> <method name="area_attach_canvas_instance_id"> @@ -24,6 +31,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="id" type="int" /> <description> + Attaches the [code]ObjectID[/code] of a canvas to the area. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CanvasLayer]. </description> </method> <method name="area_attach_object_instance_id"> @@ -31,47 +39,48 @@ <param index="0" name="area" type="RID" /> <param index="1" name="id" type="int" /> <description> - Assigns the area to a descendant of [Object], so it can exist in the node tree. + Attaches the [code]ObjectID[/code] of an [Object] to the area. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CollisionObject2D]. </description> </method> <method name="area_clear_shapes"> <return type="void" /> <param index="0" name="area" type="RID" /> <description> - Removes all shapes from an area. It does not delete the shapes, so they can be reassigned later. + Removes all shapes from the area. This does not delete the shapes themselves, so they can continue to be used elsewhere or added back later. </description> </method> <method name="area_create"> <return type="RID" /> <description> - Creates an [Area2D]. After creating an [Area2D] with this method, assign it to a space using [method area_set_space] to use the created [Area2D] in the physics world. + Creates a 2D area object in the physics server, and returns the [RID] that identifies it. Use [method area_add_shape] to add shapes to it, use [method area_set_transform] to set its transform, and use [method area_set_space] to add the area to a space. </description> </method> <method name="area_get_canvas_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> <description> + Returns the [code]ObjectID[/code] of the canvas attached to the area. Use [method @GlobalScope.instance_from_id] to retrieve a [CanvasLayer] from a nonzero [code]ObjectID[/code]. </description> </method> <method name="area_get_collision_layer" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> <description> - Returns the physics layer or layers an area belongs to. + Returns the physics layer or layers the area belongs to, as a bitmask. </description> </method> <method name="area_get_collision_mask" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> <description> - Returns the physics layer or layers an area can contact with. + Returns the physics layer or layers the area can contact with, as a bitmask. </description> </method> <method name="area_get_object_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> <description> - Gets the instance ID of the object the area is assigned to. + Returns the [code]ObjectID[/code] attached to the area. Use [method @GlobalScope.instance_from_id] to retrieve an [Object] from a nonzero [code]ObjectID[/code]. </description> </method> <method name="area_get_param" qualifiers="const"> @@ -79,7 +88,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="param" type="int" enum="PhysicsServer2D.AreaParameter" /> <description> - Returns an area parameter value. See [enum AreaParameter] for a list of available parameters. + Returns the value of the given area parameter. See [enum AreaParameter] for the list of available parameters. </description> </method> <method name="area_get_shape" qualifiers="const"> @@ -87,14 +96,14 @@ <param index="0" name="area" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Returns the [RID] of the nth shape of an area. + Returns the [RID] of the shape with the given index in the area's array of shapes. </description> </method> <method name="area_get_shape_count" qualifiers="const"> <return type="int" /> <param index="0" name="area" type="RID" /> <description> - Returns the number of shapes assigned to an area. + Returns the number of shapes added to the area. </description> </method> <method name="area_get_shape_transform" qualifiers="const"> @@ -102,21 +111,21 @@ <param index="0" name="area" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Returns the transform matrix of a shape within an area. + Returns the local transform matrix of the shape with the given index in the area's array of shapes. </description> </method> <method name="area_get_space" qualifiers="const"> <return type="RID" /> <param index="0" name="area" type="RID" /> <description> - Returns the space assigned to the area. + Returns the [RID] of the space assigned to the area. Returns [code]RID()[/code] if no space is assigned. </description> </method> <method name="area_get_transform" qualifiers="const"> <return type="Transform2D" /> <param index="0" name="area" type="RID" /> <description> - Returns the transform matrix for an area. + Returns the transform matrix of the area. </description> </method> <method name="area_remove_shape"> @@ -124,7 +133,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Removes a shape from an area. It does not delete the shape, so it can be reassigned later. + Removes the shape with the given index from the area's array of shapes. The shape itself is not deleted, so it can continue to be used elsewhere or added back later. As a result of this operation, the area's shapes which used to have indices higher than [param shape_idx] will have their index decreased by one. </description> </method> <method name="area_set_area_monitor_callback"> @@ -132,6 +141,13 @@ <param index="0" name="area" type="RID" /> <param index="1" name="callback" type="Callable" /> <description> + Sets the area's area monitor callback. This callback will be called when any other (shape of an) area enters or exits (a shape of) the given area, and must take the following five parameters: + 1. an integer [code]status[/code]: either [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED] depending on whether the other area's shape entered or exited the area, + 2. an [RID] [code]area_rid[/code]: the [RID] of the other area that entered or exited the area, + 3. an integer [code]instance_id[/code]: the [code]ObjectID[/code] attached to the other area, + 4. an integer [code]area_shape_idx[/code]: the index of the shape of the other area that entered or exited the area, + 5. an integer [code]self_shape_idx[/code]: the index of the shape of the area where the other area entered or exited. + By counting (or keeping track of) the shapes that enter and exit, it can be determined if an area (with all its shapes) is entering for the first time or exiting for the last time. </description> </method> <method name="area_set_collision_layer"> @@ -139,7 +155,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="layer" type="int" /> <description> - Assigns the area to one or many physics layers. + Assigns the area to one or many physics layers, via a bitmask. </description> </method> <method name="area_set_collision_mask"> @@ -147,7 +163,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="mask" type="int" /> <description> - Sets which physics layers the area will monitor. + Sets which physics layers the area will monitor, via a bitmask. </description> </method> <method name="area_set_monitor_callback"> @@ -155,12 +171,13 @@ <param index="0" name="area" type="RID" /> <param index="1" name="callback" type="Callable" /> <description> - Sets the function to call when any body/area enters or exits the area. This callback will be called for any object interacting with the area, and takes five parameters: - 1: [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED], depending on whether the object entered or exited the area. - 2: [RID] of the object that entered/exited the area. - 3: Instance ID of the object that entered/exited the area. - 4: The shape index of the object that entered/exited the area. - 5: The shape index of the area where the object entered/exited. + Sets the area's body monitor callback. This callback will be called when any other (shape of a) body enters or exits (a shape of) the given area, and must take the following five parameters: + 1. an integer [code]status[/code]: either [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED] depending on whether the other body shape entered or exited the area, + 2. an [RID] [code]body_rid[/code]: the [RID] of the body that entered or exited the area, + 3. an integer [code]instance_id[/code]: the [code]ObjectID[/code] attached to the body, + 4. an integer [code]body_shape_idx[/code]: the index of the shape of the body that entered or exited the area, + 5. an integer [code]self_shape_idx[/code]: the index of the shape of the area where the body entered or exited. + By counting (or keeping track of) the shapes that enter and exit, it can be determined if a body (with all its shapes) is entering for the first time or exiting for the last time. </description> </method> <method name="area_set_monitorable"> @@ -168,6 +185,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="monitorable" type="bool" /> <description> + Sets whether the area is monitorable or not. If [param monitorable] is [code]true[/code], the area monitoring callback of other areas will be called when this area enters or exits them. </description> </method> <method name="area_set_param"> @@ -176,7 +194,7 @@ <param index="1" name="param" type="int" enum="PhysicsServer2D.AreaParameter" /> <param index="2" name="value" type="Variant" /> <description> - Sets the value for an area parameter. See [enum AreaParameter] for a list of available parameters. + Sets the value of the given area parameter. See [enum AreaParameter] for the list of available parameters. </description> </method> <method name="area_set_shape"> @@ -185,7 +203,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="shape" type="RID" /> <description> - Substitutes a given area shape by another. The old shape is selected by its index, the new one by its [RID]. + Replaces the area's shape at the given index by another shape, while not affecting the [code]transform[/code] and [code]disabled[/code] properties at the same index. </description> </method> <method name="area_set_shape_disabled"> @@ -194,7 +212,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="disabled" type="bool" /> <description> - Disables a given shape in an area. + Sets the disabled property of the area's shape with the given index. If [param disabled] is [code]true[/code], then the shape will not detect any other shapes entering or exiting it. </description> </method> <method name="area_set_shape_transform"> @@ -203,7 +221,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="transform" type="Transform2D" /> <description> - Sets the transform matrix for an area shape. + Sets the local transform matrix of the area's shape with the given index. </description> </method> <method name="area_set_space"> @@ -211,7 +229,8 @@ <param index="0" name="area" type="RID" /> <param index="1" name="space" type="RID" /> <description> - Assigns a space to the area. + Adds the area to the given space, after removing the area from the previously assigned space (if any). + [b]Note:[/b] To remove an area from a space without immediately adding it back elsewhere, use [code]PhysicsServer2D.area_set_space(area, RID())[/code]. </description> </method> <method name="area_set_transform"> @@ -219,7 +238,7 @@ <param index="0" name="area" type="RID" /> <param index="1" name="transform" type="Transform2D" /> <description> - Sets the transform matrix for an area. + Sets the transform matrix of the area. </description> </method> <method name="body_add_collision_exception"> @@ -227,7 +246,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="excepted_body" type="RID" /> <description> - Adds a body to the list of bodies exempt from collisions. + Adds [param excepted_body] to the body's list of collision exceptions, so that collisions with it are ignored. </description> </method> <method name="body_add_constant_central_force"> @@ -235,7 +254,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="force" type="Vector2" /> <description> - Adds a constant directional force without affecting rotation that keeps being applied over time until cleared with [code]body_set_constant_force(body, Vector2(0, 0))[/code]. + Adds a constant directional force to the body. The force does not affect rotation. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))[/code]. This is equivalent to using [method body_add_constant_force] at the body's center of mass. </description> </method> @@ -245,7 +264,7 @@ <param index="1" name="force" type="Vector2" /> <param index="2" name="position" type="Vector2" default="Vector2(0, 0)" /> <description> - Adds a constant positioned force to the body that keeps being applied over time until cleared with [code]body_set_constant_force(body, Vector2(0, 0))[/code]. + Adds a constant positioned force to the body. The force can affect rotation if [param position] is different from the body's center of mass. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_force(body, Vector2(0, 0))[/code]. [param position] is the offset from the body origin in global coordinates. </description> </method> @@ -254,7 +273,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="torque" type="float" /> <description> - Adds a constant rotational force without affecting position that keeps being applied over time until cleared with [code]body_set_constant_torque(body, 0)[/code]. + Adds a constant rotational force to the body. The force does not affect position. The force remains applied over time until cleared with [code]PhysicsServer2D.body_set_constant_torque(body, 0)[/code]. </description> </method> <method name="body_add_shape"> @@ -264,7 +283,7 @@ <param index="2" name="transform" type="Transform2D" default="Transform2D(1, 0, 0, 1, 0, 0)" /> <param index="3" name="disabled" type="bool" default="false" /> <description> - Adds a shape to the body, along with a transform matrix. Shapes are usually referenced by their index, so you should track which shape has a given index. + Adds a shape to the area, with the given local transform. The shape (together with its [param transform] and [param disabled] properties) is added to an array of shapes, and the shapes of a body are usually referenced by their index in this array. </description> </method> <method name="body_apply_central_force"> @@ -272,7 +291,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="force" type="Vector2" /> <description> - Applies a directional force without affecting rotation. A force is time dependent and meant to be applied every physics update. + Applies a directional force to the body, at the body's center of mass. The force does not affect rotation. A force is time dependent and meant to be applied every physics update. This is equivalent to using [method body_apply_force] at the body's center of mass. </description> </method> @@ -281,7 +300,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="impulse" type="Vector2" /> <description> - Applies a directional impulse without affecting rotation. + Applies a directional impulse to the body, at the body's center of mass. The impulse does not affect rotation. An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise). This is equivalent to using [method body_apply_impulse] at the body's center of mass. </description> @@ -292,7 +311,7 @@ <param index="1" name="force" type="Vector2" /> <param index="2" name="position" type="Vector2" default="Vector2(0, 0)" /> <description> - Applies a positioned force to the body. A force is time dependent and meant to be applied every physics update. + Applies a positioned force to the body. The force can affect rotation if [param position] is different from the body's center of mass. A force is time dependent and meant to be applied every physics update. [param position] is the offset from the body origin in global coordinates. </description> </method> @@ -302,7 +321,7 @@ <param index="1" name="impulse" type="Vector2" /> <param index="2" name="position" type="Vector2" default="Vector2(0, 0)" /> <description> - Applies a positioned impulse to the body. + Applies a positioned impulse to the body. The impulse can affect rotation if [param position] is different from the body's center of mass. An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise). [param position] is the offset from the body origin in global coordinates. </description> @@ -312,7 +331,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="torque" type="float" /> <description> - Applies a rotational force without affecting position. A force is time dependent and meant to be applied every physics update. + Applies a rotational force to the body. The force does not affect position. A force is time dependent and meant to be applied every physics update. </description> </method> <method name="body_apply_torque_impulse"> @@ -320,7 +339,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="impulse" type="float" /> <description> - Applies a rotational impulse to the body without affecting the position. + Applies a rotational impulse to the body. The impulse does not affect position. An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_force" functions otherwise). </description> </method> @@ -329,6 +348,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="id" type="int" /> <description> + Attaches the [code]ObjectID[/code] of a canvas to the body. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CanvasLayer]. </description> </method> <method name="body_attach_object_instance_id"> @@ -336,54 +356,55 @@ <param index="0" name="body" type="RID" /> <param index="1" name="id" type="int" /> <description> - Assigns the area to a descendant of [Object], so it can exist in the node tree. + Attaches the [code]ObjectID[/code] of an [Object] to the body. Use [method Object.get_instance_id] to get the [code]ObjectID[/code] of a [CollisionObject2D]. </description> </method> <method name="body_clear_shapes"> <return type="void" /> <param index="0" name="body" type="RID" /> <description> - Removes all shapes from a body. + Removes all shapes from the body. This does not delete the shapes themselves, so they can continue to be used elsewhere or added back later. </description> </method> <method name="body_create"> <return type="RID" /> <description> - Creates a physics body. + Creates a 2D body object in the physics server, and returns the [RID] that identifies it. Use [method body_add_shape] to add shapes to it, use [method body_set_state] to set its transform, and use [method body_set_space] to add the body to a space. </description> </method> <method name="body_get_canvas_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> + Returns the [code]ObjectID[/code] of the canvas attached to the body. Use [method @GlobalScope.instance_from_id] to retrieve a [CanvasLayer] from a nonzero [code]ObjectID[/code]. </description> </method> <method name="body_get_collision_layer" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> - Returns the physics layer or layers a body belongs to. + Returns the physics layer or layers the body belongs to, as a bitmask. </description> </method> <method name="body_get_collision_mask" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> - Returns the physics layer or layers a body can collide with. + Returns the physics layer or layers the body can collide with, as a bitmask. </description> </method> <method name="body_get_collision_priority" qualifiers="const"> <return type="float" /> <param index="0" name="body" type="RID" /> <description> - Returns the body's collision priority. + Returns the body's collision priority. This is used in the depenetration phase of [method body_test_motion]. The higher the priority is, the lower the penetration into the body will be. </description> </method> <method name="body_get_constant_force" qualifiers="const"> <return type="Vector2" /> <param index="0" name="body" type="RID" /> <description> - Returns the body's total constant positional forces applied during each physics update. + Returns the body's total constant positional force applied during each physics update. See [method body_add_constant_force] and [method body_add_constant_central_force]. </description> </method> @@ -391,7 +412,7 @@ <return type="float" /> <param index="0" name="body" type="RID" /> <description> - Returns the body's total constant rotational forces applied during each physics update. + Returns the body's total constant rotational force applied during each physics update. See [method body_add_constant_torque]. </description> </method> @@ -399,35 +420,35 @@ <return type="int" enum="PhysicsServer2D.CCDMode" /> <param index="0" name="body" type="RID" /> <description> - Returns the continuous collision detection mode. + Returns the body's continuous collision detection mode (see [enum CCDMode]). </description> </method> <method name="body_get_direct_state"> <return type="PhysicsDirectBodyState2D" /> <param index="0" name="body" type="RID" /> <description> - Returns the [PhysicsDirectBodyState2D] of the body. Returns [code]null[/code] if the body is destroyed or removed from the physics space. + Returns the [PhysicsDirectBodyState2D] of the body. Returns [code]null[/code] if the body is destroyed or not assigned to a space. </description> </method> <method name="body_get_max_contacts_reported" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> - Returns the maximum contacts that can be reported. See [method body_set_max_contacts_reported]. + Returns the maximum number of contacts that the body can report. See [method body_set_max_contacts_reported]. </description> </method> <method name="body_get_mode" qualifiers="const"> <return type="int" enum="PhysicsServer2D.BodyMode" /> <param index="0" name="body" type="RID" /> <description> - Returns the body mode. + Returns the body's mode (see [enum BodyMode]). </description> </method> <method name="body_get_object_instance_id" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> - Gets the instance ID of the object the area is assigned to. + Returns the [code]ObjectID[/code] attached to the body. Use [method @GlobalScope.instance_from_id] to retrieve an [Object] from a nonzero [code]ObjectID[/code]. </description> </method> <method name="body_get_param" qualifiers="const"> @@ -435,7 +456,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="param" type="int" enum="PhysicsServer2D.BodyParameter" /> <description> - Returns the value of a body parameter. See [enum BodyParameter] for a list of available parameters. + Returns the value of the given body parameter. See [enum BodyParameter] for the list of available parameters. </description> </method> <method name="body_get_shape" qualifiers="const"> @@ -443,14 +464,14 @@ <param index="0" name="body" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Returns the [RID] of the nth shape of a body. + Returns the [RID] of the shape with the given index in the body's array of shapes. </description> </method> <method name="body_get_shape_count" qualifiers="const"> <return type="int" /> <param index="0" name="body" type="RID" /> <description> - Returns the number of shapes assigned to a body. + Returns the number of shapes added to the body. </description> </method> <method name="body_get_shape_transform" qualifiers="const"> @@ -458,14 +479,14 @@ <param index="0" name="body" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Returns the transform matrix of a body shape. + Returns the local transform matrix of the shape with the given index in the area's array of shapes. </description> </method> <method name="body_get_space" qualifiers="const"> <return type="RID" /> <param index="0" name="body" type="RID" /> <description> - Returns the [RID] of the space assigned to a body. + Returns the [RID] of the space assigned to the body. Returns [code]RID()[/code] if no space is assigned. </description> </method> <method name="body_get_state" qualifiers="const"> @@ -473,14 +494,14 @@ <param index="0" name="body" type="RID" /> <param index="1" name="state" type="int" enum="PhysicsServer2D.BodyState" /> <description> - Returns a body state. + Returns the value of the given state of the body. See [enum BodyState] for the list of available states. </description> </method> <method name="body_is_omitting_force_integration" qualifiers="const"> <return type="bool" /> <param index="0" name="body" type="RID" /> <description> - Returns whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). + Returns [code]true[/code] if the body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_remove_collision_exception"> @@ -488,7 +509,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="excepted_body" type="RID" /> <description> - Removes a body from the list of bodies exempt from collisions. + Removes [param excepted_body] from the body's list of collision exceptions, so that collisions with it are no longer ignored. </description> </method> <method name="body_remove_shape"> @@ -496,14 +517,14 @@ <param index="0" name="body" type="RID" /> <param index="1" name="shape_idx" type="int" /> <description> - Removes a shape from a body. The shape is not deleted, so it can be reused afterwards. + Removes the shape with the given index from the body's array of shapes. The shape itself is not deleted, so it can continue to be used elsewhere or added back later. As a result of this operation, the body's shapes which used to have indices higher than [param shape_idx] will have their index decreased by one. </description> </method> <method name="body_reset_mass_properties"> <return type="void" /> <param index="0" name="body" type="RID" /> <description> - Restores the default inertia and center of mass based on shapes to cancel any custom values previously set using [method body_set_param]. + Restores the default inertia and center of mass of the body based on its shapes. This undoes any custom values previously set using [method body_set_param]. </description> </method> <method name="body_set_axis_velocity"> @@ -511,7 +532,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="axis_velocity" type="Vector2" /> <description> - Sets an axis velocity. The velocity in the given vector axis will be set as the given vector length. This is useful for jumping behavior. + Modifies the body's linear velocity so that its projection to the axis [code]axis_velocity.normalized()[/code] is exactly [code]axis_velocity.length()[/code]. This is useful for jumping behavior. </description> </method> <method name="body_set_collision_layer"> @@ -519,7 +540,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="layer" type="int" /> <description> - Sets the physics layer or layers a body belongs to. + Sets the physics layer or layers the body belongs to, via a bitmask. </description> </method> <method name="body_set_collision_mask"> @@ -527,7 +548,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="mask" type="int" /> <description> - Sets the physics layer or layers a body can collide with. + Sets the physics layer or layers the body can collide with, via a bitmask. </description> </method> <method name="body_set_collision_priority"> @@ -535,7 +556,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="priority" type="float" /> <description> - Sets the body's collision priority. + Sets the body's collision priority. This is used in the depenetration phase of [method body_test_motion]. The higher the priority is, the lower the penetration into the body will be. </description> </method> <method name="body_set_constant_force"> @@ -543,7 +564,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="force" type="Vector2" /> <description> - Sets the body's total constant positional forces applied during each physics update. + Sets the body's total constant positional force applied during each physics update. See [method body_add_constant_force] and [method body_add_constant_central_force]. </description> </method> @@ -552,7 +573,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="torque" type="float" /> <description> - Sets the body's total constant rotational forces applied during each physics update. + Sets the body's total constant rotational force applied during each physics update. See [method body_add_constant_torque]. </description> </method> @@ -562,7 +583,7 @@ <param index="1" name="mode" type="int" enum="PhysicsServer2D.CCDMode" /> <description> Sets the continuous collision detection mode using one of the [enum CCDMode] constants. - Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided. + Continuous collision detection tries to predict where a moving body would collide in between physics updates, instead of moving it and correcting its movement if it collided. </description> </method> <method name="body_set_force_integration_callback"> @@ -571,10 +592,11 @@ <param index="1" name="callable" type="Callable" /> <param index="2" name="userdata" type="Variant" default="null" /> <description> - Sets the function used to calculate physics for an object, if that object allows it (see [method body_set_omit_force_integration]). - The force integration function takes 2 arguments: - [code]state:[/code] [PhysicsDirectBodyState2D] used to retrieve and modify the body's state. - [code]userdata:[/code] Optional user data, if it was passed when calling [code]body_set_force_integration_callback[/code]. + Sets the function used to calculate physics for the body, if that body allows it (see [method body_set_omit_force_integration]). + The force integration function takes the following two parameters: + 1. a [PhysicsDirectBodyState2D] [code]state[/code]: used to retrieve and modify the body's state, + 2. a [Variant] [code]userdata[/code]: optional user data. + [b]Note:[/b] This callback is currently not called in Godot Physics. </description> </method> <method name="body_set_max_contacts_reported"> @@ -582,7 +604,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="amount" type="int" /> <description> - Sets the maximum contacts to report. Bodies can keep a log of the contacts with other bodies. This is enabled by setting the maximum number of contacts reported to a number greater than 0. + Sets the maximum number of contacts that the body can report. If [param amount] is greater than zero, then the body will keep track of at most this many contacts with other bodies. </description> </method> <method name="body_set_mode"> @@ -590,7 +612,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="mode" type="int" enum="PhysicsServer2D.BodyMode" /> <description> - Sets the body mode using one of the [enum BodyMode] constants. + Sets the body's mode. See [enum BodyMode] for the list of available modes. </description> </method> <method name="body_set_omit_force_integration"> @@ -598,7 +620,7 @@ <param index="0" name="body" type="RID" /> <param index="1" name="enable" type="bool" /> <description> - Sets whether a body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). + Sets whether the body uses a callback function to calculate its own physics (see [method body_set_force_integration_callback]). </description> </method> <method name="body_set_param"> @@ -607,7 +629,7 @@ <param index="1" name="param" type="int" enum="PhysicsServer2D.BodyParameter" /> <param index="2" name="value" type="Variant" /> <description> - Sets a body parameter. See [enum BodyParameter] for a list of available parameters. + Sets the value of the given body parameter. See [enum BodyParameter] for the list of available parameters. </description> </method> <method name="body_set_shape"> @@ -616,7 +638,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="shape" type="RID" /> <description> - Substitutes a given body shape by another. The old shape is selected by its index, the new one by its [RID]. + Replaces the body's shape at the given index by another shape, while not affecting the [code]transform[/code], [code]disabled[/code], and one-way collision properties at the same index. </description> </method> <method name="body_set_shape_as_one_way_collision"> @@ -626,7 +648,7 @@ <param index="2" name="enable" type="bool" /> <param index="3" name="margin" type="float" /> <description> - Enables one way collision on body if [param enable] is [code]true[/code]. + Sets the one-way collision properties of the body's shape with the given index. If [param enable] is [code]true[/code], the one-way collision direction given by the shape's local upward axis [code]body_get_shape_transform(body, shape_idx).y[/code] will be used to ignore collisions with the shape in the opposite direction, and to ensure depenetration of kinematic bodies happens in this direction. </description> </method> <method name="body_set_shape_disabled"> @@ -635,7 +657,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="disabled" type="bool" /> <description> - Disables shape in body if [param disabled] is [code]true[/code]. + Sets the disabled property of the body's shape with the given index. If [param disabled] is [code]true[/code], then the shape will be ignored in all collision detection. </description> </method> <method name="body_set_shape_transform"> @@ -644,7 +666,7 @@ <param index="1" name="shape_idx" type="int" /> <param index="2" name="transform" type="Transform2D" /> <description> - Sets the transform matrix for a body shape. + Sets the local transform matrix of the body's shape with the given index. </description> </method> <method name="body_set_space"> @@ -652,7 +674,10 @@ <param index="0" name="body" type="RID" /> <param index="1" name="space" type="RID" /> <description> - Assigns a space to the body (see [method space_create]). + Adds the body to the given space, after removing the body from the previously assigned space (if any). If the body's mode is set to [constant BODY_MODE_RIGID], then adding the body to a space will have the following additional effects: + - If the parameter [constant BODY_PARAM_CENTER_OF_MASS] has never been set explicitly, then the value of that parameter will be recalculated based on the body's shapes. + - If the parameter [constant BODY_PARAM_INERTIA] is set to a value [code]<= 0.0[/code], then the value of that parameter will be recalculated based on the body's shapes, mass, and center of mass. + [b]Note:[/b] To remove a body from a space without immediately adding it back elsewhere, use [code]PhysicsServer2D.body_set_space(body, RID())[/code]. </description> </method> <method name="body_set_state"> @@ -661,8 +686,8 @@ <param index="1" name="state" type="int" enum="PhysicsServer2D.BodyState" /> <param index="2" name="value" type="Variant" /> <description> - Sets a body state using one of the [enum BodyState] constants. - Note that the method doesn't take effect immediately. The state will change on the next physics frame. + Sets the value of a body's state. See [enum BodyState] for the list of available states. + [b]Note:[/b] The state change doesn't take effect immediately. The state will change on the next physics frame. </description> </method> <method name="body_test_motion"> @@ -671,27 +696,31 @@ <param index="1" name="parameters" type="PhysicsTestMotionParameters2D" /> <param index="2" name="result" type="PhysicsTestMotionResult2D" default="null" /> <description> - Returns [code]true[/code] if a collision would result from moving along a motion vector from a given point in space. [PhysicsTestMotionParameters2D] is passed to set motion parameters. [PhysicsTestMotionResult2D] can be passed to return additional information. + Returns [code]true[/code] if a collision would result from moving the body along a motion vector from a given point in space. See [PhysicsTestMotionParameters2D] for the available motion parameters. Optionally a [PhysicsTestMotionResult2D] object can be passed, which will be used to store the information about the resulting collision. </description> </method> <method name="capsule_shape_create"> <return type="RID" /> <description> + Creates a 2D capsule shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the capsule's height and radius. </description> </method> <method name="circle_shape_create"> <return type="RID" /> <description> + Creates a 2D circle shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the circle's radius. </description> </method> <method name="concave_polygon_shape_create"> <return type="RID" /> <description> + Creates a 2D concave polygon shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the concave polygon's segments. </description> </method> <method name="convex_polygon_shape_create"> <return type="RID" /> <description> + Creates a 2D convex polygon shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the convex polygon's points. </description> </method> <method name="damped_spring_joint_get_param" qualifiers="const"> @@ -699,7 +728,7 @@ <param index="0" name="joint" type="RID" /> <param index="1" name="param" type="int" enum="PhysicsServer2D.DampedSpringParam" /> <description> - Returns the value of a damped spring joint parameter. See [enum DampedSpringParam] for a list of available parameters. + Returns the value of the given damped spring joint parameter. See [enum DampedSpringParam] for the list of available parameters. </description> </method> <method name="damped_spring_joint_set_param"> @@ -708,32 +737,34 @@ <param index="1" name="param" type="int" enum="PhysicsServer2D.DampedSpringParam" /> <param index="2" name="value" type="float" /> <description> - Sets a damped spring joint parameter. See [enum DampedSpringParam] for a list of available parameters. + Sets the value of the given damped spring joint parameter. See [enum DampedSpringParam] for the list of available parameters. </description> </method> <method name="free_rid"> <return type="void" /> <param index="0" name="rid" type="RID" /> <description> - Destroys any of the objects created by PhysicsServer2D. If the [RID] passed is not one of the objects that can be created by PhysicsServer2D, an error will be sent to the console. + Destroys any of the objects created by PhysicsServer2D. If the [RID] passed is not one of the objects that can be created by PhysicsServer2D, an error will be printed to the console. </description> </method> <method name="get_process_info"> <return type="int" /> <param index="0" name="process_info" type="int" enum="PhysicsServer2D.ProcessInfo" /> <description> - Returns information about the current state of the 2D physics engine. See [enum ProcessInfo] for a list of available states. + Returns information about the current state of the 2D physics engine. See [enum ProcessInfo] for the list of available states. </description> </method> <method name="joint_clear"> <return type="void" /> <param index="0" name="joint" type="RID" /> <description> + Destroys the joint with the given [RID], creates a new uninitialized joint, and makes the [RID] refer to this new joint. </description> </method> <method name="joint_create"> <return type="RID" /> <description> + Creates a 2D joint in the physics server, and returns the [RID] that identifies it. To set the joint type, use [method joint_make_damped_spring], [method joint_make_groove] or [method joint_make_pin]. Use [method joint_set_param] to set generic joint parameters. </description> </method> <method name="joint_disable_collisions_between_bodies"> @@ -749,14 +780,14 @@ <param index="0" name="joint" type="RID" /> <param index="1" name="param" type="int" enum="PhysicsServer2D.JointParam" /> <description> - Returns the value of a joint parameter. + Returns the value of the given joint parameter. See [enum JointParam] for the list of available parameters. </description> </method> <method name="joint_get_type" qualifiers="const"> <return type="int" enum="PhysicsServer2D.JointType" /> <param index="0" name="joint" type="RID" /> <description> - Returns a joint's type (see [enum JointType]). + Returns the joint's type (see [enum JointType]). </description> </method> <method name="joint_is_disabled_collisions_between_bodies" qualifiers="const"> @@ -774,6 +805,7 @@ <param index="3" name="body_a" type="RID" /> <param index="4" name="body_b" type="RID" /> <description> + Makes the joint a damped spring joint, attached at the point [param anchor_a] (given in global coordinates) on the body [param body_a] and at the point [param anchor_b] (given in global coordinates) on the body [param body_b]. To set the parameters which are specific to the damped spring, see [method damped_spring_joint_set_param]. </description> </method> <method name="joint_make_groove"> @@ -785,6 +817,7 @@ <param index="4" name="body_a" type="RID" /> <param index="5" name="body_b" type="RID" /> <description> + Makes the joint a groove joint. </description> </method> <method name="joint_make_pin"> @@ -794,6 +827,7 @@ <param index="2" name="body_a" type="RID" /> <param index="3" name="body_b" type="RID" /> <description> + Makes the joint a pin joint. If [param body_b] is [code]RID()[/code], then [param body_a] is pinned to the point [param anchor] (given in global coordinates); otherwise, [param body_a] is pinned to [param body_b] at the point [param anchor] (given in global coordinates). To set the parameters which are specific to the pin joint, see [method pin_joint_set_param]. </description> </method> <method name="joint_set_param"> @@ -802,7 +836,7 @@ <param index="1" name="param" type="int" enum="PhysicsServer2D.JointParam" /> <param index="2" name="value" type="float" /> <description> - Sets a joint parameter. See [enum JointParam] for a list of available parameters. + Sets the value of the given joint parameter. See [enum JointParam] for the list of available parameters. </description> </method> <method name="pin_joint_get_param" qualifiers="const"> @@ -825,37 +859,40 @@ <method name="rectangle_shape_create"> <return type="RID" /> <description> + Creates a 2D rectangle shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the rectangle's half-extents. </description> </method> <method name="segment_shape_create"> <return type="RID" /> <description> + Creates a 2D segment shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the segment's start and end points. </description> </method> <method name="separation_ray_shape_create"> <return type="RID" /> <description> + Creates a 2D separation ray shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the shape's [code]length[/code] and [code]slide_on_slope[/code] properties. </description> </method> <method name="set_active"> <return type="void" /> <param index="0" name="active" type="bool" /> <description> - Activates or deactivates the 2D physics engine. + Activates or deactivates the 2D physics server. If [param active] is [code]false[/code], then the physics server will not do anything in its physics step. </description> </method> <method name="shape_get_data" qualifiers="const"> <return type="Variant" /> <param index="0" name="shape" type="RID" /> <description> - Returns the shape data. + Returns the shape data that defines the configuration of the shape, such as the half-extents of a rectangle or the segments of a concave shape. See [method shape_set_data] for the precise format of this data in each case. </description> </method> <method name="shape_get_type" qualifiers="const"> <return type="int" enum="PhysicsServer2D.ShapeType" /> <param index="0" name="shape" type="RID" /> <description> - Returns a shape's type (see [enum ShapeType]). + Returns the shape's type (see [enum ShapeType]). </description> </method> <method name="shape_set_data"> @@ -863,20 +900,29 @@ <param index="0" name="shape" type="RID" /> <param index="1" name="data" type="Variant" /> <description> - Sets the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type]. + Sets the shape data that defines the configuration of the shape. The [param data] to be passed depends on the shape's type (see [method shape_get_type]): + - [constant SHAPE_WORLD_BOUNDARY]: an array of length two containing a [Vector2] [code]normal[/code] direction and a [code]float[/code] distance [code]d[/code], + - [constant SHAPE_SEPARATION_RAY]: a dictionary containing the key [code]length[/code] with a [code]float[/code] value and the key [code]slide_on_slope[/code] with a [code]bool[/code] value, + - [constant SHAPE_SEGMENT]: a [Rect2] [code]rect[/code] containing the first point of the segment in [code]rect.position[/code] and the second point of the segment in [code]rect.size[/code], + - [constant SHAPE_CIRCLE]: a [code]float[/code] [code]radius[/code], + - [constant SHAPE_RECTANGLE]: a [Vector2] [code]half_extents[/code], + - [constant SHAPE_CAPSULE]: an array of length two (or a [Vector2]) containing a [code]float[/code] [code]height[/code] and a [code]float[/code] [code]radius[/code], + - [constant SHAPE_CONVEX_POLYGON]: either a [PackedVector2Array] of points defining a convex polygon in counterclockwise order (the clockwise outward normal of each segment formed by consecutive points is calculated internally), or a [PackedFloat32Array] of length divisible by four so that every 4-tuple of [code]float[/code]s contains the coordinates of a point followed by the coordinates of the clockwise outward normal vector to the segment between the current point and the next point, + - [constant SHAPE_CONCAVE_POLYGON]: a [PackedVector2Array] of length divisible by two (each pair of points forms one segment). + [b]Warning[/b]: In the case of [constant SHAPE_CONVEX_POLYGON], this method does not check if the points supplied actually form a convex polygon (unlike the [member CollisionPolygon2D.polygon] property). </description> </method> <method name="space_create"> <return type="RID" /> <description> - Creates a space. A space is a collection of parameters for the physics engine that can be assigned to an area or a body. It can be assigned to an area with [method area_set_space], or to a body with [method body_set_space]. + Creates a 2D space in the physics server, and returns the [RID] that identifies it. A space contains bodies and areas, and controls the stepping of the physics simulation of the objects in it. </description> </method> <method name="space_get_direct_state"> <return type="PhysicsDirectSpaceState2D" /> <param index="0" name="space" type="RID" /> <description> - Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can be used to make collision/intersection queries. + Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can be used for collision/intersection queries. </description> </method> <method name="space_get_param" qualifiers="const"> @@ -884,14 +930,14 @@ <param index="0" name="space" type="RID" /> <param index="1" name="param" type="int" enum="PhysicsServer2D.SpaceParameter" /> <description> - Returns the value of a space parameter. + Returns the value of the given space parameter. See [enum SpaceParameter] for the list of available parameters. </description> </method> <method name="space_is_active" qualifiers="const"> <return type="bool" /> <param index="0" name="space" type="RID" /> <description> - Returns whether the space is active. + Returns [code]true[/code] if the space is active. </description> </method> <method name="space_set_active"> @@ -899,7 +945,7 @@ <param index="0" name="space" type="RID" /> <param index="1" name="active" type="bool" /> <description> - Marks a space as active. It will not have an effect, unless it is assigned to an area or body. + Activates or deactivates the space. If [param active] is [code]false[/code], then the physics server will not do anything with this space in its physics step. </description> </method> <method name="space_set_param"> @@ -908,42 +954,43 @@ <param index="1" name="param" type="int" enum="PhysicsServer2D.SpaceParameter" /> <param index="2" name="value" type="float" /> <description> - Sets the value for a space parameter. See [enum SpaceParameter] for a list of available parameters. + Sets the value of the given space parameter. See [enum SpaceParameter] for the list of available parameters. </description> </method> <method name="world_boundary_shape_create"> <return type="RID" /> <description> + Creates a 2D world boundary shape in the physics server, and returns the [RID] that identifies it. Use [method shape_set_data] to set the shape's normal direction and distance properties. </description> </method> </methods> <constants> <constant name="SPACE_PARAM_CONTACT_RECYCLE_RADIUS" value="0" enum="SpaceParameter"> - Constant to set/get the maximum distance a pair of bodies has to move before their collision status has to be recalculated. + Constant to set/get the maximum distance a pair of bodies has to move before their collision status has to be recalculated. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_recycle_radius]. </constant> <constant name="SPACE_PARAM_CONTACT_MAX_SEPARATION" value="1" enum="SpaceParameter"> - Constant to set/get the maximum distance a shape can be from another before they are considered separated and the contact is discarded. + Constant to set/get the maximum distance a shape can be from another before they are considered separated and the contact is discarded. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_max_separation]. </constant> <constant name="SPACE_PARAM_CONTACT_MAX_ALLOWED_PENETRATION" value="2" enum="SpaceParameter"> - Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision. + Constant to set/get the maximum distance a shape can penetrate another shape before it is considered a collision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/contact_max_allowed_penetration]. </constant> <constant name="SPACE_PARAM_CONTACT_DEFAULT_BIAS" value="3" enum="SpaceParameter"> - Constant to set/get the default solver bias for all physics contacts. A solver bias is a factor controlling how much two objects "rebound", after overlapping, to avoid leaving them in that state because of numerical imprecision. + Constant to set/get the default solver bias for all physics contacts. A solver bias is a factor controlling how much two objects "rebound", after overlapping, to avoid leaving them in that state because of numerical imprecision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/default_contact_bias]. </constant> <constant name="SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD" value="4" enum="SpaceParameter"> - Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. + Constant to set/get the threshold linear velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. The default value of this parameter is [member ProjectSettings.physics/2d/sleep_threshold_linear]. </constant> <constant name="SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD" value="5" enum="SpaceParameter"> - Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. + Constant to set/get the threshold angular velocity of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after the time given. The default value of this parameter is [member ProjectSettings.physics/2d/sleep_threshold_angular]. </constant> <constant name="SPACE_PARAM_BODY_TIME_TO_SLEEP" value="6" enum="SpaceParameter"> - Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time. + Constant to set/get the maximum time of activity. A body marked as potentially inactive for both linear and angular velocity will be put to sleep after this time. The default value of this parameter is [member ProjectSettings.physics/2d/time_before_sleep]. </constant> <constant name="SPACE_PARAM_CONSTRAINT_DEFAULT_BIAS" value="7" enum="SpaceParameter"> - Constant to set/get the default solver bias for all physics constraints. A solver bias is a factor controlling how much two objects "rebound", after violating a constraint, to avoid leaving them in that state because of numerical imprecision. + Constant to set/get the default solver bias for all physics constraints. A solver bias is a factor controlling how much two objects "rebound", after violating a constraint, to avoid leaving them in that state because of numerical imprecision. The default value of this parameter is [member ProjectSettings.physics/2d/solver/default_constraint_bias]. </constant> <constant name="SPACE_PARAM_SOLVER_ITERATIONS" value="8" enum="SpaceParameter"> - Constant to set/get the number of solver iterations for all contacts and constraints. The greater the number of iterations, the more accurate the collisions will be. However, a greater number of iterations requires more CPU power, which can decrease performance. + Constant to set/get the number of solver iterations for all contacts and constraints. The greater the number of iterations, the more accurate the collisions will be. However, a greater number of iterations requires more CPU power, which can decrease performance. The default value of this parameter is [member ProjectSettings.physics/2d/solver/solver_iterations]. </constant> <constant name="SHAPE_WORLD_BOUNDARY" value="0" enum="ShapeType"> This is the constant for creating world boundary shapes. A world boundary shape is an [i]infinite[/i] line with an origin point, and a normal. Thus, it can be used for front/behind checks. @@ -964,7 +1011,7 @@ This is the constant for creating capsule shapes. A capsule shape is defined by a radius and a length. It can be used for intersections and inside/outside checks. </constant> <constant name="SHAPE_CONVEX_POLYGON" value="6" enum="ShapeType"> - This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the [member CollisionPolygon2D.polygon] property, polygons modified with [method shape_set_data] do not verify that the points supplied form is a convex polygon. + This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. </constant> <constant name="SHAPE_CONCAVE_POLYGON" value="7" enum="ShapeType"> This is the constant for creating concave polygon shapes. A polygon is defined by a list of points. It can be used for intersections checks, but not for inside/outside checks. @@ -973,35 +1020,35 @@ This constant is used internally by the engine. Any attempt to create this kind of shape results in an error. </constant> <constant name="AREA_PARAM_GRAVITY_OVERRIDE_MODE" value="0" enum="AreaParameter"> - Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. + Constant to set/get gravity override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED]. </constant> <constant name="AREA_PARAM_GRAVITY" value="1" enum="AreaParameter"> - Constant to set/get gravity strength in an area. + Constant to set/get gravity strength in an area. The default value of this parameter is [code]9.80665[/code]. </constant> <constant name="AREA_PARAM_GRAVITY_VECTOR" value="2" enum="AreaParameter"> - Constant to set/get gravity vector/center in an area. + Constant to set/get gravity vector/center in an area. The default value of this parameter is [code]Vector2(0, -1)[/code]. </constant> <constant name="AREA_PARAM_GRAVITY_IS_POINT" value="3" enum="AreaParameter"> - Constant to set/get whether the gravity vector of an area is a direction, or a center point. + Constant to set/get whether the gravity vector of an area is a direction, or a center point. The default value of this parameter is [code]false[/code]. </constant> <constant name="AREA_PARAM_GRAVITY_POINT_UNIT_DISTANCE" value="4" enum="AreaParameter"> Constant to set/get the distance at which the gravity strength is equal to the gravity controlled by [constant AREA_PARAM_GRAVITY]. For example, on a planet 100 pixels in radius with a surface gravity of 4.0 px/s², set the gravity to 4.0 and the unit distance to 100.0. The gravity will have falloff according to the inverse square law, so in the example, at 200 pixels from the center the gravity will be 1.0 px/s² (twice the distance, 1/4th the gravity), at 50 pixels it will be 16.0 px/s² (half the distance, 4x the gravity), and so on. - The above is true only when the unit distance is a positive number. When the unit distance is set to 0.0, the gravity will be constant regardless of distance. + The above is true only when the unit distance is a positive number. When the unit distance is set to 0.0, the gravity will be constant regardless of distance. The default value of this parameter is [code]0.0[/code]. </constant> <constant name="AREA_PARAM_LINEAR_DAMP_OVERRIDE_MODE" value="5" enum="AreaParameter"> - Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. + Constant to set/get linear damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED]. </constant> <constant name="AREA_PARAM_LINEAR_DAMP" value="6" enum="AreaParameter"> - Constant to set/get the linear damping factor of an area. + Constant to set/get the linear damping factor of an area. The default value of this parameter is [code]0.1[/code]. </constant> <constant name="AREA_PARAM_ANGULAR_DAMP_OVERRIDE_MODE" value="7" enum="AreaParameter"> - Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. + Constant to set/get angular damping override mode in an area. See [enum AreaSpaceOverrideMode] for possible values. The default value of this parameter is [constant AREA_SPACE_OVERRIDE_DISABLED]. </constant> <constant name="AREA_PARAM_ANGULAR_DAMP" value="8" enum="AreaParameter"> - Constant to set/get the angular damping factor of an area. + Constant to set/get the angular damping factor of an area. The default value of this parameter is [code]1.0[/code]. </constant> <constant name="AREA_PARAM_PRIORITY" value="9" enum="AreaParameter"> - Constant to set/get the priority (order of processing) of an area. + Constant to set/get the priority (order of processing) of an area. The default value of this parameter is [code]0[/code]. </constant> <constant name="AREA_SPACE_OVERRIDE_DISABLED" value="0" enum="AreaSpaceOverrideMode"> This area does not affect gravity/damp. These are generally areas that exist only to detect collisions, and objects entering or exiting them. @@ -1031,34 +1078,36 @@ Constant for linear rigid bodies. In this mode, a body can not rotate, and only its linear velocity is affected by external forces. </constant> <constant name="BODY_PARAM_BOUNCE" value="0" enum="BodyParameter"> - Constant to set/get a body's bounce factor. + Constant to set/get a body's bounce factor. The default value of this parameter is [code]0.0[/code]. </constant> <constant name="BODY_PARAM_FRICTION" value="1" enum="BodyParameter"> - Constant to set/get a body's friction. + Constant to set/get a body's friction. The default value of this parameter is [code]1.0[/code]. </constant> <constant name="BODY_PARAM_MASS" value="2" enum="BodyParameter"> - Constant to set/get a body's mass. + Constant to set/get a body's mass. The default value of this parameter is [code]1.0[/code]. If the body's mode is set to [constant BODY_MODE_RIGID], then setting this parameter will have the following additional effects: + - If the parameter [constant BODY_PARAM_CENTER_OF_MASS] has never been set explicitly, then the value of that parameter will be recalculated based on the body's shapes. + - If the parameter [constant BODY_PARAM_INERTIA] is set to a value [code]<= 0.0[/code], then the value of that parameter will be recalculated based on the body's shapes, mass, and center of mass. </constant> <constant name="BODY_PARAM_INERTIA" value="3" enum="BodyParameter"> - Constant to set/get a body's inertia. + Constant to set/get a body's inertia. The default value of this parameter is [code]0.0[/code]. If the body's inertia is set to a value [code]<= 0.0[/code], then the inertia will be recalculated based on the body's shapes, mass, and center of mass. </constant> <constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter"> - Constant to set/get a body's center of mass position in the body's local coordinate system. + Constant to set/get a body's center of mass position in the body's local coordinate system. The default value of this parameter is [code]Vector2(0,0)[/code]. If this parameter is never set explicitly, then it is recalculated based on the body's shapes when setting the parameter [constant BODY_PARAM_MASS] or when calling [method body_set_space]. </constant> <constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter"> - Constant to set/get a body's gravity multiplier. + Constant to set/get a body's gravity multiplier. The default value of this parameter is [code]1.0[/code]. </constant> <constant name="BODY_PARAM_LINEAR_DAMP_MODE" value="6" enum="BodyParameter"> - Constant to set/get a body's linear damping mode. See [enum BodyDampMode] for possible values. + Constant to set/get a body's linear damping mode. See [enum BodyDampMode] for possible values. The default value of this parameter is [constant BODY_DAMP_MODE_COMBINE]. </constant> <constant name="BODY_PARAM_ANGULAR_DAMP_MODE" value="7" enum="BodyParameter"> - Constant to set/get a body's angular damping mode. See [enum BodyDampMode] for possible values. + Constant to set/get a body's angular damping mode. See [enum BodyDampMode] for possible values. The default value of this parameter is [constant BODY_DAMP_MODE_COMBINE]. </constant> <constant name="BODY_PARAM_LINEAR_DAMP" value="8" enum="BodyParameter"> - Constant to set/get a body's linear damping factor. + Constant to set/get a body's linear damping factor. The default value of this parameter is [code]0.0[/code]. </constant> <constant name="BODY_PARAM_ANGULAR_DAMP" value="9" enum="BodyParameter"> - Constant to set/get a body's angular damping factor. + Constant to set/get a body's angular damping factor. The default value of this parameter is [code]0.0[/code]. </constant> <constant name="BODY_PARAM_MAX" value="10" enum="BodyParameter"> Represents the size of the [enum BodyParameter] enum. @@ -1097,24 +1146,31 @@ Represents the size of the [enum JointType] enum. </constant> <constant name="JOINT_PARAM_BIAS" value="0" enum="JointParam"> + Constant to set/get how fast the joint pulls the bodies back to satisfy the joint constraint. The lower the value, the more the two bodies can pull on the joint. The default value of this parameter is [code]0.0[/code]. + [b]Note:[/b] In Godot Physics, this parameter is only used for pin joints and groove joints. </constant> <constant name="JOINT_PARAM_MAX_BIAS" value="1" enum="JointParam"> + Constant to set/get the maximum speed with which the joint can apply corrections. The default value of this parameter is [code]3.40282e+38[/code]. + [b]Note:[/b] In Godot Physics, this parameter is only used for groove joints. </constant> <constant name="JOINT_PARAM_MAX_FORCE" value="2" enum="JointParam"> + Constant to set/get the maximum force that the joint can use to act on the two bodies. The default value of this parameter is [code]3.40282e+38[/code]. + [b]Note:[/b] In Godot Physics, this parameter is only used for groove joints. </constant> <constant name="PIN_JOINT_SOFTNESS" value="0" enum="PinJointParam"> + Constant to set/get a how much the bond of the pin joint can flex. The default value of this parameter is [code]0.0[/code]. </constant> <constant name="DAMPED_SPRING_REST_LENGTH" value="0" enum="DampedSpringParam"> - Sets the resting length of the spring joint. The joint will always try to go to back this length when pulled apart. + Sets the resting length of the spring joint. The joint will always try to go to back this length when pulled apart. The default value of this parameter is the distance between the joint's anchor points. </constant> <constant name="DAMPED_SPRING_STIFFNESS" value="1" enum="DampedSpringParam"> - Sets the stiffness of the spring joint. The joint applies a force equal to the stiffness times the distance from its resting length. + Sets the stiffness of the spring joint. The joint applies a force equal to the stiffness times the distance from its resting length. The default value of this parameter is [code]20.0[/code]. </constant> <constant name="DAMPED_SPRING_DAMPING" value="2" enum="DampedSpringParam"> - Sets the damping ratio of the spring joint. A value of 0 indicates an undamped spring, while 1 causes the system to reach equilibrium as fast as possible (critical damping). + Sets the damping ratio of the spring joint. A value of 0 indicates an undamped spring, while 1 causes the system to reach equilibrium as fast as possible (critical damping). The default value of this parameter is [code]1.5[/code]. </constant> <constant name="CCD_MODE_DISABLED" value="0" enum="CCDMode"> - Disables continuous collision detection. This is the fastest way to detect body collisions, but can miss small, fast-moving objects. + Disables continuous collision detection. This is the fastest way to detect body collisions, but it can miss small and/or fast-moving objects. </constant> <constant name="CCD_MODE_CAST_RAY" value="1" enum="CCDMode"> Enables continuous collision detection by raycasting. It is faster than shapecasting, but less precise. diff --git a/doc/classes/PointLight2D.xml b/doc/classes/PointLight2D.xml index 0c51a78e49..dd61082876 100644 --- a/doc/classes/PointLight2D.xml +++ b/doc/classes/PointLight2D.xml @@ -4,7 +4,7 @@ Positional 2D light source. </brief_description> <description> - Casts light in a 2D environment. This light's shape is defined by a (usually grayscale) texture + Casts light in a 2D environment. This light's shape is defined by a (usually grayscale) texture. </description> <tutorials> <link title="2D lights and shadows">$DOCS_URL/tutorials/2d/2d_lights_and_shadows.html</link> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index c30747eac1..3177780a26 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -474,9 +474,6 @@ <member name="debug/gdscript/warnings/static_called_on_instance" type="int" setter="" getter="" default="1"> When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a static method from an instance of a class instead of from the class directly. </member> - <member name="debug/gdscript/warnings/treat_warnings_as_errors" type="bool" setter="" getter="" default="false"> - If [code]true[/code], all warnings will be reported as if they are errors. - </member> <member name="debug/gdscript/warnings/unassigned_variable" type="int" setter="" getter="" default="1"> When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when using a variable that wasn't previously assigned. </member> @@ -670,7 +667,7 @@ Main window initial position. [code]0[/code] - "Absolute", [member display/window/size/initial_position] is used to set window position. [code]1[/code] - "Primary Screen Center". - [code]2[/code] - "Other Screen Center", [member display/window/size/initial_screen] is used to set window position. + [code]2[/code] - "Other Screen Center", [member display/window/size/initial_screen] is used to set the screen. </member> <member name="display/window/size/initial_screen" type="int" setter="" getter="" default="0"> Main window initial screen, this settings is used only if [member display/window/size/initial_position_type] is set to "Other Screen Center" ([code]2[/code]). @@ -707,7 +704,8 @@ <member name="display/window/vsync/vsync_mode" type="int" setter="" getter="" default="1"> Sets the V-Sync mode for the main game window. See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application. - Depending on the platform and used renderer, the engine will fall back to [code]Enabled[/code] if the desired mode is not supported. + Depending on the platform and used renderer, the engine will fall back to [b]Enabled[/b] if the desired mode is not supported. + [b]Note:[/b] V-Sync modes other than [b]Enabled[/b] are only supported in the Forward+ and Mobile rendering methods, not Compatibility. [b]Note:[/b] This property is only read when the project starts. To change the V-Sync mode at runtime, call [method DisplayServer.window_set_vsync_mode] instead. </member> <member name="dotnet/project/assembly_name" type="String" setter="" getter="" default=""""> @@ -806,7 +804,7 @@ Path to a custom [Font] resource to use as default for all GUI elements of the project. </member> <member name="gui/theme/default_font_antialiasing" type="int" setter="" getter="" default="1"> - Font anti-aliasing mode. See [member FontFile.antialiasing], + Font anti-aliasing mode. See [member FontFile.antialiasing]. </member> <member name="gui/theme/default_font_generate_mipmaps" type="bool" setter="" getter="" default="false"> If set to [code]true[/code], the default font will have mipmaps generated. This prevents text from looking grainy when a [Control] is scaled down, or when a [Label3D] is viewed from a long distance (if [member Label3D.texture_filter] is set to a mode that displays mipmaps). @@ -960,16 +958,16 @@ macOS specific override for the shortcut to delete a word. </member> <member name="input/ui_text_caret_add_above" type="Dictionary" setter="" getter=""> - Default [InputEventAction] to add an additional caret above every caret of a text + Default [InputEventAction] to add an additional caret above every caret of a text. </member> <member name="input/ui_text_caret_add_above.macos" type="Dictionary" setter="" getter=""> - macOS specific override for the shortcut to add a caret above every caret + macOS specific override for the shortcut to add a caret above every caret. </member> <member name="input/ui_text_caret_add_below" type="Dictionary" setter="" getter=""> - Default [InputEventAction] to add an additional caret below every caret of a text + Default [InputEventAction] to add an additional caret below every caret of a text. </member> <member name="input/ui_text_caret_add_below.macos" type="Dictionary" setter="" getter=""> - macOS specific override for the shortcut to add a caret below every caret + macOS specific override for the shortcut to add a caret below every caret. </member> <member name="input/ui_text_caret_document_end" type="Dictionary" setter="" getter=""> Default [InputEventAction] to move the text cursor the the end of the text. @@ -1149,9 +1147,6 @@ <member name="input_devices/pointing/emulate_touch_from_mouse" type="bool" setter="" getter="" default="false"> If [code]true[/code], sends touch input events when clicking or dragging the mouse. </member> - <member name="input_devices/pointing/ios/touch_delay" type="float" setter="" getter="" default="0.15"> - Default delay for touch events. This only affects iOS devices. - </member> <member name="internationalization/locale/fallback" type="String" setter="" getter="" default=""en""> The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used. </member> @@ -1666,7 +1661,7 @@ Optional name for the 3D render layer 13. If left empty, the layer will display as "Layer 13". </member> <member name="layer_names/3d_render/layer_14" type="String" setter="" getter="" default=""""> - Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14" + Optional name for the 3D render layer 14. If left empty, the layer will display as "Layer 14". </member> <member name="layer_names/3d_render/layer_15" type="String" setter="" getter="" default=""""> Optional name for the 3D render layer 15. If left empty, the layer will display as "Layer 15". @@ -1934,13 +1929,16 @@ </member> <member name="rendering/anti_aliasing/quality/msaa_2d" type="int" setter="" getter="" default="0"> Sets the number of MSAA samples to use for 2D/Canvas rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. This has no effect on shader-induced aliasing or texture aliasing. + [b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/quality/msaa_3d" type="int" setter="" getter="" default="0"> Sets the number of MSAA samples to use for 3D rendering (as a power of two). MSAA is used to reduce aliasing around the edges of polygons. A higher MSAA value results in smoother edges but can be significantly slower on some hardware. See also bilinear scaling 3d [member rendering/scaling_3d/mode] for supersampling, which provides higher quality but is much more expensive. This has no effect on shader-induced aliasing or texture aliasing. + [b]Note:[/b] MSAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/quality/screen_space_aa" type="int" setter="" getter="" default="0"> Sets the screen-space antialiasing mode for the default screen [Viewport]. Screen-space antialiasing works by selectively blurring edges in a post-process shader. It differs from MSAA which takes multiple coverage samples while rendering objects. Screen-space AA methods are typically faster than MSAA and will smooth out specular aliasing, but tend to make scenes appear blurry. The blurriness is partially counteracted by automatically using a negative mipmap LOD bias (see [member rendering/textures/default_filters/texture_mipmap_bias]). Another way to combat specular aliasing is to enable [member rendering/anti_aliasing/screen_space_roughness_limiter/enabled]. + [b]Note:[/b] Screen-space antialiasing is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/quality/use_debanding" type="bool" setter="" getter="" default="false"> If [code]true[/code], uses a fast post-processing filter to make banding significantly less visible in 3D. 2D rendering is [i]not[/i] affected by debanding unless the [member Environment.background_mode] is [constant Environment.BG_CANVAS]. @@ -1949,11 +1947,14 @@ </member> <member name="rendering/anti_aliasing/quality/use_taa" type="bool" setter="" getter="" default="false"> Enables Temporal Anti-Aliasing for the default screen [Viewport]. TAA works by jittering the camera and accumulating the images of the last rendered frames, motion vector rendering is used to account for camera and object motion. Enabling TAA can make the image blurrier, which is partially counteracted by automatically using a negative mipmap LOD bias (see [member rendering/textures/default_filters/texture_mipmap_bias]). - [b]Note:[/b] The implementation is not complete yet, some visual instances such as particles and skinned meshes may show artifacts. + [b]Note:[/b] The implementation is not complete yet. Some visual instances such as particles and skinned meshes may show ghosting artifacts in motion. + [b]Note:[/b] TAA is only supported in the Forward+ rendering method, not Mobile or Compatibility. </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/amount" type="float" setter="" getter="" default="0.25"> </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/enabled" type="bool" setter="" getter="" default="true"> + If [code]true[/code], enables a spatial filter to limit roughness in areas with high-frequency detail. This can help reduce specular aliasing to an extent, though not as much as enabling [member rendering/anti_aliasing/quality/use_taa]. This filter has a small performance cost, so consider disabling it if it doesn't benefit your scene noticeably. + [b]Note:[/b] TAA is only supported in the Forward+ and Mobile rendering methods, not Compatibility. </member> <member name="rendering/anti_aliasing/screen_space_roughness_limiter/limit" type="float" setter="" getter="" default="0.18"> </member> @@ -1971,7 +1972,7 @@ </member> <member name="rendering/driver/depth_prepass/enable" type="bool" setter="" getter="" default="true"> If [code]true[/code], performs a previous depth pass before rendering 3D materials. This increases performance significantly in scenes with high overdraw, when complex materials and lighting are used. However, in scenes with few occluded surfaces, the depth prepass may reduce performance. If your game is viewed from a fixed angle that makes it easy to avoid overdraw (such as top-down or side-scrolling perspective), consider disabling the depth prepass to improve performance. This setting can be changed at run-time to optimize performance depending on the scene currently being viewed. - [b]Note:[/b] Only supported when using the Vulkan Clustered backend or the OpenGL backend. When using Vulkan Mobile there is no depth prepass performed. + [b]Note:[/b] Depth prepass is only supported when using the Forward+ or Compatibility rendering method. When using the Mobile rendering method, there is no depth prepass performed. </member> <member name="rendering/driver/threads/thread_model" type="int" setter="" getter="" default="1"> Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter. @@ -2177,12 +2178,15 @@ </member> <member name="rendering/limits/opengl/max_lights_per_object" type="int" setter="" getter="" default="8"> Max number of omnilights and spotlights renderable per object. At the default value of 8, this means that each surface can be affected by up to 8 omnilights and 8 spotlights. This is further limited by hardware support and [member rendering/limits/opengl/max_renderable_lights]. Setting this low will slightly reduce memory usage, may decrease shader compile times, and may result in faster rendering on low-end, mobile, or web devices. + [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile. </member> <member name="rendering/limits/opengl/max_renderable_elements" type="int" setter="" getter="" default="65536"> Max number of elements renderable in a frame. If more elements than this are visible per frame, they will not be drawn. Keep in mind elements refer to mesh surfaces and not meshes themselves. Setting this low will slightly reduce memory usage and may decrease shader compile times, particularly on web. For most uses, the default value is suitable, but consider lowering as much as possible on web export. + [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile. </member> <member name="rendering/limits/opengl/max_renderable_lights" type="int" setter="" getter="" default="32"> Max number of positional lights renderable in a frame. If more lights than this number are used, they will be ignored. Setting this low will slightly reduce memory usage and may decrease shader compile times, particularly on web. For most uses, the default value is suitable, but consider lowering as much as possible on web export. + [b]Note:[/b] This setting is only effective when using the Compatibility rendering method, not Forward+ and Mobile. </member> <member name="rendering/limits/spatial_indexer/threaded_cull_minimum_instances" type="int" setter="" getter="" default="1000"> </member> @@ -2274,7 +2278,8 @@ Determines how sharp the upscaled image will be when using the FSR upscaling mode. Sharpness halves with every whole number. Values go from 0.0 (sharpest) to 2.0. Values above 2.0 won't make a visible difference. </member> <member name="rendering/scaling_3d/mode" type="int" setter="" getter="" default="0"> - Sets the scaling 3D mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. FSR should be used where possible. + Sets the scaling 3D mode. Bilinear scaling renders at different resolution to either undersample or supersample the viewport. FidelityFX Super Resolution 1.0, abbreviated to FSR, is an upscaling technology that produces high quality images at fast framerates by using a spatially-aware upscaling algorithm. FSR is slightly more expensive than bilinear, but it produces significantly higher image quality. On particularly low-end GPUs, the added cost of FSR may not be worth it (compared to using bilinear scaling with a slightly higher resolution scale to match performance). + [b]Note:[/b] FSR is only effective when using the Forward+ rendering method, not Mobile or Compatibility. If using an incompatible rendering method, FSR will fall back to bilinear scaling. </member> <member name="rendering/scaling_3d/scale" type="float" setter="" getter="" default="1.0"> Scales the 3D render buffer based on the viewport size uses an image filter specified in [member rendering/scaling_3d/mode] to scale the output image to the full viewport size. Values lower than [code]1.0[/code] can be used to speed up 3D rendering at the cost of quality (undersampling). Values greater than [code]1.0[/code] are only valid for bilinear mode and can be used to improve 3D rendering quality at a high performance cost (supersampling). See also [member rendering/anti_aliasing/quality/msaa_3d] for multi-sample antialiasing, which is significantly cheaper but only smooths the edges of polygons. @@ -2298,9 +2303,11 @@ </member> <member name="rendering/shading/overrides/force_vertex_shading" type="bool" setter="" getter="" default="false"> If [code]true[/code], forces vertex shading for all rendering. This can increase performance a lot, but also reduces quality immensely. Can be used to optimize performance on low-end mobile devices. + [b]Note:[/b] This setting currently has no effect, as vertex shading is not implemented yet. </member> <member name="rendering/shading/overrides/force_vertex_shading.mobile" type="bool" setter="" getter="" default="true"> Lower-end override for [member rendering/shading/overrides/force_vertex_shading] on mobile devices, due to performance concerns or driver support. + [b]Note:[/b] This setting currently has no effect, as vertex shading is not implemented yet. </member> <member name="rendering/textures/decals/filter" type="int" setter="" getter="" default="3"> The filtering quality to use for [Decal] nodes. When using one of the anisotropic filtering modes, the anisotropic filtering level is controlled by [member rendering/textures/default_filters/anisotropic_filtering_level]. @@ -2327,11 +2334,11 @@ <member name="rendering/textures/lossless_compression/force_png" type="bool" setter="" getter="" default="false"> If [code]true[/code], the texture importer will import lossless textures using the PNG format. Otherwise, it will default to using WebP. </member> - <member name="rendering/textures/vram_compression/import_etc2_astc" type="bool" setter="" getter="" default="false"> + <member name="rendering/textures/vram_compression/import_etc2_astc" type="bool" setter="" getter=""> If [code]true[/code], the texture importer will import VRAM-compressed textures using the Ericsson Texture Compression 2 algorithm for lower quality textures and normalmaps and Adaptable Scalable Texture Compression algorithm for high quality textures (in 4x4 block size). [b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were already imported before. To make this setting apply to textures that were already imported, exit the editor, remove the [code].godot/imported/[/code] folder located inside the project folder then restart the editor (see [member application/config/use_hidden_project_data_directory]). </member> - <member name="rendering/textures/vram_compression/import_s3tc_bptc" type="bool" setter="" getter="" default="true"> + <member name="rendering/textures/vram_compression/import_s3tc_bptc" type="bool" setter="" getter=""> If [code]true[/code], the texture importer will import VRAM-compressed textures using the S3 Texture Compression algorithm (DXT1-5) for lower quality textures and the the BPTC algorithm (BC6H and BC7) for high quality textures. This algorithm is only supported on PC desktop platforms and consoles. [b]Note:[/b] Changing this setting does [i]not[/i] impact textures that were already imported before. To make this setting apply to textures that were already imported, exit the editor, remove the [code].godot/imported/[/code] folder located inside the project folder then restart the editor (see [member application/config/use_hidden_project_data_directory]). </member> diff --git a/doc/classes/ReflectionProbe.xml b/doc/classes/ReflectionProbe.xml index e912925cd2..cc48e0612b 100644 --- a/doc/classes/ReflectionProbe.xml +++ b/doc/classes/ReflectionProbe.xml @@ -7,6 +7,7 @@ Captures its surroundings as a cubemap, and stores versions of it with increasing levels of blur to simulate different material roughnesses. The [ReflectionProbe] is used to create high-quality reflections at a low performance cost (when [member update_mode] is [constant UPDATE_ONCE]). [ReflectionProbe]s can be blended together and with the rest of the scene smoothly. [ReflectionProbe]s can also be combined with [VoxelGI], SDFGI ([member Environment.sdfgi_enabled]) and screen-space reflections ([member Environment.ssr_enabled]) to get more accurate reflections in specific areas. [ReflectionProbe]s render all objects within their [member cull_mask], so updating them can be quite expensive. It is best to update them once with the important static objects and then leave them as-is. [b]Note:[/b] Unlike [VoxelGI] and SDFGI, [ReflectionProbe]s only source their environment from a [WorldEnvironment] node. If you specify an [Environment] resource within a [Camera3D] node, it will be ignored by the [ReflectionProbe]. This can lead to incorrect lighting within the [ReflectionProbe]. + [b]Note:[/b] Reflection probes are only supported in the Forward+ and Mobile rendering methods, not Compatibility. When using the Mobile rendering method, only 8 reflection probes can be displayed on each mesh resource. Attempting to display more than 8 reflection probes on a single mesh resource will result in reflection probes flickering in and out as the camera moves. [b]Note:[/b] When using the Mobile rendering method, reflection probes will only correctly affect meshes whose visibility AABB intersects with the reflection probe's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the reflection probe may not be visible on the mesh. </description> <tutorials> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 82a2871949..64be8e6807 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -8,7 +8,7 @@ On startup, Godot creates a global [RenderingDevice] which can be retrieved using [method RenderingServer.get_rendering_device]. This global RenderingDevice performs drawing to the screen. Internally, [RenderingDevice] is used in Godot to provide support for several modern low-level graphics APIs while reducing the amount of code duplication required. [b]Local RenderingDevices:[/b] Using [method RenderingServer.create_local_rendering_device], you can create "secondary" rendering devices to perform drawing and GPU compute operations on separate threads. - [b]Note:[/b] [RenderingDevice] is not available when running in headless mode or when using the OpenGL renderer. + [b]Note:[/b] [RenderingDevice] is not available when running in headless mode or when using the Compatibility rendering method. </description> <tutorials> </tutorials> @@ -32,7 +32,10 @@ <method name="buffer_get_data"> <return type="PackedByteArray" /> <param index="0" name="buffer" type="RID" /> + <param index="1" name="offset_bytes" type="int" default="0" /> + <param index="2" name="size_bytes" type="int" default="0" /> <description> + Returns a copy of the data of the specified [param buffer], optionally [param offset_bytes] and [param size_bytes] can be set to copy only a portion of the buffer. </description> </method> <method name="buffer_update"> diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml index 49bb65b64d..5985af53fc 100644 --- a/doc/classes/RichTextLabel.xml +++ b/doc/classes/RichTextLabel.xml @@ -373,7 +373,7 @@ <return type="void" /> <param index="0" name="data" type="Variant" /> <description> - Adds a [code][meta][/code] tag to the tag stack. Similar to the BBCode [code][url=something]{text}[/url][/code], but supports non-[String] metadata types. + Adds a meta tag to the tag stack. Similar to the BBCode [code][url=something]{text}[/url][/code], but supports non-[String] metadata types. </description> </method> <method name="push_mono"> @@ -625,60 +625,6 @@ <constant name="LIST_DOTS" value="3" enum="ListType"> Each list item has a filled circle marker. </constant> - <constant name="ITEM_FRAME" value="0" enum="ItemType"> - </constant> - <constant name="ITEM_TEXT" value="1" enum="ItemType"> - </constant> - <constant name="ITEM_IMAGE" value="2" enum="ItemType"> - </constant> - <constant name="ITEM_NEWLINE" value="3" enum="ItemType"> - </constant> - <constant name="ITEM_FONT" value="4" enum="ItemType"> - </constant> - <constant name="ITEM_FONT_SIZE" value="5" enum="ItemType"> - </constant> - <constant name="ITEM_FONT_FEATURES" value="6" enum="ItemType"> - </constant> - <constant name="ITEM_COLOR" value="7" enum="ItemType"> - </constant> - <constant name="ITEM_OUTLINE_SIZE" value="8" enum="ItemType"> - </constant> - <constant name="ITEM_OUTLINE_COLOR" value="9" enum="ItemType"> - </constant> - <constant name="ITEM_UNDERLINE" value="10" enum="ItemType"> - </constant> - <constant name="ITEM_STRIKETHROUGH" value="11" enum="ItemType"> - </constant> - <constant name="ITEM_PARAGRAPH" value="12" enum="ItemType"> - </constant> - <constant name="ITEM_INDENT" value="13" enum="ItemType"> - </constant> - <constant name="ITEM_LIST" value="14" enum="ItemType"> - </constant> - <constant name="ITEM_TABLE" value="15" enum="ItemType"> - </constant> - <constant name="ITEM_FADE" value="16" enum="ItemType"> - </constant> - <constant name="ITEM_SHAKE" value="17" enum="ItemType"> - </constant> - <constant name="ITEM_WAVE" value="18" enum="ItemType"> - </constant> - <constant name="ITEM_TORNADO" value="19" enum="ItemType"> - </constant> - <constant name="ITEM_RAINBOW" value="20" enum="ItemType"> - </constant> - <constant name="ITEM_BGCOLOR" value="21" enum="ItemType"> - </constant> - <constant name="ITEM_FGCOLOR" value="22" enum="ItemType"> - </constant> - <constant name="ITEM_META" value="23" enum="ItemType"> - </constant> - <constant name="ITEM_HINT" value="24" enum="ItemType"> - </constant> - <constant name="ITEM_DROPCAP" value="25" enum="ItemType"> - </constant> - <constant name="ITEM_CUSTOMFX" value="26" enum="ItemType"> - </constant> <constant name="MENU_COPY" value="0" enum="MenuItems"> Copies the selected text. </constant> diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml index 6e3535f14a..937d0910ec 100644 --- a/doc/classes/RigidBody2D.xml +++ b/doc/classes/RigidBody2D.xml @@ -176,6 +176,28 @@ <member name="inertia" type="float" setter="set_inertia" getter="get_inertia" default="0.0"> The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body. The moment of inertia is usually computed automatically from the mass and the shapes, but this property allows you to set a custom value. If set to [code]0[/code], inertia is automatically computed (default value). + [b]Note:[/b] This value does not change when inertia is automatically computed. Use [PhysicsServer2D] to get the computed inertia. + [codeblocks] + [gdscript] + @onready var ball = $Ball + + func get_ball_inertia(): + return 1.0 / PhysicsServer2D.body_get_direct_state(ball.get_rid()).inverse_inertia + [/gdscript] + [csharp] + private RigidBody2D _ball; + + public override void _Ready() + { + _ball = GetNode<RigidBody2D>("Ball"); + } + + private float GetBallInertia() + { + return 1.0f / PhysicsServer2D.BodyGetDirectState(_ball.GetRid()).InverseInertia; + } + [/csharp] + [/codeblocks] </member> <member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.0"> Damps the body's movement. By default, the body will use the [b]Default Linear Damp[/b] in [b]Project > Project Settings > Physics > 2d[/b] or any value override set by an [Area2D] the body is in. Depending on [member linear_damp_mode], you can set [member linear_damp] to be added to or to replace the body's damping value. diff --git a/doc/classes/RigidBody3D.xml b/doc/classes/RigidBody3D.xml index 148cdf96ee..a066254b4f 100644 --- a/doc/classes/RigidBody3D.xml +++ b/doc/classes/RigidBody3D.xml @@ -183,6 +183,28 @@ <member name="inertia" type="Vector3" setter="set_inertia" getter="get_inertia" default="Vector3(0, 0, 0)"> The body's moment of inertia. This is like mass, but for rotation: it determines how much torque it takes to rotate the body on each axis. The moment of inertia is usually computed automatically from the mass and the shapes, but this property allows you to set a custom value. If set to [code]Vector3.ZERO[/code], inertia is automatically computed (default value). + [b]Note:[/b] This value does not change when inertia is automatically computed. Use [PhysicsServer3D] to get the computed inertia. + [codeblocks] + [gdscript] + @onready var ball = $Ball + + func get_ball_inertia(): + return PhysicsServer3D.body_get_direct_state(ball.get_rid()).inverse_inertia.inverse() + [/gdscript] + [csharp] + private RigidBody3D _ball; + + public override void _Ready() + { + _ball = GetNode<RigidBody3D>("Ball"); + } + + private Vector3 GetBallInertia() + { + return PhysicsServer3D.BodyGetDirectState(_ball.GetRid()).InverseInertia.Inverse(); + } + [/csharp] + [/codeblocks] </member> <member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.0"> Damps the body's movement. By default, the body will use the [b]Default Linear Damp[/b] in [b]Project > Project Settings > Physics > 3d[/b] or any value override set by an [Area3D] the body is in. Depending on [member linear_damp_mode], you can set [member linear_damp] to be added to or to replace the body's damping value. diff --git a/doc/classes/ScriptExtension.xml b/doc/classes/ScriptExtension.xml index 045eadda41..61034f8e4a 100644 --- a/doc/classes/ScriptExtension.xml +++ b/doc/classes/ScriptExtension.xml @@ -32,6 +32,11 @@ <description> </description> </method> + <method name="_get_global_name" qualifiers="virtual const"> + <return type="StringName" /> + <description> + </description> + </method> <method name="_get_instance_base_type" qualifiers="virtual const"> <return type="StringName" /> <description> diff --git a/doc/classes/Skeleton3D.xml b/doc/classes/Skeleton3D.xml index 70986ba06a..bdd3495798 100644 --- a/doc/classes/Skeleton3D.xml +++ b/doc/classes/Skeleton3D.xml @@ -240,7 +240,7 @@ <description> Sets the global pose transform, [param pose], for the bone at [param bone_idx]. [param amount] is the interpolation strength that will be used when applying the pose, and [param persistent] determines if the applied pose will remain. - [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform + [b]Note:[/b] The pose transform needs to be a global pose! To convert a world transform from a [Node3D] to a global bone pose, multiply the [method Transform3D.affine_inverse] of the node's [member Node3D.global_transform] by the desired world transform. </description> </method> <method name="set_bone_name"> diff --git a/doc/classes/SpotLight3D.xml b/doc/classes/SpotLight3D.xml index 9dff742748..3b32923872 100644 --- a/doc/classes/SpotLight3D.xml +++ b/doc/classes/SpotLight3D.xml @@ -5,6 +5,7 @@ </brief_description> <description> A Spotlight is a type of [Light3D] node that emits lights in a specific direction, in the shape of a cone. The light is attenuated through the distance. This attenuation can be configured by changing the energy, radius and attenuation parameters of [Light3D]. + [b]Note:[/b] When using the Mobile rendering method, only 8 spot lights can be displayed on each mesh resource. Attempting to display more than 8 spot lights on a single mesh resource will result in spot lights flickering in and out as the camera moves. When using the Compatibility rendering method, only 8 spot lights can be displayed on each mesh resource by default, but this can be increased by adjusting [member ProjectSettings.rendering/limits/opengl/max_lights_per_object]. [b]Note:[/b] When using the Mobile or Compatibility rendering methods, spot lights will only correctly affect meshes whose visibility AABB intersects with the light's AABB. If using a shader to deform the mesh in a way that makes it go outside its AABB, [member GeometryInstance3D.extra_cull_margin] must be increased on the mesh. Otherwise, the light may not be visible on the mesh. </description> <tutorials> @@ -19,10 +20,11 @@ [b]Note:[/b] [member spot_angle] is not affected by [member Node3D.scale] (the light's scale or its parent's scale). </member> <member name="spot_angle_attenuation" type="float" setter="set_param" getter="get_param" default="1.0"> - The spotlight's angular attenuation curve. + The spotlight's [i]angular[/i] attenuation curve. See also [member spot_attenuation]. </member> <member name="spot_attenuation" type="float" setter="set_param" getter="get_param" default="1.0"> - The spotlight's light energy attenuation curve. + The spotlight's light energy (drop-off) attenuation curve. A number of presets are available in the [b]Inspector[/b] by right-clicking the curve. Zero and negative values are allowed but can produce unusual effects. See also [member spot_angle_attenuation]. + [b]Note:[/b] Very high [member spot_attenuation] values (typically above 10) can impact performance negatively if the light is made to use a larger [member spot_range] to compensate. This is because culling opportunities will become less common and shading costs will be increased (as the light will cover more pixels on screen while resulting in the same amount of brightness). To improve performance, use the lowest [member spot_attenuation] value possible for the visuals you're trying to achieve. </member> <member name="spot_range" type="float" setter="set_param" getter="get_param" default="5.0"> The maximal range that can be reached by the spotlight. Note that the effectively lit area may appear to be smaller depending on the [member spot_attenuation] in use. No matter the [member spot_attenuation] in use, the light will never reach anything outside this range. diff --git a/doc/classes/StreamPeer.xml b/doc/classes/StreamPeer.xml index 969cbac57d..9a70690122 100644 --- a/doc/classes/StreamPeer.xml +++ b/doc/classes/StreamPeer.xml @@ -109,6 +109,7 @@ <param index="0" name="allow_objects" type="bool" default="false" /> <description> Gets a Variant from the stream. If [param allow_objects] is [code]true[/code], decoding objects is allowed. + Internally, this uses the same decoding mechanism as the [method @GlobalScope.bytes_to_var] method. [b]Warning:[/b] Deserialized objects can contain code which gets executed. Do not use this option if the serialized object comes from untrusted sources to avoid potential security threats such as remote code execution. </description> </method> @@ -234,6 +235,7 @@ <param index="1" name="full_objects" type="bool" default="false" /> <description> Puts a Variant into the stream. If [param full_objects] is [code]true[/code] encoding objects is allowed (and can potentially include code). + Internally, this uses the same encoding mechanism as the [method @GlobalScope.var_to_bytes] method. </description> </method> </methods> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index 792cd38741..8535dacda7 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -193,8 +193,8 @@ GD.Print("Team".Find("I")); // Prints -1 GD.Print("Potato".Find("t")); // Prints 2 - GD.print("Potato".Find("t", 3)); // Prints 4 - GD.print("Potato".Find("t", 5)); // Prints -1 + GD.Print("Potato".Find("t", 3)); // Prints 4 + GD.Print("Potato".Find("t", 5)); // Prints -1 [/csharp] [/codeblocks] [b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator. @@ -230,6 +230,7 @@ print("User {id} is {name}.".format([["id", 42], ["name", "Godot"]])) [/codeblock] See also the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format string[/url] tutorial. + [b]Note:[/b] In C#, it's recommended to [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]interpolate strings with "$"[/url], instead. </description> </method> <method name="get_base_dir" qualifiers="const"> @@ -480,7 +481,7 @@ var fruits = new string[] {"Apple", "Orange", "Pear", "Kiwi"}; // In C#, this method is static. - GD.Print(string.Join(", ", fruits); // Prints "Apple, Orange, Pear, Kiwi" + GD.Print(string.Join(", ", fruits)); // Prints "Apple, Orange, Pear, Kiwi" GD.Print(string.Join("---", fruits)); // Prints "Apple---Orange---Pear---Kiwi" [/csharp] [/codeblocks] @@ -1047,8 +1048,7 @@ <return type="String" /> <param index="0" name="right" type="Variant" /> <description> - Formats the [String], replacing the placeholders with one or more parameters. - To pass multiple parameters, [param right] needs to be an [Array]. + Formats the [String], replacing the placeholders with one or more parameters. To pass multiple parameters, [param right] needs to be an [Array]. [codeblock] print("I caught %d fishes!" % 2) # Prints "I caught 2 fishes!" @@ -1057,8 +1057,8 @@ var speed = 40.3485 print(my_message % [location, speed]) # Prints "Travelling to Deep Valley, at 40.35 km/h." [/codeblock] - In C#, there is no direct equivalent to this operator. Use the [method format] method, instead. For more information, see the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format strings[/url] tutorial. + [b]Note:[/b] In C#, this operator is not available. Instead, see [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]how to interpolate strings with "$"[/url]. </description> </operator> <operator name="operator +"> @@ -1072,6 +1072,7 @@ <return type="String" /> <param index="0" name="right" type="StringName" /> <description> + Appends [param right] at the end of this [String], returning a [String]. This is also known as a string concatenation. </description> </operator> <operator name="operator <"> diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml index c103fb2287..96b958a5b9 100644 --- a/doc/classes/StringName.xml +++ b/doc/classes/StringName.xml @@ -5,7 +5,7 @@ </brief_description> <description> [StringName]s are immutable strings designed for general-purpose representation of unique names (also called "string interning"). [StringName] ensures that only one instance of a given name exists (so two [StringName]s with the same value are the same object). Comparing them is much faster than with regular [String]s, because only the pointers are compared, not the whole strings. - You will usually just pass a [String] to methods expecting a [StringName] and it will be automatically converted, but you may occasionally want to construct a [StringName] ahead of time with [StringName] or, in GDScript, the literal syntax [code]&"example"[/code]. + You will usually just pass a [String] to methods expecting a [StringName] and it will be automatically converted, but you may occasionally want to construct a [StringName] ahead of time with the [StringName] constructor or, in GDScript, the literal syntax [code]&"example"[/code]. See also [NodePath], which is a similar concept specifically designed to store pre-parsed node paths. Some string methods have corresponding variations. Variations suffixed with [code]n[/code] ([method countn], [method findn], [method replacen], etc.) are [b]case-insensitive[/b] (they make no distinction between uppercase and lowercase letters). Method variations prefixed with [code]r[/code] ([method rfind], [method rsplit], etc.) are reversed, and start from the end of the string, instead of the beginning. [b]Note:[/b] In a boolean context, a [StringName] will evaluate to [code]false[/code] if it is empty ([code]StringName("")[/code]). Otherwise, a [StringName] will always evaluate to [code]true[/code]. @@ -176,8 +176,8 @@ GD.Print("Team".Find("I")); // Prints -1 GD.Print("Potato".Find("t")); // Prints 2 - GD.print("Potato".Find("t", 3)); // Prints 4 - GD.print("Potato".Find("t", 5)); // Prints -1 + GD.Print("Potato".Find("t", 3)); // Prints 4 + GD.Print("Potato".Find("t", 5)); // Prints -1 [/csharp] [/codeblocks] [b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator. @@ -213,6 +213,7 @@ print("User {id} is {name}.".format([["id", 42], ["name", "Godot"]])) [/codeblock] See also the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format string[/url] tutorial. + [b]Note:[/b] In C#, it's recommended to [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]interpolate strings with "$"[/url], instead. </description> </method> <method name="get_base_dir" qualifiers="const"> @@ -455,7 +456,7 @@ var fruits = new string[] {"Apple", "Orange", "Pear", "Kiwi"}; // In C#, this method is static. - GD.Print(string.Join(", ", fruits); // Prints "Apple, Orange, Pear, Kiwi" + GD.Print(string.Join(", ", fruits)); // Prints "Apple, Orange, Pear, Kiwi" GD.Print(string.Join("---", fruits)); // Prints "Apple---Orange---Pear---Kiwi" [/csharp] [/codeblocks] @@ -954,18 +955,23 @@ <return type="String" /> <param index="0" name="right" type="Variant" /> <description> + Formats the [StringName], replacing the placeholders with one or more parameters, returning a [String]. To pass multiple parameters, [param right] needs to be an [Array]. + For more information, see the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format strings[/url] tutorial. + [b]Note:[/b] In C#, this operator is not available. Instead, see [url=https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated]how to interpolate strings with "$"[/url]. </description> </operator> <operator name="operator +"> <return type="String" /> <param index="0" name="right" type="String" /> <description> + Appends [param right] at the end of this [StringName], returning a [String]. This is also known as a string concatenation. </description> </operator> <operator name="operator +"> <return type="String" /> <param index="0" name="right" type="StringName" /> <description> + Appends [param right] at the end of this [StringName], returning a [String]. This is also known as a string concatenation. </description> </operator> <operator name="operator <"> diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index c309026aaa..be8c4c2485 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -436,7 +436,7 @@ <return type="int" /> <param index="0" name="position" type="Vector2i" /> <description> - Returns the equivalent minimap line at [param position] + Returns the equivalent minimap line at [param position]. </description> </method> <method name="get_minimap_visible_lines" qualifiers="const"> @@ -483,7 +483,7 @@ <method name="get_saved_version" qualifiers="const"> <return type="int" /> <description> - Returns the last tagged saved version from [method tag_saved_version] + Returns the last tagged saved version from [method tag_saved_version]. </description> </method> <method name="get_scroll_pos_for_line" qualifiers="const"> @@ -1054,7 +1054,7 @@ <return type="void" /> <param index="0" name="callback" type="Callable" /> <description> - Provide custom tooltip text. The callback method must take the following args: [code]hovered_word: String[/code] + Provide custom tooltip text. The callback method must take the following args: [code]hovered_word: String[/code]. </description> </method> <method name="start_action"> diff --git a/doc/classes/TextureLayered.xml b/doc/classes/TextureLayered.xml index 8f6dff7acf..7a0940edd4 100644 --- a/doc/classes/TextureLayered.xml +++ b/doc/classes/TextureLayered.xml @@ -8,7 +8,7 @@ Data is set on a per-layer basis. For [Texture2DArray]s, the layer specifies the array layer. All images need to have the same width, height and number of mipmap levels. A [TextureLayered] can be loaded with [method ResourceLoader.load]. - Internally, Godot maps these files to their respective counterparts in the target rendering driver (Vulkan, GLES3). + Internally, Godot maps these files to their respective counterparts in the target rendering driver (Vulkan, OpenGL3). </description> <tutorials> </tutorials> diff --git a/doc/classes/TextureRect.xml b/doc/classes/TextureRect.xml index 460ffbbb80..3500a0ddf5 100644 --- a/doc/classes/TextureRect.xml +++ b/doc/classes/TextureRect.xml @@ -10,8 +10,9 @@ <link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link> </tutorials> <members> - <member name="expand_mode" type="int" setter="set_expand_mode" getter="get_expand_mode" enum="TextureRect.ExpandMode" default="0"> + <member name="expand_mode" type="int" setter="set_expand_mode" getter="get_expand_mode" enum="TextureRect.ExpandMode" default="0" is_experimental="true"> Defines how minimum size is determined based on the texture's size. See [enum ExpandMode] for options. + [b]Note:[/b] Using [constant EXPAND_FIT_WIDTH], [constant EXPAND_FIT_WIDTH_PROPORTIONAL], [constant EXPAND_FIT_HEIGHT] or [constant EXPAND_FIT_HEIGHT_PROPORTIONAL] may result in unstable behavior in some containers. This functionality is being re-evaluated and will change in the future. </member> <member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h" default="false"> If [code]true[/code], texture is flipped horizontally. diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index 5dedea50d0..413cf62f7d 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -168,6 +168,15 @@ Returns the number of layers in the TileMap. </description> </method> + <method name="get_navigation_map" qualifiers="const"> + <return type="RID" /> + <param index="0" name="layer" type="int" /> + <description> + Returns the [NavigationServer2D] navigation map [RID] currently assigned to the specified TileMap [param layer]. + By default the TileMap uses the default [World2D] navigation map for the first TileMap layer. For each additional TileMap layer a new navigation map is created for the additional layer. + In order to make [NavigationAgent2D] switch between TileMap layer navigation maps use [method NavigationAgent2D.set_navigation_map] with the navigation map received from [method get_navigation_map]. + </description> + </method> <method name="get_neighbor_cell" qualifiers="const"> <return type="Vector2i" /> <param index="0" name="coords" type="Vector2i" /> @@ -188,7 +197,7 @@ <return type="Vector2i[]" /> <param index="0" name="coords" type="Vector2i" /> <description> - Returns the list of all neighbourings cells to the one at [param coords] + Returns the list of all neighbourings cells to the one at [param coords]. </description> </method> <method name="get_used_cells" qualifiers="const"> @@ -243,7 +252,7 @@ <param index="1" name="coords_in_pattern" type="Vector2i" /> <param index="2" name="pattern" type="TileMapPattern" /> <description> - Returns for the given coordinate [param coords_in_pattern] in a [TileMapPattern] the corresponding cell coordinates if the pattern was pasted at the [param position_in_tilemap] coordinates (see [method set_pattern]). This mapping is required as in half-offset tile shapes, the mapping might not work by calculating [code]position_in_tile_map + coords_in_pattern[/code] + Returns for the given coordinate [param coords_in_pattern] in a [TileMapPattern] the corresponding cell coordinates if the pattern was pasted at the [param position_in_tilemap] coordinates (see [method set_pattern]). This mapping is required as in half-offset tile shapes, the mapping might not work by calculating [code]position_in_tile_map + coords_in_pattern[/code]. </description> </method> <method name="map_to_local" qualifiers="const"> @@ -366,6 +375,16 @@ If [code]layer[/code] is negative, the layers are accessed from the last one. </description> </method> + <method name="set_navigation_map"> + <return type="void" /> + <param index="0" name="layer" type="int" /> + <param index="1" name="map" type="RID" /> + <description> + Assigns a [NavigationServer2D] navigation map [RID] to the specified TileMap [param layer]. + By default the TileMap uses the default [World2D] navigation map for the first TileMap layer. For each additional TileMap layer a new navigation map is created for the additional layer. + In order to make [NavigationAgent2D] switch between TileMap layer navigation maps use [method NavigationAgent2D.set_navigation_map] with the navigation map received from [method get_navigation_map]. + </description> + </method> <method name="set_pattern"> <return type="void" /> <param index="0" name="layer" type="int" /> diff --git a/doc/classes/VisibleOnScreenEnabler2D.xml b/doc/classes/VisibleOnScreenEnabler2D.xml index 8590e9cc9f..68e510a6dc 100644 --- a/doc/classes/VisibleOnScreenEnabler2D.xml +++ b/doc/classes/VisibleOnScreenEnabler2D.xml @@ -24,7 +24,7 @@ Corresponds to [constant Node.PROCESS_MODE_ALWAYS]. </constant> <constant name="ENABLE_MODE_WHEN_PAUSED" value="2" enum="EnableMode"> - Corresponds to [constant Node.PROCESS_MODE_WHEN_PAUSED. + Corresponds to [constant Node.PROCESS_MODE_WHEN_PAUSED]. </constant> </constants> </class> diff --git a/doc/classes/VisibleOnScreenNotifier2D.xml b/doc/classes/VisibleOnScreenNotifier2D.xml index 32cb191067..c6a7bd5690 100644 --- a/doc/classes/VisibleOnScreenNotifier2D.xml +++ b/doc/classes/VisibleOnScreenNotifier2D.xml @@ -6,6 +6,7 @@ <description> The VisibleOnScreenNotifier2D detects when it is visible on the screen. It also notifies when its bounding rectangle enters or exits the screen or a viewport. If you want nodes to be disabled automatically when they exit the screen, use [VisibleOnScreenEnabler2D] instead. + [b]Note:[/b] VisibleOnScreenNotifier2D uses the render culling code to determine whether it's visible on screen, which also means that its [member CanvasItem.visible] must be [code]true[/code] to work correctly. </description> <tutorials> <link title="2D Dodge The Creeps Demo">https://godotengine.org/asset-library/asset/515</link> diff --git a/doc/classes/VisibleOnScreenNotifier3D.xml b/doc/classes/VisibleOnScreenNotifier3D.xml index 6dec09d03f..aecc3dd0d5 100644 --- a/doc/classes/VisibleOnScreenNotifier3D.xml +++ b/doc/classes/VisibleOnScreenNotifier3D.xml @@ -6,7 +6,7 @@ <description> The VisibleOnScreenNotifier3D detects when it is visible on the screen. It also notifies when its bounding rectangle enters or exits the screen or a [Camera3D]'s view. If you want nodes to be disabled automatically when they exit the screen, use [VisibleOnScreenEnabler3D] instead. - [b]Note:[/b] VisibleOnScreenNotifier3D uses an approximate heuristic for performance reasons. It doesn't take walls and other occlusion into account. The heuristic is an implementation detail and may change in future versions. If you need precise visibility checking, use another method such as adding an [Area3D] node as a child of a [Camera3D] node and/or [method Vector3.dot]. + [b]Note:[/b] VisibleOnScreenNotifier3D uses the render culling code to determine whether it's visible on screen, which also means that its [member Node3D.visible] must be [code]true[/code] to work correctly. </description> <tutorials> </tutorials> diff --git a/doc/classes/VoxelGI.xml b/doc/classes/VoxelGI.xml index 4347c5845f..cc78426736 100644 --- a/doc/classes/VoxelGI.xml +++ b/doc/classes/VoxelGI.xml @@ -5,6 +5,7 @@ </brief_description> <description> [VoxelGI]s are used to provide high-quality real-time indirect light and reflections to scenes. They precompute the effect of objects that emit light and the effect of static geometry to simulate the behavior of complex light in real-time. [VoxelGI]s need to be baked before having a visible effect. However, once baked, dynamic objects will receive light from them. Furthermore, lights can be fully dynamic or baked. + [b]Note:[/b] [VoxelGI] is only supported in the Forward+ rendering method, not Mobile or Compatibility. [b]Procedural generation:[/b] [VoxelGI] can be baked in an exported project, which makes it suitable for procedurally generated or user-built levels as long as all the geometry is generated in advance. For games where geometry is generated at any time during gameplay, SDFGI is more suitable (see [member Environment.sdfgi_enabled]). [b]Performance:[/b] [VoxelGI] is relatively demanding on the GPU and is not suited to low-end hardware such as integrated graphics (consider [LightmapGI] instead). To improve performance, adjust [member ProjectSettings.rendering/global_illumination/voxel_gi/quality] and enable [member ProjectSettings.rendering/global_illumination/gi/use_half_resolution] in the Project Settings. To provide a fallback for low-end hardware, consider adding an option to disable [VoxelGI] in your project's options menus. A [VoxelGI] node can be disabled by hiding it. [b]Note:[/b] Meshes should have sufficiently thick walls to avoid light leaks (avoid one-sided walls). For interior levels, enclose your level geometry in a sufficiently large box and bridge the loops to close the mesh. To further prevent light leaks, you can also strategically place temporary [MeshInstance3D] nodes with their [member GeometryInstance3D.gi_mode] set to [constant GeometryInstance3D.GI_MODE_STATIC]. These temporary nodes can then be hidden after baking the [VoxelGI] node. diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml index 14e705a7e6..92050eaa34 100644 --- a/doc/classes/Window.xml +++ b/doc/classes/Window.xml @@ -358,6 +358,7 @@ <description> Popups the [Window] at the center of the current screen, with optionally given minimum size. If the [Window] is embedded, it will be centered in the parent [Viewport] instead. + [b]Note:[/b] Calling it with the default value of [param minsize] is equivalent to calling it with [member size]. </description> </method> <method name="popup_centered_clamped"> @@ -367,6 +368,7 @@ <description> Popups the [Window] centered inside its parent [Window]. [code]fallback_ratio[/code] determines the maximum size of the [Window], in relation to its parent. + [b]Note:[/b] Calling it with the default value of [param minsize] is equivalent to calling it with [member size]. </description> </method> <method name="popup_centered_ratio"> diff --git a/doc/classes/XRInterface.xml b/doc/classes/XRInterface.xml index db65ce62f2..cdada35970 100644 --- a/doc/classes/XRInterface.xml +++ b/doc/classes/XRInterface.xml @@ -210,7 +210,7 @@ This interface supports quad rendering (not yet supported by Godot). </constant> <constant name="XR_VR" value="8" enum="Capabilities"> - this interface supports VR. + This interface supports VR. </constant> <constant name="XR_AR" value="16" enum="Capabilities"> This interface supports AR (video background and real world tracking). diff --git a/doc/translations/es.po b/doc/translations/es.po index 5624cb8668..66093519c4 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -5,7 +5,7 @@ # # 44pes Games <44pes.games@gmail.com>, 2020. # Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020, 2021. -# Javier Ocampos <xavier.ocampos@gmail.com>, 2020, 2021, 2022. +# Javier Ocampos <xavier.ocampos@gmail.com>, 2020, 2021, 2022, 2023. # Serk Lintur <serk.lintur@gmail.com>, 2020. # Lambientan <pedrogtzr@protonmail.com>, 2020. # paco <pacosoftfree@protonmail.com>, 2020, 2021. @@ -40,12 +40,15 @@ # Victor Stancioiu <victorstancioiu@gmail.com>, 2022. # yohanger <yohangerariel@gmail.com>, 2022. # Mateo <mfdez920@gmail.com>, 2023. +# Alan Arrecis <alan.arrecis@gmail.com>, 2023. +# Fernando Sacó <saco.fernando@gmail.com>, 2023. +# Damien Monasterios <monasterio13septiembre@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-01-12 06:06+0000\n" -"Last-Translator: Mateo <mfdez920@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/es/>\n" "Language: es\n" @@ -53,7 +56,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Description" msgstr "Descripción" @@ -64,11 +67,17 @@ msgstr "Tutoriales" msgid "Properties" msgstr "Propiedades" +msgid "Constructors" +msgstr "Constructores" + msgid "Methods" msgstr "Métodos" +msgid "Operators" +msgstr "Operadores" + msgid "Theme Properties" -msgstr "Propiedades del Theme" +msgstr "Propiedades del Tema" msgid "Signals" msgstr "Señales" @@ -82,9 +91,15 @@ msgstr "Constantes" msgid "Property Descriptions" msgstr "Descripciones de Propiedades" +msgid "Constructor Descriptions" +msgstr "Descripciones de Constructor" + msgid "Method Descriptions" msgstr "Descripciones de Métodos" +msgid "Operator Descriptions" +msgstr "Descripciones de Operador" + msgid "Theme Property Descriptions" msgstr "Descripciones de las propiedades del tema" @@ -148,84 +163,155 @@ msgstr "" msgid "Built-in GDScript functions." msgstr "Funciones GDScript integradas." -msgid "Converts from decibels to linear energy (audio)." -msgstr "Convierte de decibeles a energÃa lineal (audio)." - msgid "" -"Prints one or more arguments to strings in the best way possible to standard " -"error line.\n" -"[codeblock]\n" -"printerr(\"prints to stderr\")\n" -"[/codeblock]" +"A list of GDScript-specific utility functions accessed in any script.\n" +"For the list of the global functions and constants see [@GlobalScope]." msgstr "" -"Imprime uno o más argumentos a strings de la mejor manera posible a la lÃnea " -"de error estándar.\n" -"[codeblock]\n" -"printerr(\"Imprime a stderr\")\n" -"[/codeblock]" +"Una lista de funciones de utilidad de script especÃfico GD accedidas en " +"cualquier script.\n" +"Para la lista de funciones globales y constantes ver [@GlobalScope]." + +msgid "GDScript exports" +msgstr "Exportaciones de Scripts GD" msgid "" -"Prints one or more arguments to the console with a space between each " -"argument.\n" +"Returns a [Color] constructed from red ([param r8]), green ([param g8]), " +"blue ([param b8]), and optionally alpha ([param a8]) integer channels, each " +"divided by [code]255.0[/code] for their final value.\n" "[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # Prints A B C\n" +"var red = Color8(255, 0, 0) # Same as Color(1, 0, 0)\n" +"var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2).\n" +"var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4).\n" "[/codeblock]" msgstr "" -"Imprime uno o más argumentos en la consola con un espacio entre cada " -"argumento.\n" +"Devuelve un [Color] construido desde rojo ([param r8]), verde ([param " +"g8]), azul ([param b8]), y opcionalmente alfa ([param a8]) valores " +"enteros, cada uno dividido por [code]255.0[/code] por su valor final.\n" "[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # Imprime A B C\n" +"var red = Color8(255, 0, 0) # Igual que Color(1, 0, 0)\n" +"var dark_blue = Color8(0, 0, 51) # Igual que Color(0, 0, 0.2).\n" +"var my_color = Color8(306, 255, 0, 102) # Igual que Color(1.2, 1, 0, 0.4).\n" "[/codeblock]" msgid "" -"Prints one or more arguments to the console with a tab between each " -"argument.\n" +"Returns a single character (as a [String]) of the given Unicode code point " +"(which is compatible with ASCII code).\n" "[codeblock]\n" -"printt(\"A\", \"B\", \"C\") # Prints A B C\n" +"a = char(65) # a is \"A\"\n" +"a = char(65 + 32) # a is \"a\"\n" +"a = char(8364) # a is \"€\"\n" "[/codeblock]" msgstr "" -"Imprime uno o más argumentos en la consola con un tabulador entre cada " -"argumento.\n" +"Devuelve un carácter como una cadena de tipo Unicode (el cual es compatible " +"con el código ASCII).\n" "[codeblock]\n" -"printt(\"A\",\"B\",\"C\") # Imprime A\\tB\\tC\n" +"a = char(65) # a es \"A\"\n" +"a = char(65 + 32) # a es \"a\"\n" +"a = char(8364) # a es \"€\"\n" "[/codeblock]" msgid "" -"Pushes a warning message to Godot's built-in debugger and to the OS " -"terminal.\n" +"Returns an array with the given range. [method range] can be called in three " +"ways:\n" +"[code]range(n: int)[/code]: Starts from 0, increases by steps of 1, and " +"stops [i]before[/i] [code]n[/code]. The argument [code]n[/code] is " +"[b]exclusive[/b].\n" +"[code]range(b: int, n: int)[/code]: Starts from [code]b[/code], increases by " +"steps of 1, and stops [i]before[/i] [code]n[/code]. The arguments [code]b[/" +"code] and [code]n[/code] are [b]inclusive[/b] and [b]exclusive[/b], " +"respectively.\n" +"[code]range(b: int, n: int, s: int)[/code]: Starts from [code]b[/code], " +"increases/decreases by steps of [code]s[/code], and stops [i]before[/i] " +"[code]n[/code]. The arguments [code]b[/code] and [code]n[/code] are " +"[b]inclusive[/b] and [b]exclusive[/b], respectively. The argument [code]s[/" +"code] [b]can[/b] be negative, but not [code]0[/code]. If [code]s[/code] is " +"[code]0[/code], an error message is printed.\n" +"[method range] converts all arguments to [int] before processing.\n" +"[b]Note:[/b] Returns an empty array if no value meets the value constraint " +"(e.g. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n" +"Examples:\n" "[codeblock]\n" -"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " -"terminal as warning call\n" -"[/codeblock]" -msgstr "" -"EnvÃa un mensaje de aviso al depurador incorporado de Godot y al terminal " -"del sistema operativo.\n" +"print(range(4)) # Prints [0, 1, 2, 3]\n" +"print(range(2, 5)) # Prints [2, 3, 4]\n" +"print(range(0, 6, 2)) # Prints [0, 2, 4]\n" +"print(range(4, 1, -1)) # Prints [4, 3, 2]\n" +"[/codeblock]\n" +"To iterate over an [Array] backwards, use:\n" "[codeblock]\n" -"push_warning(\"test warning) # Imprime \"test warning\" al depurador y a la " -"terminal como una llamada de aviso.\n" -"[/codeblock]" - -msgid "" -"Returns a random unsigned 32-bit integer. Use remainder to obtain a random " -"value in the interval [code][0, N - 1][/code] (where N is smaller than " -"2^32).\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]\n" +"To iterate over [float], convert them in the loop.\n" +"[codeblock]\n" +"for i in range (3, 0, -1):\n" +" print(i / 10.0)\n" +"[/codeblock]\n" +"Output:\n" "[codeblock]\n" -"randi() # Returns random integer between 0 and 2^32 - 1\n" -"randi() % 20 # Returns random integer between 0 and 19\n" -"randi() % 100 # Returns random integer between 0 and 99\n" -"randi() % 100 + 1 # Returns random integer between 1 and 100\n" +"0.3\n" +"0.2\n" +"0.1\n" "[/codeblock]" msgstr "" -"Devuelve un entero aleatorio sin signo de 32 bits. Utiliza el resto para " -"obtener un valor aleatorio en el intervalo [code][0, N - 1][/code] (donde N " -"es menor que 2^32).\n" +"Devuelve un array con el rango dado. El método range puede ser invocado de " +"tres maneras:\n" +"[code]range(n: int)[/code]: Comienza desde 0, incrementa de 1 en 1, y para " +"[i]antes de[/i] [code]n[/code]. El argumento [code]n[/code] es [b]exclusivo[/" +"b].\n" +"[code]range(b: int, n: int)[/code]: Comienza desde [code]b[/code], " +"incrementa de 1 en 1, y para [i]antes de[/i] [code]n[/code]. Los argumentos " +"[code]b[/code] y [code]n[/code] son [b]inclusivo[/b] y [b]exclusivo[/b], " +"respectivamente.\n" +"[code]range(b: int, n: int, s: int)[/code]: Comiensa desde [code]b[/code], " +"incrementa o decrementa en pasos de [code]s[/code], y para [i]antes de[/i] " +"[code]n[/code]. Los argumentos [code]b[/code] y [code]n[/code] son " +"[b]inclusivo[/b] y [b]exclusivo[/b], respectivamente. El argumento [code]s[/" +"code] [b]puede[/b] ser negativo, pero no [code]0[/code]. Si [code]s[/code] " +"es [code]0[/code], se mostrará un mensaje de error.\n" +"El método range convierte todos los argumentos a [int] antes de procesarse.\n" +"[b]Note:[/b] Devuelve un array vacÃo si no encuentra el valor de control (v." +"g. [code]range(2, 5, -1)[/code] o [code]range(5, 5, 1)[/code]).\n" +"Ejemplos:\n" "[codeblock]\n" -"randi() # Devuelve un entero aleatorio entre 0 y 2^32 - 1.\n" -"randi() % 20 # Devuelve un entero aleatorio entre 0 y 19.\n" -"randi() % 100 # Devuelve un entero aleatorio entre 0 y 99.\n" -"randi() % 100 + 1 # Devuelve un entero aleatoria entre 1 y 100\n" +"print(range(4)) # Imprime [0, 1, 2, 3]\n" +"print(range(2, 5)) # Imprime [2, 3, 4]\n" +"print(range(0, 6, 2)) # Imprime [0, 2, 4]\n" +"print(range(4, 1, -1)) # Imprime [4, 3, 2]\n" +"[/codeblock]\n" +"Para iterar un [Array] hacia atrás, utilice:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Salida:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]\n" +"Para iterar sobre [float], conviertelos en el bucle.\n" +"[codeblock]\n" +"for i in range (3, 0, -1):\n" +" print(i / 10.0)\n" +"[/codeblock]\n" +"Salida:\n" +"[codeblock]\n" +"0.3\n" +"0.2\n" +"0.1\n" "[/codeblock]" +msgid "Converts from decibels to linear energy (audio)." +msgstr "Convierte de decibeles a energÃa lineal (audio)." + msgid "The [AudioServer] singleton." msgstr "El singleton [AudioServer]." @@ -1311,31 +1397,15 @@ msgstr "Si [code]true[/code], la textura se voltea horizontalmente." msgid "If [code]true[/code], texture is flipped vertically." msgstr "Si [code]true[/code], la textura se voltea verticalmente." -msgid "The displayed animation frame's index." -msgstr "El Ãndice del cuadro de animación mostrado." - msgid "The texture's drawing offset." msgstr "El desplazamiento al dibujar de la textura." -msgid "Emitted when [member frame] changed." -msgstr "Emitido cuando [member frame] cambió." - msgid "" "2D sprite node in 3D world, that can use multiple 2D textures for animation." msgstr "" "Nodo de sprites 2D en el mundo 3D, que puede usar múltiples texturas 2D para " "la animación." -msgid "" -"The current animation from the [code]frames[/code] resource. If this value " -"changes, the [code]frame[/code] counter is reset." -msgstr "" -"La animación actual del recurso [code]frames[/code]. Si este valor cambia, " -"el contador [code]frame[/code] se reinicia." - -msgid "The [SpriteFrames] resource containing the animation(s)." -msgstr "El recurso [SpriteFrames] que contiene la(s) animación(es)." - msgid "Proxy texture for simple frame-based animations." msgstr "Textura de conexión para animaciones simples basadas en fotogramas." @@ -1537,14 +1607,7 @@ msgstr "" "en su lugar." msgid "AnimationTree" -msgstr "AnimationTree" - -msgid "" -"Adds an input to the node. This is only useful for nodes created for use in " -"an [AnimationNodeBlendTree]." -msgstr "" -"Añade una entrada al nodo. Esto sólo es útil para los nodos creados para su " -"uso en un [AnimationNodeBlendTree]." +msgstr "Ãrbol de Animación" msgid "" "Blend another animation node (in case this node contains children animation " @@ -1582,17 +1645,6 @@ msgstr "Añade o elimina una ruta para el filtro." msgid "If [code]true[/code], filtering is enabled." msgstr "Si [code]true[/code], el filtrado está activado." -msgid "" -"Emitted by nodes that inherit from this class and that have an internal tree " -"when one of their nodes changes. The nodes that emit this signal are " -"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " -"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." -msgstr "" -"Emitidos por nodos que heredan de esta clase y que tienen un árbol interno " -"cuando uno de sus nodos cambia. Los nodos que emiten esta señal son " -"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " -"[AnimationNodeStateMachine], y [AnimationNodeBlendTree]." - msgid "Do not use filtering." msgstr "No utilice el filtrado." @@ -1734,6 +1786,13 @@ msgid "Returns the number of points on the blend axis." msgstr "Devuelve el número de puntos en el eje de la mezcla." msgid "" +"Controls the interpolation between animations. See [enum BlendMode] " +"constants." +msgstr "" +"Controla la interpolación entre las animaciones. Ver las constantes de [enum " +"BlendMode]." + +msgid "" "The blend space's axis's upper limit for the points' position. See [method " "add_blend_point]." msgstr "" @@ -1755,6 +1814,23 @@ msgstr "" msgid "Label of the virtual axis of the blend space." msgstr "Etiqueta del eje virtual del espacio de mezcla." +msgid "The interpolation between animations is linear." +msgstr "La interpolación entre las animaciones es lineal." + +msgid "" +"The blend space plays the animation of the node the blending position is " +"closest to. Useful for frame-by-frame 2D animations." +msgstr "" +"El espacio de mezcla reproduce la animación del nodo más cercano a la " +"posición de mezcla. Es útil para las animaciones 2D fotograma a fotograma." + +msgid "" +"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " +"the last animation's playback position." +msgstr "" +"Similar a [constant BLEND_MODE_DISCRETE], pero inicia la nueva animación en " +"la posición de reproducción de la última animación." + msgid "" "Blends linearly between three [AnimationNode] of any type placed in a 2D " "space." @@ -1795,13 +1871,6 @@ msgstr "" "add_blend_point] y [method remove_blend_point]." msgid "" -"Controls the interpolation between animations. See [enum BlendMode] " -"constants." -msgstr "" -"Controla la interpolación entre las animaciones. Ver las constantes de [enum " -"BlendMode]." - -msgid "" "The blend space's X and Y axes' upper limit for the points' position. See " "[method add_blend_point]." msgstr "" @@ -1831,23 +1900,6 @@ msgstr "" "Emitida cada vez que los triángulos del espacio de mezcla se crean, se " "eliminan, o cuando uno de sus vértices cambia de posición." -msgid "The interpolation between animations is linear." -msgstr "La interpolación entre las animaciones es lineal." - -msgid "" -"The blend space plays the animation of the node the blending position is " -"closest to. Useful for frame-by-frame 2D animations." -msgstr "" -"El espacio de mezcla reproduce la animación del nodo más cercano a la " -"posición de mezcla. Es útil para las animaciones 2D fotograma a fotograma." - -msgid "" -"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " -"the last animation's playback position." -msgstr "" -"Similar a [constant BLEND_MODE_DISCRETE], pero inicia la nueva animación en " -"la posición de reproducción de la última animación." - msgid "[AnimationTree] node resource that contains many blend type nodes." msgstr "" "[AnimationTree] es un recurso de nodos que contiene muchos nodos de tipo " @@ -2078,20 +2130,6 @@ msgid "Clears all queued, unplayed animations." msgstr "Limpia todas las colas, animaciones no reproducidas." msgid "" -"Gets the actual playing speed of current animation or 0 if not playing. This " -"speed is the [member playback_speed] property multiplied by " -"[code]custom_speed[/code] argument specified when calling the [method play] " -"method." -msgstr "" -"Obtiene la velocidad de ejecucion de la animacion actual o 0 sino esta " -"siendo reproducida. Esta velocidad es la propiedad [member playback_speed] " -"multiplicada por el argumento [code]custom_speed[/code] especificado cuando " -"se llama al metodo [method play]." - -msgid "Returns [code]true[/code] if playing an animation." -msgstr "Devuelve [code]true[/code] si se esta reproduciendo una animación." - -msgid "" "Queues an animation for playback once the current one is done.\n" "[b]Note:[/b] If a looped animation is currently playing, the queued " "animation will never play unless the looped animation is stopped somehow." @@ -2215,13 +2253,6 @@ msgstr "" "Si [code]true[/code], el área del bus de audio sobrescribe el bus de audio " "por defecto." -msgid "" -"The falloff factor for point gravity. The greater the value, the faster " -"gravity decreases with distance." -msgstr "" -"El factor de caÃda para la gravedad puntual. Cuanto mayor es el valor, más " -"rápido disminuye la gravedad con la distancia." - msgid "If [code]true[/code], other monitoring areas can detect this area." msgstr "" "Si [code]true[/code], otras áreas de monitoreo pueden detectar esta área." @@ -3147,11 +3178,6 @@ msgstr "" "Devuelve la [AudioEffectInstance] asignada al bus dado y los indices de " "efecto (y opcionalmente el canal)." -msgid "Returns the names of all audio devices detected on the system." -msgstr "" -"Devuelve los nombres de todos los dispositivos de audio detectados en el " -"sistema." - msgid "Returns the sample rate at the output of the [AudioServer]." msgstr "Devuelve la frecuencia de muestreo a la salida del [AudioServer]." @@ -3300,15 +3326,9 @@ msgstr "" "Devuelve el objeto [AudioStreamPlayback] asociado a este " "[AudioStreamPlayer2D]." -msgid "Dampens audio over distance with this as an exponent." -msgstr "Amortigua el audio a distancia con esto como exponente." - msgid "Maximum distance from which audio is still hearable." msgstr "Distancia máxima desde la que se puede oÃr el audio." -msgid "Base volume without dampening." -msgstr "Volumen de la base sin amortiguar." - msgid "" "Returns the [AudioStreamPlayback] object associated with this " "[AudioStreamPlayer3D]." @@ -3325,25 +3345,6 @@ msgstr "" "cuadrática, logarÃtmica, o no ser afectado por la distancia, desactivando " "efectivamente la atenuación." -msgid "The angle in which the audio reaches cameras undampened." -msgstr "El ángulo en el que el audio llega a las cámaras sin amortiguar." - -msgid "" -"If [code]true[/code], the audio should be dampened according to the " -"direction of the sound." -msgstr "" -"Si [code]true[/code], el audio debe ser amortiguado de acuerdo a la " -"dirección del sonido." - -msgid "Linear dampening of loudness according to distance." -msgstr "Amortiguación lineal de la sonido según la distancia." - -msgid "Squared dampening of loudness according to distance." -msgstr "Amortiguación cuadrada del sonido según la distancia." - -msgid "Logarithmic dampening of loudness according to distance." -msgstr "Amortiguación logarÃtmica del sonido según la distancia." - msgid "Disables doppler tracking." msgstr "Desactiva el rastreo doppler." @@ -6158,13 +6159,6 @@ msgstr "" "lo que hace cada una." msgid "" -"The size of the node's bounding rectangle, in pixels. [Container] nodes " -"update this property automatically." -msgstr "" -"El tamaño del rectángulo delimitador del nodo, en pÃxeles. Los nodos " -"[Container] actualizan esta propiedad automáticamente." - -msgid "" "Tells the parent [Container] nodes how they should resize and place the node " "on the X axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." @@ -6720,7 +6714,7 @@ msgid "Particles are drawn in order of remaining lifetime." msgstr "Las partÃculas se dibujan en orden según el tiempo de vida restante." msgid "Represents the size of the [enum Parameter] enum." -msgstr "Representa el tamaño del enum [enum Parameter]." +msgstr "Representa el tamaño del enumerado [enum Parameter]." msgid "Present for consistency with 3D particle nodes, not used in 2D." msgstr "" @@ -8756,6 +8750,11 @@ msgstr "" "Devuelve el ascenso de la fuente (número de pÃxeles por encima de la lÃnea " "de base)." +msgid "Returns the font descent (number of pixels below the baseline)." +msgstr "" +"Devuelve el descenso de la fuente (número de pÃxeles por debajo de la lÃnea " +"de base)." + msgid "A script implemented in the GDScript programming language." msgstr "Un guión implementado en el lenguaje de programación GDScript." @@ -8841,13 +8840,6 @@ msgstr "" "La mÃnima rotación en dirección positiva para soltarse y girar alrededor del " "eje X." -msgid "" -"The amount of rotational damping across the Y axis. The lower, the more " -"dampening occurs." -msgstr "" -"La cantidad de amortiguación rotacional a través del eje Y. Cuanto más bajo, " -"más amortiguación se produce." - msgid "If [code]true[/code], rotation across the Y axis is limited." msgstr "Si [code]true[/code], la rotación a través del eje Y está limitada." @@ -8887,13 +8879,6 @@ msgstr "" "La mÃnima rotación en dirección positiva para soltarse y girar alrededor del " "eje Y." -msgid "" -"The amount of rotational damping across the Z axis. The lower, the more " -"dampening occurs." -msgstr "" -"La cantidad de amortiguación rotacional a través del eje Z. Cuanto más bajo, " -"más amortiguación se produce." - msgid "If [code]true[/code], rotation across the Z axis is limited." msgstr "Si [code]true[/code], la rotación a través del eje Z está limitada." @@ -9149,13 +9134,6 @@ msgid "The speed of all rotations across the axes." msgstr "La velocidad de todas las rotaciones a través de los ejes." msgid "" -"The amount of rotational damping across the axes. The lower, the more " -"dampening occurs." -msgstr "" -"La cantidad de amortiguación rotacional a través de los ejes. Cuanto más " -"bajo, más amortiguación se produce." - -msgid "" "The amount of rotational restitution across the axes. The lower, the more " "restitution occurs." msgstr "" @@ -10130,7 +10108,7 @@ msgstr "" "parciales a un recurso." msgid "Represents the size of the [enum Method] enum." -msgstr "Representa el tamaño del enum [enum Method]." +msgstr "Representa el tamaño del enumerado [enum Method]." msgid "Status: Disconnected from the server." msgstr "Estado: Desconectado del servidor." @@ -11897,8 +11875,8 @@ msgstr "" msgid "" "Invalid ID constant. Returned if [constant RESOLVER_MAX_QUERIES] is exceeded." msgstr "" -"Constante de identificación inválida. Devuelta si se supera la constant " -"[constant RESOLVER_MAX_QUERIES]." +"Identificador de constante inválida. Devuelta si se supera el valor de la " +"constante RESOLVER_MAX_QUERIES" msgid "Address type: None." msgstr "Tipo de dirección: Ninguna." @@ -13826,32 +13804,19 @@ msgid "" "will not be visible in the scene tree, though it will be visible in the " "2D/3D view." msgstr "" -"Añade un nodo infantil. Los nodos pueden tener cualquier número de niños, " -"pero cada niño debe tener un nombre único. Los nodos hijos se eliminan " -"automáticamente cuando se elimina el nodo padre, por lo que una escena " -"entera puede ser eliminada eliminando su nodo superior.\n" -"Si [code]legible_unique_name[/code] es [code]true[/code], el nodo hijo " -"tendrá un nombre legible para los humanos basado en el nombre del nodo que " -"se instale en lugar de su tipo.\n" -"[b]Nota:[/b] Si el nodo hijo ya tiene un padre, la función fallará. Use " -"[method remove_child] primero para eliminar el nodo de su padre actual. Por " -"ejemplo:\n" -"[codeblock]\n" -"if child_node.get_parent():\n" -" child_node.get_parent().remove_child(child_node)\n" -"add_child(child_node)\n" -"[/codeblock]\n" -"Si necesita que el nodo hijo se añada debajo de un nodo especÃfico en la " -"lista de hijos, use [method add_sibling] en lugar de este método.\n" -"[b]Nota:[/b] Si quieres que un hijo sea perseguido en un [PackedScene], " -"debes establecer [member owner] además de llamar a [method add_child]. Esto " -"es tÃpicamente relevante para los scripts de la herramienta [url=https://" -"godot.readthedocs.io/es/latest/tutorials/misc/running_code_in_the_editor." -"html]tool[/url] y para los plugins de edición [/url] de [url=https://godot." -"readthedocs.io/es/latest/tutorials/plugins/editor/index.html]. Si se llama a " -"[method add_child] sin establecer [member owner], el [Node] recién agregado " -"no será visible en el árbol de la escena, aunque sà lo será en la vista " -"2D/3D." +"El nodo propietario. Un nodo puede tener cualquier otro nodo como " +"propietario (tanto como es un padre válido, abuelo, etc. ascendiendo en el " +"árbol). Cuando se guarda un nodo utilizando PackedScene, todos los nodos que " +"posee se guardarán con él. Esto permite la creación de complejos árboles de " +"Escena, con instanciación y subinstanciación.\n" +"[b]Nota:[/b] Si quieres que un hijo sea persistido a una PackedScene, debes " +"establecer [member_owner] además de llamar al método add_child. Esto es " +"tÃpicamente relevante para [url=$DOCS_URL/tutorials/plugins/" +"running_code_in_the_editor.html]tool scripts[/url] y [url=$DOCS_URL/" +"tutorials/plugins/editor/index.html]editor plugins[/url]\n" +"Si el método add_child es llamado sin configuración de miembro propietario, " +"el nodo nuevo añadido no será visible en el árbol de escena, aunque será " +"visible en la vista 2D/3D" msgid "" "The node's priority in the execution order of the enabled processing " @@ -14410,24 +14375,6 @@ msgstr "" "la depuración)." msgid "" -"Returns [code]true[/code] if the Godot binary used to run the project is a " -"[i]debug[/i] export template, or when running in the editor.\n" -"Returns [code]false[/code] if the Godot binary used to run the project is a " -"[i]release[/i] export template.\n" -"To check whether the Godot binary used to run the project is an export " -"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " -"instead." -msgstr "" -"Devuelve [code]true[/code] si el binario Godot utilizado para ejecutar el " -"proyecto es una plantilla de exportación [i]debug[/i], o cuando se ejecuta " -"en el editor.\n" -"Devuelve [code]false[/code] si el binario de Godot utilizado para ejecutar " -"el proyecto es una plantilla de exportación [i]release[/i].\n" -"Para comprobar si el binario Godot utilizado para ejecutar el proyecto es " -"una plantilla de exportación (depuración o liberación), utiliza en su lugar " -"[code]OS.has_feature(\"standalone\")[/code]." - -msgid "" "At the moment this function is only used by [code]AudioDriverOpenSL[/code] " "to request permission for [code]RECORD_AUDIO[/code] on Android." msgstr "" @@ -15638,23 +15585,6 @@ msgstr "" "Constante para establecer/obtener si el vector de gravedad de un área es una " "dirección, o un punto central." -msgid "" -"Constant to set/get the falloff factor for point gravity of an area. The " -"greater this value is, the faster the strength of gravity decreases with the " -"square of distance." -msgstr "" -"Constante para fijar/obtener el factor de caÃda para el punto de gravedad de " -"un área. Cuanto mayor es este valor, más rápido disminuye la fuerza de " -"gravedad con el cuadrado de la distancia." - -msgid "" -"This constant was used to set/get the falloff factor for point gravity. It " -"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]." -msgstr "" -"Esta constante se usó para fijar/obtener el factor de caÃda para la gravedad " -"puntual. Ha sido reemplazada por [constant " -"AREA_PARAM_GRAVITY_DISTANCE_SCALE]." - msgid "Constant to set/get the priority (order of processing) of an area." msgstr "" "Constante para establecer/obtener la prioridad (orden de procesamiento) de " @@ -15715,14 +15645,6 @@ msgid "Constant to set/get a body's gravity multiplier." msgstr "" "Constante para fijar/obtener el multiplicador de gravedad de un cuerpo." -msgid "Constant to set/get a body's linear dampening factor." -msgstr "" -"Constante para fijar/obtener el factor de amortiguación lineal de un cuerpo." - -msgid "Constant to set/get a body's angular dampening factor." -msgstr "" -"Constante para fijar/obtener el factor de amortiguación angular de un cuerpo." - msgid "Represents the size of the [enum BodyParameter] enum." msgstr "Representa el tamaño del enum [enum BodyParameter]." @@ -17995,13 +17917,6 @@ msgstr "" "ReflectionProbe.enable_shadows]." msgid "" -"Sets the size of the area that the reflection probe will capture. Equivalent " -"to [member ReflectionProbe.extents]." -msgstr "" -"Establece el tamaño del área que la sonda de reflexión capturará. " -"Equivalente a [member ReflectionProbe.extents]." - -msgid "" "Sets the intensity of the reflection probe. Intensity modulates the strength " "of the reflection. Equivalent to [member ReflectionProbe.intensity]." msgstr "" @@ -18108,12 +18023,6 @@ msgstr "" msgid "If [code]true[/code], the viewport's canvas is not rendered." msgstr "Si [code]true[/code], el canvas del viewport no se renderiza." -msgid "" -"If [code]true[/code], rendering of a viewport's environment is disabled." -msgstr "" -"Si [code]true[/code], se desactiva la renderización del entorno de un " -"viewport." - msgid "Sets the viewport's global transformation matrix." msgstr "Establece la matriz de transformación global del Viewport." @@ -18795,19 +18704,6 @@ msgstr "" "install_effect]." msgid "" -"If [code]true[/code], the label's height will be automatically updated to " -"fit its content.\n" -"[b]Note:[/b] This property is used as a workaround to fix issues with " -"[RichTextLabel] in [Container]s, but it's unreliable in some cases and will " -"be removed in future versions." -msgstr "" -"Si [code]true[/code], la altura de la etiqueta se actualizará " -"automáticamente para que se ajuste a su contenido.\n" -"[b]Nota:[/b] Esta propiedad se utiliza como solución provisional para " -"solucionar los problemas con [RichTextLabel] en los [Container]s, pero no es " -"fiable en algunos casos y se eliminará en futuras versiones." - -msgid "" "If [code]true[/code], the label underlines meta tags such as [code][url]" "{text}[/url][/code]." msgstr "" @@ -20187,15 +20083,6 @@ msgstr "" msgid "Modulates the color of the texture when this style box is drawn." msgstr "Modula el color de la textura cuando se dibuja este cuadro de estilo." -msgid "" -"Species a sub-region of the texture to use.\n" -"This is equivalent to first wrapping the texture in an [AtlasTexture] with " -"the same region." -msgstr "" -"Especifica una sub-región de la textura a utilizar.\n" -"Esto equivale a envolver primero la textura en un [AtlasTexture] con la " -"misma región." - msgid "The texture to use when drawing this style box." msgstr "La textura a usar al dibujar este cuadro de estilo." @@ -20361,15 +20248,6 @@ msgid "Sets [Material] to be used by the [Mesh] you are constructing." msgstr "" "Establece [Material] para ser usado por la [Mesh] que estás construyendo." -msgid "" -"Specifies whether the current vertex (if using only vertex arrays) or " -"current index (if also using index arrays) should use smooth normals for " -"normal calculation." -msgstr "" -"Especifica si el vértice actual (si se utilizan sólo arrays de vértices) o " -"el Ãndice actual (si también se utilizan arrays de Ãndices) debe utilizar " -"normales suaves para el cálculo normal." - msgid "Adds a new tab." msgstr "Añade una nueva pestaña." @@ -20605,14 +20483,6 @@ msgid "Returns [code]true[/code] if an \"undo\" action is available." msgstr "" "Devuelve [code]true[/code] si se dispone de una acción de \"deshacer\"." -msgid "" -"Triggers a right-click menu action by the specified index. See [enum " -"MenuItems] for a list of available indexes." -msgstr "" -"Desencadena una acción de menú con el botón derecho del ratón por el Ãndice " -"especificado. Véase [enum MenuItems] para una lista de los Ãndices " -"disponibles." - msgid "Perform redo operation." msgstr "Realiza la operación de rehacer." @@ -20718,11 +20588,6 @@ msgstr "" msgid "Sets the [StyleBox] of this [TextEdit]." msgstr "Establece el [StyleBox] de este [TextEdit]." -msgid "Returns the font descent (number of pixels below the baseline)." -msgstr "" -"Devuelve el descenso de la fuente (número de pÃxeles por debajo de la lÃnea " -"de base)." - msgid "Disables font hinting (smoother but less crisp)." msgstr "Desactiva la indicación de la fuente (más suave pero menos nÃtida)." @@ -21440,23 +21305,10 @@ msgstr "" "Se emite cuando se hace clic en una celda con la [constant TreeItem." "CELL_MODE_CUSTOM] para ser editada." -msgid "Emitted when an item's label is double-clicked." -msgstr "Se emite cuando se hace doble clic en la etiqueta de un artÃculo." - msgid "Emitted when an item is collapsed by a click on the folding arrow." msgstr "" "Se emite cuando un objeto se colapsa por un clic en la flecha de plegado." -msgid "" -"Emitted when a custom button is pressed (i.e. in a [constant TreeItem." -"CELL_MODE_CUSTOM] mode cell)." -msgstr "" -"Se emite cuando se pulsa un botón personalizado (es decir, en una celda de " -"modo [constant TreeItem.CELL_MODE_CUSTOM])." - -msgid "Emitted when an item's icon is double-clicked." -msgstr "Se emite cuando se hace doble clic en el icono de un elemento." - msgid "Emitted when an item is edited." msgstr "Emitido cuando se edita un artÃculo." @@ -22606,14 +22458,6 @@ msgstr "Se emite cuando termina la reproducción." msgid "[VideoStream] resource for Ogg Theora videos." msgstr "[VideoStream] recurso para los videos de Ogg Theora." -msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." -msgstr "" -"Devuelve el archivo de vÃdeo de Ogg Theora manejado por este " -"[VideoStreamTheora]." - -msgid "Returns the total transform of the viewport." -msgstr "Devuelve la transformada total de la vista." - msgid "Returns the visible rectangle in global screen coordinates." msgstr "Devuelve el RID del viewport del [VisualServer]." @@ -22852,7 +22696,7 @@ msgid "A shader for light calculations." msgstr "Un shader para cálculos de luz." msgid "Represents the size of the [enum Type] enum." -msgstr "Representa el tamaño del enum [enum Type]." +msgstr "Representa el tamaño del enumerado [enum Type]." msgid "Base class for nodes in a visual shader graph." msgstr "Clase base para nodos en un gráfico de shader visual." diff --git a/doc/translations/fr.po b/doc/translations/fr.po index a634b2005b..eef490fe13 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -184,80 +184,6 @@ msgstr "Génération de nombres aléatoires" msgid "Converts from decibels to linear energy (audio)." msgstr "Convertit les décibels en énergie linéaire (audio)." -msgid "" -"Prints one or more arguments to strings in the best way possible to standard " -"error line.\n" -"[codeblock]\n" -"printerr(\"prints to stderr\")\n" -"[/codeblock]" -msgstr "" -"Affiche un ou plusieurs arguments pour les chaînes de caractères de la " -"meilleure façon possible sur la ligne d'erreur.\n" -"[codeblock]\n" -"printerr(\"prints to stderr\")\n" -"[/codeblock]" - -msgid "" -"Prints one or more arguments to the console with a space between each " -"argument.\n" -"[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # Prints A B C\n" -"[/codeblock]" -msgstr "" -"Affiche un ou plusieurs argument dans la console intercalé d'un espace.\n" -"[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # Prints A B C\n" -"[/codeblock]" - -msgid "" -"Prints one or more arguments to the console with a tab between each " -"argument.\n" -"[codeblock]\n" -"printt(\"A\", \"B\", \"C\") # Prints A B C\n" -"[/codeblock]" -msgstr "" -"Affiche un ou plusieurs arguments dans la console intercalé de tabulations " -"entre chaque.\n" -"[codeblock]\n" -"printt(\"A\", \"B\", \"C\") # Prints A B C\n" -"[/codeblock]" - -msgid "" -"Pushes a warning message to Godot's built-in debugger and to the OS " -"terminal.\n" -"[codeblock]\n" -"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " -"terminal as warning call\n" -"[/codeblock]" -msgstr "" -"Renvoie un message d'alerte dans le déboguer de Godot et dans le terminal de " -"l'OS.\n" -"[codeblock]\n" -"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " -"terminal as warning call\n" -"[/codeblock]" - -msgid "" -"Returns a random unsigned 32-bit integer. Use remainder to obtain a random " -"value in the interval [code][0, N - 1][/code] (where N is smaller than " -"2^32).\n" -"[codeblock]\n" -"randi() # Returns random integer between 0 and 2^32 - 1\n" -"randi() % 20 # Returns random integer between 0 and 19\n" -"randi() % 100 # Returns random integer between 0 and 99\n" -"randi() % 100 + 1 # Returns random integer between 1 and 100\n" -"[/codeblock]" -msgstr "" -"Retourne un nombre entier positive aléatoire de 32 bits. Utilisez " -"l'opérateur modulo pour obtenir une valeur aléatoire dans l'intervalle [code]" -"[0, N - 1][/code] (où N est plus petit que 2^32).\n" -"[codeblock]\n" -"randi() # Retourne un nombre entier aléatoire entre 0 et 2^32 - 1\n" -"randi() % 20 # Retourne un nombre entier aléatoire entre 0 et 19\n" -"randi() % 100 # Retourne un nombre entier aléatoire entre 0 et 99\n" -"randi() % 100 + 1 # Retourne un nombre entier aléatoire entre 1 et 100\n" -"[/codeblock]" - msgid "The [AudioServer] singleton." msgstr "Le singleton [AudioServer]." @@ -1532,13 +1458,6 @@ msgstr "Animation Sprite 2D" msgid "2D Dodge The Creeps Demo" msgstr "Démo 2D « Dodge The Creeps »" -msgid "" -"The current animation from the [member frames] resource. If this value " -"changes, the [code]frame[/code] counter is reset." -msgstr "" -"L'animation actuelle de la ressource [member frames]. Si cette valeur " -"change, le compteur [code]frame[/code] est remis à zéro." - msgid "If [code]true[/code], texture will be centered." msgstr "Si [code]true[/code], la texture sera centrée." @@ -1548,8 +1467,8 @@ msgstr "Si [code]true[/code], la texture est inversée horizontalement." msgid "If [code]true[/code], texture is flipped vertically." msgstr "Si [code]vrai[/code], la texture est inversée verticalement." -msgid "The displayed animation frame's index." -msgstr "L'index de l'image d'animation affichée." +msgid "The texture's drawing offset." +msgstr "Le décalage du dessin de la texture." msgid "" "The [SpriteFrames] resource containing the animation(s). Allows you the " @@ -1560,12 +1479,6 @@ msgstr "" "charger, modifier, effacer, rendre unique et sauvegarder les états de la " "ressource [SpriteFrames]." -msgid "The texture's drawing offset." -msgstr "Le décalage du dessin de la texture." - -msgid "Emitted when [member frame] changed." -msgstr "Émis lorsque [member frame] modifié." - msgid "" "2D sprite node in 3D world, that can use multiple 2D textures for animation." msgstr "" @@ -1575,16 +1488,6 @@ msgstr "" msgid "2D Sprite animation (also applies to 3D)" msgstr "L'animation des sprites 2D (et aussi 3D)" -msgid "" -"The current animation from the [code]frames[/code] resource. If this value " -"changes, the [code]frame[/code] counter is reset." -msgstr "" -"L'animation actuelle de la ressource [code]frames[/code]. S'il y a un " -"changement dans la valeur, le compteur [code]frame[/code] est remis à zéro." - -msgid "The [SpriteFrames] resource containing the animation(s)." -msgstr "La ressource [SpriteFrames] qui contient l'animation." - msgid "Proxy texture for simple frame-based animations." msgstr "Texture procuration pour des animations simples basés sur les trames." @@ -1819,13 +1722,6 @@ msgstr "" "[code]nom : nÅ“ud[/code]." msgid "" -"Adds an input to the node. This is only useful for nodes created for use in " -"an [AnimationNodeBlendTree]." -msgstr "" -"Ajoute une entrée pour le nÅ“ud. Ceci est utile uniquement pour des nÅ“uds " -"crées pour l'usage dans un [AnimationNodeBlendTree]." - -msgid "" "Blend another animation node (in case this node contains children animation " "nodes). This function is only useful if you inherit from [AnimationRootNode] " "instead, else editors will not display your node for addition." @@ -1872,17 +1768,6 @@ msgstr "" msgid "If [code]true[/code], filtering is enabled." msgstr "Si [code]true[/code], le filtrage est activé." -msgid "" -"Emitted by nodes that inherit from this class and that have an internal tree " -"when one of their nodes changes. The nodes that emit this signal are " -"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " -"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." -msgstr "" -"Émis par les nÅ“uds qui héritent de cette classe ayant un arbre interne quand " -"un de leurs nÅ“uds change. Les nÅ“uds émettant ce signal sont des " -"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " -"[AnimationNodeStateMachine], et [AnimationNodeBlendTree]." - msgid "Do not use filtering." msgstr "Ne pas utiliser de filtrage." @@ -2028,6 +1913,13 @@ msgid "Returns the number of points on the blend axis." msgstr "Renvoie le nombre de points sur l'axe de mélange." msgid "" +"Controls the interpolation between animations. See [enum BlendMode] " +"constants." +msgstr "" +"Contrôle l'interpolation entre animations. Voir les constantes [enum " +"BlendMode]." + +msgid "" "The blend space's axis's upper limit for the points' position. See [method " "add_blend_point]." msgstr "" @@ -2047,6 +1939,23 @@ msgstr "Incrément de position (snap) quand un point est déplacé sur l'axe." msgid "Label of the virtual axis of the blend space." msgstr "Étiquette de l'axe virtuel de l'espace blend." +msgid "The interpolation between animations is linear." +msgstr "L'interpolation entre les animations est linéaire." + +msgid "" +"The blend space plays the animation of the node the blending position is " +"closest to. Useful for frame-by-frame 2D animations." +msgstr "" +"L'espace de mélange joue l'animation du nÅ“ud la position de mélange le plus " +"proche. Utilisable pour les animations 2D trame par trame." + +msgid "" +"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " +"the last animation's playback position." +msgstr "" +"Semblable à [constant BLEND_MODE_DISCRETE], mais commence la nouvelle " +"animation à la dernière position de lecture de l'animation suivante." + msgid "" "Blends linearly between three [AnimationNode] of any type placed in a 2D " "space." @@ -2088,13 +1997,6 @@ msgstr "" "add_blend_point] et [method remove_blend_point]." msgid "" -"Controls the interpolation between animations. See [enum BlendMode] " -"constants." -msgstr "" -"Contrôle l'interpolation entre animations. Voir les constantes [enum " -"BlendMode]." - -msgid "" "The blend space's X and Y axes' upper limit for the points' position. See " "[method add_blend_point]." msgstr "" @@ -2125,23 +2027,6 @@ msgstr "" "Émis à chaque création, suppression de triangles ou changement de position " "de l'un de leurs sommets dans le blend space." -msgid "The interpolation between animations is linear." -msgstr "L'interpolation entre les animations est linéaire." - -msgid "" -"The blend space plays the animation of the node the blending position is " -"closest to. Useful for frame-by-frame 2D animations." -msgstr "" -"L'espace de mélange joue l'animation du nÅ“ud la position de mélange le plus " -"proche. Utilisable pour les animations 2D trame par trame." - -msgid "" -"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " -"the last animation's playback position." -msgstr "" -"Semblable à [constant BLEND_MODE_DISCRETE], mais commence la nouvelle " -"animation à la dernière position de lecture de l'animation suivante." - msgid "" "This node may contain a sub-tree of any other blend type nodes, such as " "[AnimationNodeTransition], [AnimationNodeBlend2], [AnimationNodeBlend3], " @@ -2376,20 +2261,6 @@ msgid "Clears all queued, unplayed animations." msgstr "Efface toutes les animations en file d’attente et non joués." msgid "" -"Gets the actual playing speed of current animation or 0 if not playing. This " -"speed is the [member playback_speed] property multiplied by " -"[code]custom_speed[/code] argument specified when calling the [method play] " -"method." -msgstr "" -"Retourne la vitesse réelle de lecture de l'animation actuelle ou 0 si n'est " -"pas jouée. Cette vitesse est la propriété [member playback_speed] multipliée " -"par l'argument [code]custom_speed[/code] spécifié lors de l'appel de la " -"méthode [method play]." - -msgid "Returns [code]true[/code] if playing an animation." -msgstr "Retourne [code]true[/code] lors de la lecture d'une animation." - -msgid "" "Queues an animation for playback once the current one is done.\n" "[b]Note:[/b] If a looped animation is currently playing, the queued " "animation will never play unless the looped animation is stopped somehow." @@ -3552,9 +3423,6 @@ msgstr "" "Retourne le [AudioEffectInstance] assigné au bus et aux indices de l'effet " "donnés (et le canal en option)." -msgid "Returns the names of all audio devices detected on the system." -msgstr "Retourne les noms de tous les appareils audio détectés sur le système." - msgid "Returns the sample rate at the output of the [AudioServer]." msgstr "Retourne le débit de sortie du [AudioServer]." @@ -3590,22 +3458,6 @@ msgstr "" msgid "Number of available audio buses." msgstr "Nombre de bus audio disponibles." -msgid "" -"Name of the current device for audio output (see [method get_device_list]). " -"On systems with multiple audio outputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio output device. The value " -"[code]\"Default\"[/code] will play audio on the system-wide default audio " -"output. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." -msgstr "" -"Le nom du périphérique actuel pour la sortie audio (voir [method " -"get_device_list)]. Sur les systèmes avec plusieurs sorties audio (tels que " -"l'analogique, l'USB et l'audio par HDMI), cela peut être utilisé pour " -"sélectionner le périphérique de sortie de l'audio. La valeur " -"[code]\"Default\"[/code] jouera l'audio sur la sortie audio par défaut au " -"niveau du système. Si un nom de périphérique invalide est défini, la valeur " -"[code]\"Default\"[/code] sera retournée." - msgid "Emitted when the [AudioBusLayout] changes." msgstr "Émis lorsque le [AudioBusLayout] change." @@ -3790,15 +3642,9 @@ msgstr "" "une zone \"eau\" de sorte que les sons joués dans l'eau sont redirigés par " "un bus audio pour les faire sonner comme ils étaient joués sous l'eau." -msgid "Dampens audio over distance with this as an exponent." -msgstr "Atténue l'audio avec la distance avec cette valeur comme exposant." - msgid "Maximum distance from which audio is still hearable." msgstr "Distance maximale à laquelle cette piste audio peut être entendue." -msgid "Base volume without dampening." -msgstr "Volume de base sans amortissement." - msgid "Plays positional sound in 3D space." msgstr "Joue un son localisé dans un espace 3D." @@ -3809,16 +3655,6 @@ msgstr "" "Retourne l'objet [AudioStreamPlayback] associé avec ce [AudioStreamPlayer3D]." msgid "" -"Dampens audio using a low-pass filter above this frequency, in Hz. To " -"disable the dampening effect entirely, set this to [code]20500[/code] as " -"this frequency is above the human hearing limit." -msgstr "" -"Amortit l'audio en utilisant un filtre passe-bas au-dessus de la fréquence " -"spécifiée, en Hz. Pour désactiver entièrement l'effet d'amortissement, " -"définissez la fréquence à [code]20500[/code] car cette fréquence est " -"supérieure à la limite de l'audition humaine." - -msgid "" "Decides if audio should get quieter with distance linearly, quadratically, " "logarithmically, or not be affected by distance, effectively disabling " "attenuation." @@ -3834,16 +3670,6 @@ msgstr "" "Si [code]true[/code], la lecture commence dès que le AudioStreamPlayer3D est " "ajouté à la scène." -msgid "The angle in which the audio reaches cameras undampened." -msgstr "L'angle auquel la piste audio atteint les caméras sans atténuation." - -msgid "" -"If [code]true[/code], the audio should be dampened according to the " -"direction of the sound." -msgstr "" -"Si [code]true[/code], le piste audia devrait être atténuée par rapport à la " -"direction du son." - msgid "Sets the absolute maximum of the soundlevel, in decibels." msgstr "Définit le maximum absolu du niveau sonore, en décibels." @@ -3864,20 +3690,6 @@ msgstr "" "Le facteur pour l'effet d'atténuation. Des valeurs plus élevées rendent le " "son audible sur une distance plus grande." -msgid "The base sound level unaffected by dampening, in decibels." -msgstr "Le niveau sonore de base non affecté par l'amortissement, en décibels." - -msgid "Linear dampening of loudness according to distance." -msgstr "Atténuation linéaire de l'intensité sonore en fonction de la distance." - -msgid "Squared dampening of loudness according to distance." -msgstr "" -"Atténuation quadratique de l'intensité sonore en fonction de la distance." - -msgid "Logarithmic dampening of loudness according to distance." -msgstr "" -"Atténuation logarithmique de l'intensité sonore en fonction de la distance." - msgid "Disables doppler tracking." msgstr "Désactive le suivi doppler." @@ -6759,13 +6571,6 @@ msgstr "" "le rôle de chacun." msgid "" -"The size of the node's bounding rectangle, in pixels. [Container] nodes " -"update this property automatically." -msgstr "" -"La taille du rectangle englobant du nÅ“ud, en pixels. Les nÅ“uds [Container] " -"mettent à jour cette propriété automatiquement." - -msgid "" "Tells the parent [Container] nodes how they should resize and place the node " "on the X axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." @@ -13252,17 +13057,6 @@ msgstr "" "déjà le propriétaire du mutex." msgid "" -"Tries locking this [Mutex], but does not block. Returns [constant OK] on " -"success, [constant ERR_BUSY] otherwise.\n" -"[b]Note:[/b] This function returns [constant OK] if the thread already has " -"ownership of the mutex." -msgstr "" -"Essaie de verrouiller ce [Mutex], mais ne le bloque pas. Retourne [constant " -"OK] en cas de succès, [constant ERR_BUSY] sinon.\n" -"[b]Note :[/b] Cette fonction retourne [constant OK] si le fil d'exécution " -"est déjà associé à ce mutex." - -msgid "" "Unlocks this [Mutex], leaving it to other threads.\n" "[b]Note:[/b] If a thread called [method lock] or [method try_lock] multiple " "times while already having ownership of the mutex, it must also call [method " @@ -13275,35 +13069,6 @@ msgstr "" "déverrouiller correctement." msgid "" -"Returns this agent's current path from start to finish in global " -"coordinates. The path only updates when the target location is changed or " -"the agent requires a repath. The path array is not intended to be used in " -"direct path movement as the agent has its own internal path logic that would " -"get corrupted by changing the path array manually. Use the intended [method " -"get_next_location] once every physics frame to receive the next path point " -"for the agents movement as this function also updates the internal path " -"logic." -msgstr "" -"Retourne le chemin actuel de l'agent du début jusqu'à la fin, dans les " -"coordonnées globales. Le chemin ne met à jour que lorsque l'emplacement de " -"la cible est modifié ou que l'agent demande un re-calcul du chemin. Le " -"réseau de chemin n'est pas destiné à être utilisé dans le mouvement de " -"chemin direct car l'agent a sa propre logique de chemin interne qui serait " -"corrompu en changeant le réseau de chemin manuellement. Utilisez la [method " -"get_next_location] voulue une fois chaque trame de physique pour recevoir le " -"point de chemin suivant pour le mouvement des agents car cette fonction met " -"également à jour la logique du chemin interne." - -msgid "" -"Returns the reachable final location in global coordinates. This can change " -"if the navigation path is altered in any way. Because of this, it would be " -"best to check this each frame." -msgstr "" -"Retourne l'emplacement final accessible dans les coordonnées globales. Cela " -"peut changer si le chemin de navigation est modifié de quelque manière que " -"ce soit. Pour cette raison, il serait préférable de vérifier chaque trame." - -msgid "" "Returns the [RID] of the navigation map for this NavigationAgent node. This " "function returns always the map set on the NavigationAgent node and not the " "map of the abstract agent on the NavigationServer. If the agent map is " @@ -13322,20 +13087,6 @@ msgstr "" "NavigationServer." msgid "" -"Returns the next location in global coordinates that can be moved to, making " -"sure that there are no static objects in the way. If the agent does not have " -"a navigation path, it will return the position of the agent's parent. The " -"use of this function once every physics frame is required to update the " -"internal path logic of the NavigationAgent." -msgstr "" -"Retourne l'emplacement suivant dans les coordonnées globales qui peuvent " -"être déplacées, en s'assurant qu'il n'y a pas d'objets statiques dans le " -"chemin. Si l'agent n'a pas de chemin de navigation, il retourne la position " -"du parent de l'agent. L'utilisation de cette fonction une fois chaque trame " -"physique est nécessaire pour mettre à jour la logique de chemin interne de " -"la NavigationAgent." - -msgid "" "Sets the [RID] of the navigation map this NavigationAgent node should use " "and also updates the [code]agent[/code] on the NavigationServer." msgstr "" @@ -13380,15 +13131,6 @@ msgstr "" "à jour de la trame physique." msgid "" -"The maximum distance the agent is allowed away from the ideal path to the " -"final location. This can happen due to trying to avoid collisions. When the " -"maximum distance is exceeded, it recalculates the ideal path." -msgstr "" -"La distance maximale de l'agent est permise loin du chemin idéal jusqu'à " -"l'emplacement final. Cela peut arriver en essayant d'éviter les collisions. " -"Lorsque la distance maximale est dépassée, cela recalcule le chemin idéal." - -msgid "" "The distance threshold before the final target point is considered to be " "reached. This will allow an agent to not have to hit the point of the final " "target exactly, but only the area. If this value is set to low the " @@ -13403,9 +13145,6 @@ msgstr "" "chemin parce qu'il va constamment mal estimer la distance jusqu'au point " "suivant à chaque mise à jour de la trame physique." -msgid "Notifies when the final location is reached." -msgstr "Notifie quand l'emplacement final est atteint." - msgid "" "The NavigationAgent height offset is subtracted from the y-axis value of any " "vector path position for this NavigationAgent. The NavigationAgent height " @@ -15558,16 +15297,6 @@ msgstr "" "La constante pour définir/obtenir le facteur de multiplication de la gravité " "du corps." -msgid "Constant to set/get a body's linear dampening factor." -msgstr "" -"La constante pour définir/obtenir la facteur d'amortissement linéaire du " -"corps." - -msgid "Constant to set/get a body's angular dampening factor." -msgstr "" -"La constante pour définir/obtenir la facteur d'amortissement de rotation du " -"corps." - msgid "Represents the size of the [enum BodyParameter] enum." msgstr "Représente la taille de l'énumération [enum BodyParameter]." @@ -17464,12 +17193,6 @@ msgid "If [code]true[/code], the viewport's canvas is not rendered." msgstr "" "Si [code]true[/code], le canevas de la fenêtre d'affichage n'est pas rendu." -msgid "" -"If [code]true[/code], rendering of a viewport's environment is disabled." -msgstr "" -"Si [code]true[/code], le rendu de l'environnement de cette fenêtre " -"d'affichage est désactivé." - msgid "Sets the viewport's global transformation matrix." msgstr "" "Définit la matrice de transformation globale de la fenêtre d'affichage." @@ -18179,15 +17902,6 @@ msgstr "Position du deuxième point du segment." msgid "A synchronization semaphore." msgstr "Un sémaphore de synchronisation." -msgid "" -"Like [method wait], but won't block, so if the value is zero, fails " -"immediately and returns [constant ERR_BUSY]. If non-zero, it returns " -"[constant OK] to report success." -msgstr "" -"Comme [method wait], mais ne bloque pas, donc si la valeur est zéro, ça " -"échoue immédiatement et retourne [constant ERR_BUSY]. Si non zéro, ça " -"retourne [constant OK] pour signaler un succès." - msgid "The ray's length." msgstr "La longueur du rayon." @@ -19047,15 +18761,6 @@ msgid "Modulates the color of the texture when this style box is drawn." msgstr "" "Module la couleur de la texture lorsque cette boîte de style est dessinée." -msgid "" -"Species a sub-region of the texture to use.\n" -"This is equivalent to first wrapping the texture in an [AtlasTexture] with " -"the same region." -msgstr "" -"Spécifié la sous-région de la texture à utiliser.\n" -"C'est l'équivalent à d'abord mettre la texture dans un [AtlasTexture] avec " -"la même région." - msgid "The texture to use when drawing this style box." msgstr "La texture à utiliser pour l'affichage de cette boite de style." @@ -19202,16 +18907,6 @@ msgstr "" "utilisée." msgid "" -"Specifies whether the current vertex (if using only vertex arrays) or " -"current index (if also using index arrays) should use smooth normals for " -"normal calculation." -msgstr "" -"Spécifie si les sommets actuels (uniquement si seulement des tableaux de " -"sommets sont utilisés) ou l'index courant (si des tableaux d'index sont " -"également utilisés) devraient utiliser des normales lisses dans le calcul " -"des normales." - -msgid "" "Specifies a tangent to use for the [i]next[/i] vertex. If every vertex needs " "to have this information set and you fail to submit it for the first vertex, " "this information may not be used at all." @@ -19503,13 +19198,6 @@ msgstr "Retourne [code]true[/code] si une action « refaire » est disponible." msgid "Returns [code]true[/code] if an \"undo\" action is available." msgstr "Retourne [code]true[/code] si une action « annuler » est disponible." -msgid "" -"Triggers a right-click menu action by the specified index. See [enum " -"MenuItems] for a list of available indexes." -msgstr "" -"Déclenche une action de menu de clic droit par l’index spécifié. Voir [enum " -"MenuItems] pour une liste d’index disponibles." - msgid "Perform redo operation." msgstr "Effectue une opération refaire." @@ -20182,16 +19870,10 @@ msgstr "" "Émis quand une cellule en mode [constant TreeItem.CELL_MODE_CUSTOM] a été " "cliquée pour modifiée." -msgid "Emitted when an item's label is double-clicked." -msgstr "Émis quand la label d'un élément est double-cliqué." - msgid "Emitted when an item is collapsed by a click on the folding arrow." msgstr "" "Émis quand un élément est réduit via un clic sur le flèche de réduction." -msgid "Emitted when an item's icon is double-clicked." -msgstr "Émis quand l'icône d'un élément est double-cliqué." - msgid "Emitted when an item is edited." msgstr "Émis lors de la modification d’un élément." @@ -21152,18 +20834,6 @@ msgstr "Émis lorsque la lecture est terminée." msgid "[VideoStream] resource for Ogg Theora videos." msgstr "Ressource [VideoStream] pour les vidéos Ogg Theora." -msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." -msgstr "Retourne le fichier vidéo Ogg Theora géré par ce [VideoStreamTheora]." - -msgid "" -"Sets the Ogg Theora video file that this [VideoStreamTheora] resource " -"handles. The [code]file[/code] name should have the [code].ogv[/code] " -"extension." -msgstr "" -"Définit le fichier vidéo Ogg Theora que cette ressource [VideoStreamTheora] " -"supporte. Le nom de fichier [code]file[/code] doit avoir l'extension [code]." -"ogv[/code]." - msgid "" "Returns the first valid [World2D] for this viewport, searching the [member " "world_2d] property of itself and any Viewport ancestor." @@ -21171,9 +20841,6 @@ msgstr "" "Retourne le premier [World2D] valide de cette fenêtre d'affichage, en " "cherchant dans sa propriété [member world] ainsi que celle de ses parents." -msgid "Returns the total transform of the viewport." -msgstr "Retourne la transformation totale de la fenêtre d'affichage." - msgid "" "Returns the mouse's position in this [Viewport] using the coordinate system " "of this [Viewport]." @@ -21204,13 +20871,6 @@ msgid "Stops the input from propagating further down the [SceneTree]." msgstr "" "Arrête la propagation de l'entrée plus profondément dans le [SceneTree]." -msgid "" -"Moves the mouse pointer to the specified position in this [Viewport] using " -"the coordinate system of this [Viewport]." -msgstr "" -"Déplace le pointeur de la souris à la position spécifiée dans ce [Viewport] " -"en utilisant le système de coordonnées de ce [Viewport]." - msgid "If [code]true[/code], the viewport will process 2D audio streams." msgstr "Si [code]true[/code], la fenêtre d'affichage gèrera les flux audio 2D." diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index a93fabf919..d2d3354d48 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -60,11 +60,14 @@ # 烧风 <hk-shao@foxmail.com>, 2022. # Yan Chen <cyan97087@gmail.com>, 2022. # Caten <catenhu@gmail.com>, 2022. +# 风é’å±± <idleman@yeah.net>, 2023. +# zehuai wu <wuzehuai@gmail.com>, 2023. +# matrixant <yuan545@hotmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2023-01-09 20:42+0000\n" +"PO-Revision-Date: 2023-02-10 06:54+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -73,7 +76,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Description" msgstr "æè¿°" @@ -84,9 +87,15 @@ msgstr "教程" msgid "Properties" msgstr "属性" +msgid "Constructors" +msgstr "æž„é€ å‡½æ•°" + msgid "Methods" msgstr "方法" +msgid "Operators" +msgstr "æ“作符" + msgid "Theme Properties" msgstr "主题属性" @@ -102,9 +111,15 @@ msgstr "常é‡" msgid "Property Descriptions" msgstr "属性说明" +msgid "Constructor Descriptions" +msgstr "æž„é€ å‡½æ•°è¯´æ˜Ž" + msgid "Method Descriptions" msgstr "方法说明" +msgid "Operator Descriptions" +msgstr "æ“作符说明" + msgid "Theme Property Descriptions" msgstr "主题属性说明" @@ -159,88 +174,1059 @@ msgid "Built-in GDScript functions." msgstr "内置 GDScript 函数。" msgid "" +"A list of GDScript-specific utility functions accessed in any script.\n" +"For the list of the global functions and constants see [@GlobalScope]." +msgstr "" +"å¯åœ¨ä»»ä½•è„šæœ¬ä¸è®¿é—®çš„,GDScript专用的实用函数的列表。\n" +"有关全局函数和常é‡çš„列表,请å‚阅 [@GlobalScope]。" + +msgid "GDScript exports" +msgstr "GDScript的导出" + +msgid "" +"Returns a [Color] constructed from red ([param r8]), green ([param g8]), " +"blue ([param b8]), and optionally alpha ([param a8]) integer channels, each " +"divided by [code]255.0[/code] for their final value.\n" +"[codeblock]\n" +"var red = Color8(255, 0, 0) # Same as Color(1, 0, 0)\n" +"var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2).\n" +"var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4).\n" +"[/codeblock]" +msgstr "" +"返回一个由红([param r8])ã€ç»¿ï¼ˆ[param g8])ã€è“([param b8])和å¯é€‰çš„阿尔法" +"([param a8])整数通é“æž„é€ çš„ [Color],æ¯ä¸ªé€šé“除以 [code]255.0[/code],作为其" +"最终值。\n" +"[codeblock]\n" +"var red = Color8(255, 0, 0) # 与 Color(1, 0, 0) 相åŒ\n" +"var dark_blue = Color8(0, 0, 51) # 与 Color(0, 0, 0.2) 相åŒã€‚\n" +"var my_color = Color8(306, 255, 0, 102) # 与 Color(1.2, 1, 0, 0.4) 相åŒã€‚\n" +"[/codeblock]" + +msgid "" +"Asserts that the [param condition] is [code]true[/code]. If the [param " +"condition] is [code]false[/code], an error is generated. When running from " +"the editor, the running project will also be paused until you resume it. " +"This can be used as a stronger form of [method @GlobalScope.push_error] for " +"reporting errors to project developers or add-on users.\n" +"An optional [param message] can be shown in addition to the generic " +"\"Assertion failed\" message. You can use this to provide additional details " +"about why the assertion failed.\n" +"[b]Warning:[/b] For performance reasons, the code inside [method assert] is " +"only executed in debug builds or when running the project from the editor. " +"Don't include code that has side effects in an [method assert] call. " +"Otherwise, the project will behave differently when exported in release " +"mode.\n" +"[codeblock]\n" +"# Imagine we always want speed to be between 0 and 20.\n" +"var speed = -10\n" +"assert(speed < 20) # True, the program will continue\n" +"assert(speed >= 0) # False, the program will stop\n" +"assert(speed >= 0 and speed < 20) # You can also combine the two conditional " +"statements in one check\n" +"assert(speed < 20, \"the speed limit is 20\") # Show a message\n" +"[/codeblock]" +msgstr "" +"æ–言æ¡ä»¶ [param condition] 为 [code]true[/code]。如果æ¡ä»¶ [param condition] " +"为 [code]false[/code] ,则会生æˆä¸€ä¸ªé”™è¯¯ã€‚如果是从编辑器è¿è¡Œçš„,æ£åœ¨è¿è¡Œçš„项" +"目还会被暂åœï¼Œç›´åˆ°æ‰‹åŠ¨æ¢å¤ã€‚该函数å¯ä»¥ä½œä¸º [method @GlobalScope.push_error] " +"çš„åŠ å¼ºç‰ˆï¼Œç”¨äºŽå‘项目开å‘者或æ’件用户报错。\n" +"如果给出了å¯é€‰çš„ [param message] å‚数,在通用的“Assertion failedâ€æ¶ˆæ¯ä¹‹å¤–,还" +"会显示该信æ¯ã€‚ä½ å¯ä»¥ä½¿ç”¨å®ƒæ¥æ供关于æ–è¨€å¤±è´¥åŽŸå› çš„å…¶ä»–è¯¦ç»†ä¿¡æ¯ã€‚\n" +"[b]注æ„:[/b]出于对性能的考虑,[method assert] ä¸çš„代ç åªä¼šåœ¨è°ƒè¯•ç‰ˆæœ¬æˆ–者从编" +"辑器è¿è¡Œé¡¹ç›®æ—¶æ‰§è¡Œã€‚所以ä¸è¦åœ¨ [method assert] 调用ä¸åŠ 入具有副作用的代ç 。å¦" +"则,项目在以å‘行模å¼å¯¼å‡ºåŽå°†æœ‰ä¸ä¸€è‡´çš„行为。\n" +"[codeblock]\n" +"# 比如说我们希望 speed 始终在 0 å’Œ 20 之间。\n" +"speed = -10\n" +"assert(speed < 20) # True,程åºä¼šç»§ç»æ‰§è¡Œ\n" +"assert(speed >= 0) # False,程åºä¼šåœæ¢\n" +"assert(speed >= 0 && speed < 20) # ä½ è¿˜å¯ä»¥åœ¨å•æ¬¡æ–言ä¸åˆå¹¶ä¸¤ä¸ªæ¡ä»¶è¯å¥\n" +"assert(speed < 20, \"speed = %f, but the speed limit is 20\" % speed) # 在消" +"æ¯ä¸æ˜¾ç¤ºè¯¦æƒ…\n" +"[/codeblock]" + +msgid "" +"Returns a single character (as a [String]) of the given Unicode code point " +"(which is compatible with ASCII code).\n" +"[codeblock]\n" +"a = char(65) # a is \"A\"\n" +"a = char(65 + 32) # a is \"a\"\n" +"a = char(8364) # a is \"€\"\n" +"[/codeblock]" +msgstr "" +"返回给定的 Unicode ç ä½ï¼ˆä¸ŽASCIIç 兼容)的å•å—符å—符串(作为一个" +"[String])。\n" +"[codeblock]\n" +"a = char(65) # a 是“Aâ€\n" +"a = char(65 + 32) # a 是“aâ€\n" +"a = char(8364) # a 是“€â€\n" +"[/codeblock]" + +msgid "" +"Converts [param what] to [param type] in the best way possible. The [param " +"type] uses the [enum Variant.Type] values.\n" +"[codeblock]\n" +"var a = [4, 2.5, 1.2]\n" +"print(a is Array) # Prints true\n" +"\n" +"var b = convert(a, TYPE_PACKED_BYTE_ARRAY)\n" +"print(b) # Prints [4, 2, 1]\n" +"print(b is Array) # Prints false\n" +"[/codeblock]" +msgstr "" +"å°½å¯èƒ½ä»¥æœ€ä½³æ–¹å¼å°† [param what] 转æ¢ä¸º [param type]。[param type] 使用 [enum " +"Variant.Type] 值。\n" +"[codeblock]\n" +"var a = [4, 2.5, 1.2]\n" +"print(a is Array) # 输出 true\n" +"\n" +"var b = convert(a, TYPE_PACKED_BYTE_ARRAY)\n" +"print(b) # 输出 [4, 2, 1]\n" +"print(b is Array) # 输出 false\n" +"[/codeblock]" + +msgid "" +"Converts a [param dictionary] (created with [method inst_to_dict]) back to " +"an Object instance. Can be useful for deserializing." +msgstr "" +"将一个 [param dictionary] (用 [method inst_to_dict] 创建的)转æ¢å›žä¸ºä¸€ä¸ª " +"Object 实例。在ååºåˆ—化时å¯èƒ½å¾ˆæœ‰ç”¨ã€‚" + +msgid "" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" +"[codeblock]\n" +"func _ready():\n" +" foo()\n" +"\n" +"func foo():\n" +" bar()\n" +"\n" +"func bar():\n" +" print(get_stack())\n" +"[/codeblock]\n" +"Starting from [code]_ready()[/code], [code]bar()[/code] would print:\n" +"[codeblock]\n" +"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " +"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" +"[/codeblock]\n" +"[b]Note:[/b] This function only works if the running instance is connected " +"to a debugging server (i.e. an editor instance). [method get_stack] will not " +"work in projects exported in release mode, or in projects exported in debug " +"mode if not connected to a debugging server.\n" +"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing " +"so will return an empty array." +msgstr "" +"返回一个表示当å‰è°ƒç”¨å †æ ˆçš„å—典数组。å¦è¯·å‚阅 [method print_stack]。\n" +"[codeblock]\n" +"func _ready():\n" +" foo()\n" +"\n" +"func foo():\n" +" bar()\n" +"\n" +"func bar():\n" +" print(get_stack())\n" +"[/codeblock]\n" +"从 [code]_ready()[/code] 开始,[code]bar()[/code] 将打å°ï¼š\n" +"[codeblock]\n" +"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " +"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" +"[/codeblock]\n" +"[b]注æ„:[/b]åªæœ‰åœ¨è¿è¡Œçš„实例连接到调试æœåŠ¡å™¨ï¼ˆå³ç¼–辑器实例)åŽï¼Œè¯¥å‡½æ•°æ‰æœ‰" +"效。[method get_stack] ä¸é€‚用于以å‘布模å¼å¯¼å‡ºçš„项目;或者在未连接到调试æœåŠ¡å™¨" +"的情况下,以调试模å¼å¯¼å‡ºçš„项目。\n" +"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] 调用æ¤å‡½æ•°ã€‚è¿™æ ·åšå°†è¿”回一个空数组。" + +msgid "" +"Returns the passed [param instance] converted to a Dictionary. Can be useful " +"for serializing.\n" +"[b]Note:[/b] Cannot be used to serialize objects with built-in scripts " +"attached or objects allocated within built-in scripts.\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var d = inst_to_dict(self)\n" +" print(d.keys())\n" +" print(d.values())\n" +"[/codeblock]\n" +"Prints out:\n" +"[codeblock]\n" +"[@subpath, @path, foo]\n" +"[, res://test.gd, bar]\n" +"[/codeblock]" +msgstr "" +"è¿”å›žä¼ å…¥çš„ [param instance] 转æ¢ä¸ºçš„å—典。å¯ç”¨äºŽåºåˆ—化。\n" +"[b]注æ„:[/b]ä¸èƒ½ç”¨äºŽåºåˆ—åŒ–é™„åŠ äº†å†…ç½®è„šæœ¬çš„å¯¹è±¡ï¼Œæˆ–åœ¨å†…ç½®è„šæœ¬ä¸åˆ†é…的对象。\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var d = inst_to_dict(self)\n" +" print(d.keys())\n" +" print(d.values())\n" +"[/codeblock]\n" +"输出:\n" +"[codeblock]\n" +"[@subpath, @path, foo]\n" +"[, res://test.gd, bar]\n" +"[/codeblock]" + +msgid "" +"Returns the length of the given Variant [param var]. The length can be the " +"character count of a [String], the element count of any array type or the " +"size of a [Dictionary]. For every other Variant type, a run-time error is " +"generated and execution is stopped.\n" +"[codeblock]\n" +"a = [1, 2, 3, 4]\n" +"len(a) # Returns 4\n" +"\n" +"b = \"Hello!\"\n" +"len(b) # Returns 6\n" +"[/codeblock]" +msgstr "" +"返回给定 Variant [param var] 的长度。长度å¯ä»¥æ˜¯ [String] çš„å—符数ã€ä»»æ„数组类" +"åž‹çš„å…ƒç´ æ•°ã€æˆ– [Dictionary] 的大å°ç‰ã€‚对于所有其他 Variant 类型,都会生æˆè¿è¡Œ" +"时错误并åœæ¢æ‰§è¡Œã€‚\n" +"[codeblock]\n" +"a = [1, 2, 3, 4]\n" +"len(a) # 返回 4\n" +"\n" +"b = \"Hello!\"\n" +"len(b) # 返回 6\n" +"[/codeblock]" + +msgid "" +"Returns a [Resource] from the filesystem located at the absolute [param " +"path]. Unless it's already referenced elsewhere (such as in another script " +"or in the scene), the resource is loaded from disk on function call, which " +"might cause a slight delay, especially when loading large scenes. To avoid " +"unnecessary delays when loading something multiple times, either store the " +"resource in a variable or use [method preload].\n" +"[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " +"in the FileSystem dock and choosing \"Copy Path\" or by dragging the file " +"from the FileSystem dock into the script.\n" +"[codeblock]\n" +"# Load a scene called \"main\" located in the root of the project directory " +"and cache it in a variable.\n" +"var main = load(\"res://main.tscn\") # main will contain a PackedScene " +"resource.\n" +"[/codeblock]\n" +"[b]Important:[/b] The path must be absolute. A relative path will always " +"return [code]null[/code].\n" +"This function is a simplified version of [method ResourceLoader.load], which " +"can be used for more advanced scenarios.\n" +"[b]Note:[/b] Files have to be imported into the engine first to load them " +"using this function. If you want to load [Image]s at run-time, you may use " +"[method Image.load]. If you want to import audio files, you can use the " +"snippet described in [member AudioStreamMP3.data]." +msgstr "" +"从ä½äºŽç»å¯¹ [param path] 的文件系统ä¸è¿”回一个 [Resource]。除éžè¯¥èµ„æºå·²åœ¨å…¶ä»–地" +"方引用(例如在å¦ä¸€ä¸ªè„šæœ¬æˆ–场景ä¸ï¼‰ï¼Œå¦åˆ™èµ„æºæ˜¯åœ¨å‡½æ•°è°ƒç”¨æ—¶ä»Žç£ç›˜åŠ 载的,这å¯" +"èƒ½ä¼šå¯¼è‡´è½»å¾®çš„å»¶è¿Ÿï¼Œå°¤å…¶æ˜¯åœ¨åŠ è½½å¤§åž‹åœºæ™¯æ—¶ã€‚ä¸ºé¿å…åœ¨å¤šæ¬¡åŠ è½½æŸäº›å†…容时出现ä¸" +"å¿…è¦çš„延迟,å¯ä»¥å°†èµ„æºå˜å‚¨åœ¨å˜é‡ä¸æˆ–ä½¿ç”¨é¢„åŠ è½½ [method preload]。\n" +"[b]注æ„:[/b]资æºè·¯å¾„å¯ä»¥é€šè¿‡å³é”®å•å‡»æ–‡ä»¶ç³»ç»Ÿåœé é¢æ¿ä¸çš„资æºå¹¶é€‰æ‹©â€œå¤åˆ¶è·¯" +"径â€ï¼Œæˆ–将文件从文件系统åœé é¢æ¿æ‹–到脚本ä¸èŽ·å¾—。\n" +"[codeblock]\n" +"# åŠ è½½ä½äºŽé¡¹ç›®ç›®å½•æ ¹éƒ¨çš„一个å为“mainâ€çš„场景,并将其缓å˜åœ¨ä¸€ä¸ªå˜é‡ä¸ã€‚\n" +"var main = load(\"res://main.tscn\") # main 将包å«ä¸€ä¸ª PackedScene 资æºã€‚\n" +"[/codeblock]\n" +"[b]é‡è¦æ示:[/b]路径必须是ç»å¯¹è·¯å¾„。相对路径将始终返回 [code]null[/code]。\n" +"这个方法是 [method ResourceLoader.load] 的简化版,原版方法å¯ä»¥ç”¨äºŽæ›´é«˜çº§çš„场" +"景。\n" +"[b]注æ„:[/b]必须先将文件导入引擎æ‰èƒ½ä½¿ç”¨æ¤å‡½æ•°åŠ è½½å®ƒä»¬ã€‚å¦‚æžœä½ æƒ³åœ¨è¿è¡Œæ—¶åŠ " +"è½½ [Image]ï¼Œä½ å¯ä»¥ä½¿ç”¨ [method Image.load]。如果è¦å¯¼å…¥éŸ³é¢‘文件,å¯ä»¥ä½¿ç”¨ " +"[member AudioStreamMP3.data]ä¸æ述的代ç 片段。" + +msgid "" +"Returns a [Resource] from the filesystem located at [param path]. During run-" +"time, the resource is loaded when the script is being parsed. This function " +"effectively acts as a reference to that resource. Note that this function " +"requires [param path] to be a constant [String]. If you want to load a " +"resource from a dynamic/variable path, use [method load].\n" +"[b]Note:[/b] Resource paths can be obtained by right clicking on a resource " +"in the Assets Panel and choosing \"Copy Path\" or by dragging the file from " +"the FileSystem dock into the script.\n" +"[codeblock]\n" +"# Create instance of a scene.\n" +"var diamond = preload(\"res://diamond.tscn\").instantiate()\n" +"[/codeblock]" +msgstr "" +"从ä½äºŽ [param path] 的文件系统ä¸è¿”回一个 [Resource]。在è¿è¡Œæ—¶æœŸé—´ï¼Œè¯¥èµ„æºå°†åœ¨" +"解æžè„šæœ¬æ—¶åŠ 载。实际å¯ä»¥å°†è¿™ä¸ªå‡½æ•°è§†ä½œå¯¹è¯¥èµ„æºçš„引用。请注æ„,æ¤å‡½æ•°è¦æ±‚ " +"[param path] ä¸ºå¸¸é‡ [String]。如果è¦ä»ŽåŠ¨æ€/å¯å˜è·¯å¾„åŠ è½½èµ„æºï¼Œè¯·ä½¿ç”¨ [method " +"load]。\n" +"[b]注æ„:[/b]资æºè·¯å¾„å¯ä»¥é€šè¿‡å³é”®å•å‡»èµ„产é¢æ¿ä¸çš„资æºå¹¶é€‰æ‹©â€œå¤åˆ¶è·¯å¾„â€ï¼Œæˆ–通过" +"将文件从文件系统åœé é¢æ¿æ‹–到脚本ä¸æ¥èŽ·å¾—。\n" +"[codeblock]\n" +"# 创建场景的实例。\n" +"var diamond = preload(\"res://diamond.tscn\").instantiate()\n" +"[/codeblock]" + +msgid "" +"Like [method @GlobalScope.print], but includes the current stack frame when " +"running with the debugger turned on.\n" +"The output in the console may look like the following:\n" +"[codeblock]\n" +"Test print\n" +"At: res://test.gd:15:_process()\n" +"[/codeblock]\n" +"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing " +"so will instead print the thread ID." +msgstr "" +"与 [method @GlobalScope.print] 类似,但在打开调试器è¿è¡Œæ—¶è¿˜ä¼šåŒ…å«å½“å‰æ ˆå¸§ã€‚\n" +"控制å°ä¸çš„è¾“å‡ºåº”è¯¥æ˜¯ç±»ä¼¼è¿™æ ·çš„ï¼š\n" +"[codeblock]\n" +"Test print\n" +"At: res://test.gd:15:_process()\n" +"[/codeblock]\n" +"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] ä¸è°ƒç”¨æ¤æ–¹æ³•ã€‚调用时会输出线程 ID。" + +msgid "" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" +"The output in the console may look like the following:\n" +"[codeblock]\n" +"Frame 0 - res://test.gd:16 in function '_process'\n" +"[/codeblock]\n" +"[b]Note:[/b] This function only works if the running instance is connected " +"to a debugging server (i.e. an editor instance). [method print_stack] will " +"not work in projects exported in release mode, or in projects exported in " +"debug mode if not connected to a debugging server.\n" +"[b]Note:[/b] Calling this function from a [Thread] is not supported. Doing " +"so will instead print the thread ID." +msgstr "" +"输出当å‰ä»£ç ä½ç½®çš„æ ˆè¿½è¸ªã€‚å¦è¯·å‚阅 [method get_stack]。\n" +"控制å°ä¸çš„è¾“å‡ºæ˜¯ç±»ä¼¼è¿™æ ·çš„ï¼š\n" +"[codeblock]\n" +"Frame 0 - res://test.gd:16 in function '_process'\n" +"[/codeblock]\n" +"[b]注æ„:[/b]åªæœ‰åœ¨è¿è¡Œçš„实例连接到调试æœåŠ¡å™¨ï¼ˆå³ç¼–辑器实例)åŽï¼Œè¯¥å‡½æ•°æ‰æœ‰" +"效。[method print_stack] ä¸é€‚用于以å‘布模å¼å¯¼å‡ºçš„项目;或者在未连接到调试æœåŠ¡" +"器的情况下,以调试模å¼å¯¼å‡ºçš„项目。\n" +"[b]注æ„:[/b]ä¸æ”¯æŒä»Ž [Thread] 调用æ¤å‡½æ•°ã€‚è¿™æ ·åšå°†æ”¹ä¸ºæ‰“å°çº¿ç¨‹ ID。" + +msgid "" +"Returns an array with the given range. [method range] can be called in three " +"ways:\n" +"[code]range(n: int)[/code]: Starts from 0, increases by steps of 1, and " +"stops [i]before[/i] [code]n[/code]. The argument [code]n[/code] is " +"[b]exclusive[/b].\n" +"[code]range(b: int, n: int)[/code]: Starts from [code]b[/code], increases by " +"steps of 1, and stops [i]before[/i] [code]n[/code]. The arguments [code]b[/" +"code] and [code]n[/code] are [b]inclusive[/b] and [b]exclusive[/b], " +"respectively.\n" +"[code]range(b: int, n: int, s: int)[/code]: Starts from [code]b[/code], " +"increases/decreases by steps of [code]s[/code], and stops [i]before[/i] " +"[code]n[/code]. The arguments [code]b[/code] and [code]n[/code] are " +"[b]inclusive[/b] and [b]exclusive[/b], respectively. The argument [code]s[/" +"code] [b]can[/b] be negative, but not [code]0[/code]. If [code]s[/code] is " +"[code]0[/code], an error message is printed.\n" +"[method range] converts all arguments to [int] before processing.\n" +"[b]Note:[/b] Returns an empty array if no value meets the value constraint " +"(e.g. [code]range(2, 5, -1)[/code] or [code]range(5, 5, 1)[/code]).\n" +"Examples:\n" +"[codeblock]\n" +"print(range(4)) # Prints [0, 1, 2, 3]\n" +"print(range(2, 5)) # Prints [2, 3, 4]\n" +"print(range(0, 6, 2)) # Prints [0, 2, 4]\n" +"print(range(4, 1, -1)) # Prints [4, 3, 2]\n" +"[/codeblock]\n" +"To iterate over an [Array] backwards, use:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]\n" +"To iterate over [float], convert them in the loop.\n" +"[codeblock]\n" +"for i in range (3, 0, -1):\n" +" print(i / 10.0)\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"0.3\n" +"0.2\n" +"0.1\n" +"[/codeblock]" +msgstr "" +"返回给定范围的数组。[method range] 的调用方法有三ç§ï¼š\n" +"[code]range(n: int)[/code]:从 0 开始,æ¯æ¬¡åŠ 1,在到达 [code]n[/code] [i]之" +"å‰[/i]åœæ¢ã€‚[b]ä¸åŒ…å«[/b]å‚æ•° [code]n[/code]。\n" +"[code]range(b: int, n: int)[/code]:从 [code]b[/code] 开始,æ¯æ¬¡åŠ 1,在到达 " +"[code]n[/code] [i]之å‰[/i]åœæ¢ã€‚[b]包å«[/b]å‚æ•° [code]b[/code],[b]ä¸åŒ…å«[/b]" +"å‚æ•° [code]n[/code]。\n" +"[code]range(b: int, n: int, s: int)[/code]:从 [code]b[/code] 开始,æ¯æ¬¡åŠ " +"[code]s[/code],在到达 [code]n[/code] [i]之å‰[/i]åœæ¢ã€‚[b]包å«[/b]å‚æ•° " +"[code]b[/code],[b]ä¸åŒ…å«[/b]å‚æ•° [code]n[/code]。å‚æ•° [code]s[/code] [b]å¯" +"以[/b]为负数,但ä¸èƒ½ä¸º [code]0[/code]。如果 [code]s[/code] 为 [code]0[/" +"code],会输出一æ¡é”™è¯¯ã€‚\n" +"[method range] 会先将所有å‚数转æ¢ä¸º [int] å†è¿›è¡Œå¤„ç†ã€‚\n" +"[b]注æ„:[/b]如果ä¸å˜åœ¨æ»¡è¶³æ¡ä»¶çš„值,则返回空数组(例如 [code]range(2, 5, -1)" +"[/code] å’Œ [code]range(5, 5, 1)[/code])。\n" +"示例:\n" +"[codeblock]\n" +"print(range(4)) # 输出 [0, 1, 2, 3]\n" +"print(range(2, 5)) # 输出 [2, 3, 4]\n" +"print(range(0, 6, 2)) # 输出 [0, 2, 4]\n" +"print(range(4, 1, -1)) # 输出 [4, 3, 2]\n" +"[/codeblock]\n" +"åå‘é历 [Array] 请使用:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"输出:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]\n" +"è¦é历 [float],请在循环ä¸è½¬æ¢å®ƒä»¬ã€‚\n" +"[codeblock]\n" +"for i in range (3, 0, -1):\n" +" print(i / 10.0)\n" +"[/codeblock]\n" +"输出:\n" +"[codeblock]\n" +"0.3\n" +"0.2\n" +"0.1\n" +"[/codeblock]" + +msgid "" +"Returns [code]true[/code] if the given [Object]-derived class exists in " +"[ClassDB]. Note that [Variant] data types are not registered in [ClassDB].\n" +"[codeblock]\n" +"type_exists(\"Sprite2D\") # Returns true\n" +"type_exists(\"NonExistentClass\") # Returns false\n" +"[/codeblock]" +msgstr "" +"如果 [ClassDB] ä¸å˜åœ¨ç»™å®šçš„ [Object] 派生类,则返回 [code]true[/code]。请注" +"æ„,[Variant] æ•°æ®ç±»åž‹æœªåœ¨ [ClassDB] ä¸æ³¨å†Œã€‚\n" +"[codeblock]\n" +"type_exists(\"Sprite2D\") # 返回 true\n" +"type_exists(\"NonExistentClass\") # 返回 false\n" +"[/codeblock]" + +msgid "" +"Constant that represents how many times the diameter of a circle fits around " +"its perimeter. This is equivalent to [code]TAU / 2[/code], or 180 degrees in " +"rotations." +msgstr "" +"常é‡ï¼Œè¡¨ç¤ºåœ†çš„周长是直径的多少å€ã€‚相当于 [code]TAU / 2[/code],或以弧度表示的" +"180度。" + +msgid "" "The circle constant, the circumference of the unit circle in radians. This " "is equivalent to [code]PI * 2[/code], or 360 degrees in rotations." msgstr "" -"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚相当于 [code]PI * 2[/code]ï¼Œå³ 360 度的旋转" +"圆常é‡ï¼Œå•ä½åœ†çš„周长,å•ä½ä¸ºå¼§åº¦ã€‚相当于 [code]PI * 2[/code]ï¼Œå³ 360 度的弧度" "值。" +msgid "" +"Positive floating-point infinity. This is the result of floating-point " +"division when the divisor is [code]0.0[/code]. For negative infinity, use " +"[code]-INF[/code]. Dividing by [code]-0.0[/code] will result in negative " +"infinity if the numerator is positive, so dividing by [code]0.0[/code] is " +"not the same as dividing by [code]-0.0[/code] (despite [code]0.0 == -0.0[/" +"code] returning [code]true[/code]).\n" +"[b]Warning:[/b] Numeric infinity is only a concept with floating-point " +"numbers, and has no equivalent for integers. Dividing an integer number by " +"[code]0[/code] will not result in [constant INF] and will result in a run-" +"time error instead." +msgstr "" +"æ£æµ®ç‚¹æ— 穷大。这是除数为 [code]0.0[/code] æ—¶æµ®ç‚¹é™¤æ³•çš„ç»“æžœã€‚å¯¹äºŽè´Ÿæ— ç©·å¤§ï¼Œä½¿" +"用 [code]-INF[/code]。如果分å为æ£ï¼Œé™¤ä»¥ [code]-0.0[/code] å°†å¯¼è‡´è´Ÿæ— ç©·å¤§ï¼Œå› " +"æ¤é™¤ä»¥ [code]0.0[/code] 与除以 [code]-0.0[/code] ä¸åŒï¼ˆå°½ç®¡ [code]0.0 == " +"-0.0[/code] 返回 [code]true[/code])。\n" +"[b]è¦å‘Šï¼š[/b]æ•°å€¼æ— ç©·å¤§åªæ˜¯æµ®ç‚¹æ•°çš„一个概念,对于整数æ¥è¯´æ²¡æœ‰å¯¹åº”的概念。将整" +"数除以 [code]0[/code] ä¸ä¼šäº§ç”Ÿ [constant INF],而是会产生一个è¿è¡Œæ—¶é”™è¯¯ã€‚" + +msgid "" +"\"Not a Number\", an invalid floating-point value. [constant NAN] has " +"special properties, including that it is not equal to itself ([code]NAN == " +"NAN[/code] returns [code]false[/code]). It is output by some invalid " +"operations, such as dividing floating-point [code]0.0[/code] by [code]0.0[/" +"code].\n" +"[b]Warning:[/b] \"Not a Number\" is only a concept with floating-point " +"numbers, and has no equivalent for integers. Dividing an integer [code]0[/" +"code] by [code]0[/code] will not result in [constant NAN] and will result in " +"a run-time error instead." +msgstr "" +"“Not a Numberâ€ï¼ˆä¸æ˜¯ä¸€ä¸ªæ•°ï¼‰ï¼Œä¸€ä¸ªæ— 效的浮点数值。[constant NAN] 有许多特殊的" +"性质,包括它ä¸ç‰äºŽè‡ªèº«ï¼ˆ[code]NAN == NAN[/code] 返回 [code]false[/code])。它" +"æ˜¯ç”±ä¸€äº›æ— æ•ˆè¿ç®—输出的,例如将浮点数 [code]0.0[/code] 除以 [code]0.0[/" +"code]。\n" +"[b]è¦å‘Šï¼š[/b]“ä¸æ˜¯ä¸€ä¸ªæ•°â€åªæ˜¯æµ®ç‚¹æ•°çš„概念,整数ä¸æ²¡æœ‰å¯¹åº”的概念。将整数 " +"[code]0[/code] 除以 [code]0[/code] ä¸ä¼šäº§ç”Ÿ [constant NAN],而是会产生一个è¿" +"行时错误。" + +msgid "" +"Mark the following property as exported (editable in the Inspector dock and " +"saved to disk). To control the type of the exported property use the type " +"hint notation.\n" +"[codeblock]\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"[/codeblock]" +msgstr "" +"å°†ä»¥ä¸‹å±žæ€§æ ‡è®°ä¸ºå·²å¯¼å‡ºï¼ˆå¯åœ¨ Inspector Dock ä¸ç¼–辑并ä¿å˜åˆ°ç£ç›˜ï¼‰ã€‚è¦æŽ§åˆ¶å¯¼å‡º" +"属性的类型,请使用类型æ示表示法。\n" +"[codeblock]\n" +"@export var int_number = 5\n" +"@export var float_number: float = 5\n" +"[/codeblock]" + +msgid "" +"Define a new category for the following exported properties. This helps to " +"organize properties in the Inspector dock.\n" +"See also [constant PROPERTY_USAGE_CATEGORY].\n" +"[codeblock]\n" +"@export_category(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"[/codeblock]\n" +"[b]Note:[/b] Categories in the property list are supposed to indicate " +"different base types, so the use of this annotation is not encouraged. See " +"[annotation @export_group] and [annotation @export_subgroup] instead." +msgstr "" +"为以下导出的属性定义一个新类别。这有助于在检查器åœé æ ä¸ç»„织属性。\n" +"å¦è¯·å‚è§ [constant PROPERTY_USAGE_CATEGORY]。\n" +"[codeblock]\n" +"@export_category(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"[/codeblock]\n" +"[b]注æ„:[/b]属性列表ä¸çš„类别应该指示ä¸åŒçš„åŸºæœ¬ç±»åž‹ï¼Œå› æ¤ä¸é¼“励使用æ¤æ³¨è§£ã€‚请" +"å‚阅 [annotation @export_group] å’Œ [annotation @export_subgroup]。" + +msgid "" +"Export a [Color] property without transparency (its alpha fixed as " +"[code]1.0[/code]).\n" +"See also [constant PROPERTY_HINT_COLOR_NO_ALPHA].\n" +"[codeblock]\n" +"@export_color_no_alpha var modulate_color: Color\n" +"[/codeblock]" +msgstr "" +"导出一个没有é€æ˜Žåº¦çš„ [Color] 属性(它的 alpha 固定为 [code]1.0[/code])。\n" +"å¦è§ [constant PROPERTY_HINT_COLOR_NO_ALPHA]。\n" +"[codeblock]\n" +"@export_color_no_alpha var modulate_color: Color\n" +"[/codeblock]" + +msgid "" +"Export a [String] property as a path to a directory. The path will be " +"limited to the project folder and its subfolders. See [annotation " +"@export_global_dir] to allow picking from the entire filesystem.\n" +"See also [constant PROPERTY_HINT_DIR].\n" +"[codeblock]\n" +"@export_dir var sprite_folder: String\n" +"[/codeblock]" +msgstr "" +"å°† [String] 属性作为目录路径导出。该路径将被é™åˆ¶åœ¨é¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å文件夹ä¸ã€‚" +"请å‚阅 [annotation @export_global_dir],以å…许从整个文件系统ä¸è¿›è¡Œé€‰æ‹©ã€‚\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_DIR]。\n" +"[codeblock]\n" +"@export_dir var sprite_folder: String\n" +"[/codeblock]" + +msgid "" +"Export a floating-point property with an easing editor widget. Additional " +"hints can be provided to adjust the behavior of the widget. " +"[code]\"attenuation\"[/code] flips the curve, which makes it more intuitive " +"for editing attenuation properties. [code]\"positive_only\"[/code] limits " +"values to only be greater than or equal to zero.\n" +"See also [constant PROPERTY_HINT_EXP_EASING].\n" +"[codeblock]\n" +"@export_exp_easing var transition_speed\n" +"@export_exp_easing(\"attenuation\") var fading_attenuation\n" +"@export_exp_easing(\"positive_only\") var effect_power\n" +"[/codeblock]" +msgstr "" +"使用缓动编辑器å°éƒ¨ä»¶å¯¼å‡ºæµ®ç‚¹å±žæ€§ã€‚å¯ä»¥æä¾›é¢å¤–çš„æ示æ¥è°ƒæ•´å°éƒ¨ä»¶çš„行为。" +"[code]\"attenuation\"[/code] 翻转曲线,使编辑衰å‡å±žæ€§æ›´åŠ 直观。" +"[code]\"positive_only\"[/code] 将值é™åˆ¶ä¸ºä»…大于或ç‰äºŽé›¶ã€‚\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_EXP_EASING]。\n" +"[codeblock]\n" +"@export_exp_easing var transition_speed\n" +"@export_exp_easing(\"attenuation\") var fading_attenuation\n" +"@export_exp_easing(\"positive_only\") var effect_power\n" +"[/codeblock]" + +msgid "" +"Export a [String] property as a path to a file. The path will be limited to " +"the project folder and its subfolders. See [annotation @export_global_file] " +"to allow picking from the entire filesystem.\n" +"If [param filter] is provided, only matching files will be available for " +"picking.\n" +"See also [constant PROPERTY_HINT_FILE].\n" +"[codeblock]\n" +"@export_file var sound_effect_file: String\n" +"@export_file(\"*.txt\") var notes_file: String\n" +"[/codeblock]" +msgstr "" +"å°† [String] 属性导出为文件的路径。该路径将é™äºŽé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å文件夹。请å‚阅 " +"[annotation @export_global_file],以å…许从整个文件系统ä¸è¿›è¡Œé€‰æ‹©ã€‚\n" +"如果æ供了 [param filter],则åªæœ‰åŒ¹é…的文件å¯ä¾›é€‰æ‹©ã€‚\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_FILE]。\n" +"[codeblock]\n" +"@export_file var sound_effect_file: String\n" +"@export_file(\"*.txt\") var notes_file: String\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 2D navigation layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/2d_navigation/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_2D_NAVIGATION].\n" +"[codeblock]\n" +"@export_flags_2d_navigation var navigation_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 2D 导航层的ä½æ ‡å¿—å—段。检查器åœé æ ä¸çš„å°éƒ¨ä»¶ï¼Œå°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/2d_navigation/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_NAVIGATION]。\n" +"[codeblock]\n" +"@export_flags_2d_navigation var navigation_layers: int\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 2D physics layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/2d_physics/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_2D_PHYSICS].\n" +"[codeblock]\n" +"@export_flags_2d_physics var physics_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 2D 物ç†å±‚çš„ä½æ ‡å¿—å—段。检查器åœé æ ä¸çš„å°éƒ¨ä»¶ï¼Œå°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/2d_physics/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_PHYSICS]。\n" +"[codeblock]\n" +"@export_flags_2d_physics var physics_layers: int\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 2D render layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/2d_render/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_2D_RENDER].\n" +"[codeblock]\n" +"@export_flags_2d_render var render_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 2D 渲染层的ä½æ ‡å¿—å—段。检查器åœé æ ä¸çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/2d_render/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_2D_RENDER]。\n" +"[codeblock]\n" +"@export_flags_2d_render var render_layers: int\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 3D navigation layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/3d_navigation/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_3D_NAVIGATION].\n" +"[codeblock]\n" +"@export_flags_3d_navigation var navigation_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 3D 导航层的ä½æ ‡å¿—å—段。检查器åœé é¢æ¿ä¸çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/3d_navigation/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_NAVIGATION]。\n" +"[codeblock]\n" +"@export_flags_3d_navigation var navigation_layers: int\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 3D physics layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/3d_physics/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_3D_PHYSICS].\n" +"[codeblock]\n" +"@export_flags_3d_physics var physics_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 3D 物ç†å±‚çš„ä½æ ‡å¿—å—段。检查器åœé é¢æ¿ä¸çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/3d_physics/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_PHYSICS]。\n" +"[codeblock]\n" +"@export_flags_3d_physics var physics_layers: int\n" +"[/codeblock]" + +msgid "" +"Export an integer property as a bit flag field for 3D render layers. The " +"widget in the Inspector dock will use the layer names defined in [member " +"ProjectSettings.layer_names/3d_render/layer_1].\n" +"See also [constant PROPERTY_HINT_LAYERS_3D_RENDER].\n" +"[codeblock]\n" +"@export_flags_3d_render var render_layers: int\n" +"[/codeblock]" +msgstr "" +"将整数属性导出为 3D 渲染层的ä½æ ‡å¿—å—段。检查器åœé é¢æ¿ä¸çš„å°å·¥å…·å°†ä½¿ç”¨åœ¨ " +"[member ProjectSettings.layer_names/3d_render/layer_1] ä¸å®šä¹‰çš„层å称。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_LAYERS_3D_RENDER]。\n" +"[codeblock]\n" +"@export_flags_3d_render var render_layers: int\n" +"[/codeblock]" + +msgid "" +"Export a [String] property as a path to a directory. The path can be picked " +"from the entire filesystem. See [annotation @export_dir] to limit it to the " +"project folder and its subfolders.\n" +"See also [constant PROPERTY_HINT_GLOBAL_DIR].\n" +"[codeblock]\n" +"@export_global_dir var sprite_folder: String\n" +"[/codeblock]" +msgstr "" +"å°† [String] 属性导出为目录路径。å¯ä»¥ä»Žæ•´ä¸ªæ–‡ä»¶ç³»ç»Ÿä¸é€‰æ‹©è·¯å¾„。请å‚阅 " +"[annotation @export_dir] 以将其é™åˆ¶ä¸ºé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å文件夹。\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_GLOBAL_DIR]。\n" +"[codeblock]\n" +"@export_global_dir var sprite_folder: String\n" +"[/codeblock]" + +msgid "" +"Export a [String] property as a path to a file. The path can be picked from " +"the entire filesystem. See [annotation @export_file] to limit it to the " +"project folder and its subfolders.\n" +"If [param filter] is provided, only matching files will be available for " +"picking.\n" +"See also [constant PROPERTY_HINT_GLOBAL_FILE].\n" +"[codeblock]\n" +"@export_global_file var sound_effect_file: String\n" +"@export_global_file(\"*.txt\") var notes_file: String\n" +"[/codeblock]" +msgstr "" +"å°† [String] 属性作为文件路径导出。å¯ä»¥ä»Žæ•´ä¸ªæ–‡ä»¶ç³»ç»Ÿä¸é€‰æ‹©è·¯å¾„。请å‚阅 " +"[annotation @export_file],以将其é™åˆ¶ä¸ºé¡¹ç›®æ–‡ä»¶å¤¹åŠå…¶å文件夹。\n" +"如果æ供了 [param filter],则åªæœ‰åŒ¹é…的文件å¯ä¾›é€‰æ‹©ã€‚\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_GLOBAL_FILE]。\n" +"[codeblock]\n" +"@export_global_file var sound_effect_file: String\n" +"@export_global_file(\"*.txt\") var notes_file: String\n" +"[/codeblock]" + +msgid "" +"Define a new group for the following exported properties. This helps to " +"organize properties in the Inspector dock. Groups can be added with an " +"optional [param prefix], which would make group to only consider properties " +"that have this prefix. The grouping will break on the first property that " +"doesn't have a prefix. The prefix is also removed from the property's name " +"in the Inspector dock.\n" +"If no [param prefix] is provided, the every following property is added to " +"the group. The group ends when then next group or category is defined. You " +"can also force end a group by using this annotation with empty strings for " +"parameters, [code]@export_group(\"\", \"\")[/code].\n" +"Groups cannot be nested, use [annotation @export_subgroup] to add subgroups " +"within groups.\n" +"See also [constant PROPERTY_USAGE_GROUP].\n" +"[codeblock]\n" +"@export_group(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"\n" +"@export_group(\"Prefixed Properties\", \"prefix_\")\n" +"@export var prefix_number = 3\n" +"@export var prefix_string = \"\"\n" +"\n" +"@export_group(\"\", \"\")\n" +"@export var ungrouped_number = 3\n" +"[/codeblock]" +msgstr "" +"为以下导出的属性定义一个新组。这有助于在检查器åœé é¢æ¿ä¸ç»„织属性。å¯ä»¥ä½¿ç”¨å¯" +"选的 [param prefix] æ·»åŠ ç»„ï¼Œè¿™å°†ä½¿ç»„ä»…è€ƒè™‘å…·æœ‰æ¤å‰ç¼€çš„属性。分组将在第一个没" +"有å‰ç¼€çš„属性上ä¸æ–。å‰ç¼€ä¹Ÿå°†ä»Žæ£€æŸ¥å™¨åœé é¢æ¿ä¸çš„属性å称ä¸ç§»é™¤ã€‚\n" +"如果未æä¾› [param prefix],则将以下æ¯ä¸ªå±žæ€§æ·»åŠ 到组ä¸ã€‚当定义下一个组或类别" +"时,该组结æŸã€‚您还å¯ä»¥é€šè¿‡å°†æ¤æ³¨è§£ä¸Žç©ºå—符串的å‚数一起使用æ¥å¼ºåˆ¶ç»“æŸç»„," +"[code]@export_group(\"\", \"\")[/code]。\n" +"组ä¸èƒ½è¢«åµŒå¥—,使用 [annotation @export_subgroup] åœ¨ç»„å†…æ·»åŠ å组。\n" +"å¦è§ [constant PROPERTY_USAGE_GROUP]。\n" +"[codeblock]\n" +"@export_group(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"\n" +"@export_group(\"Prefixed Properties\", \"prefix_\")\n" +"@export var prefix_number = 3\n" +"@export var prefix_string = \"\"\n" +"\n" +"@export_group(\"\", \"\")\n" +"@export var ungrouped_number = 3\n" +"[/codeblock]" + +msgid "" +"Export a [String] property with a large [TextEdit] widget instead of a " +"[LineEdit]. This adds support for multiline content and makes it easier to " +"edit large amount of text stored in the property.\n" +"See also [constant PROPERTY_HINT_MULTILINE_TEXT].\n" +"[codeblock]\n" +"@export_multiline var character_biography\n" +"[/codeblock]" +msgstr "" +"用一个大的 [TextEdit] 部件而ä¸æ˜¯ [LineEdit] 导出一个 [String] å±žæ€§ã€‚è¿™å¢žåŠ äº†" +"对多行内容的支æŒï¼Œä½¿å…¶æ›´å®¹æ˜“编辑å˜å‚¨åœ¨å±žæ€§ä¸çš„大é‡æ–‡æœ¬ã€‚\n" +"å‚è§ [constant PROPERTY_HINT_MULTILINE_TEXT]。\n" +"[codeblock]\n" +"@export_multiline var character_biography\n" +"[/codeblock]" + +msgid "" +"Export a [String] property with a placeholder text displayed in the editor " +"widget when no value is present.\n" +"See also [constant PROPERTY_HINT_PLACEHOLDER_TEXT].\n" +"[codeblock]\n" +"@export_placeholder(\"Name in lowercase\") var character_id: String\n" +"[/codeblock]" +msgstr "" +"导出一个带有一个å ä½ç¬¦æ–‡æœ¬çš„ [String] 属性,当没有值时,编辑器å°éƒ¨ä»¶ä¸ä¼šæ˜¾ç¤º" +"该å ä½ç¬¦æ–‡æœ¬ã€‚\n" +"å¦è¯·å‚è§ [constant PROPERTY_HINT_PLACEHOLDER_TEXT]。\n" +"[codeblock]\n" +"@export_placeholder(\"Name in lowercase\") var character_id: String\n" +"[/codeblock]" + +msgid "" +"Define a new subgroup for the following exported properties. This helps to " +"organize properties in the Inspector dock. Subgroups work exactly like " +"groups, except they need a parent group to exist. See [annotation " +"@export_group].\n" +"See also [constant PROPERTY_USAGE_SUBGROUP].\n" +"[codeblock]\n" +"@export_group(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"\n" +"@export_subgroup(\"My Prefixed Properties\", \"prefix_\")\n" +"@export var prefix_number = 3\n" +"@export var prefix_string = \"\"\n" +"[/codeblock]\n" +"[b]Note:[/b] Subgroups cannot be nested, they only provide one extra level " +"of depth. Just like the next group ends the previous group, so do the " +"subsequent subgroups." +msgstr "" +"为接下æ¥çš„导出属性定义一个新的å组。这有助于组织检查器åœé é¢æ¿ä¸çš„属性。å组" +"的工作方å¼ä¸Žç»„å®Œå…¨ä¸€æ ·ï¼Œåªæ˜¯å®ƒä»¬éœ€è¦ä¸€ä¸ªçˆ¶ç»„æ‰èƒ½å˜åœ¨ã€‚请å‚阅 [annotation " +"@export_group]。\n" +"å¦è¯·å‚è§ [constant PROPERTY_USAGE_SUBGROUP]。\n" +"[codeblock]\n" +"@export_group(\"My Properties\")\n" +"@export var number = 3\n" +"@export var string = \"\"\n" +"\n" +"@export_subgroup(\"My Prefixed Properties\", \"prefix_\")\n" +"@export var prefix_number = 3\n" +"@export var prefix_string = \"\"\n" +"[/codeblock]\n" +"[b]注æ„:[/b]å组ä¸èƒ½åµŒå¥—,它们åªæ供一层é¢å¤–的深度。就åƒæ–°ç»„使å‰ä¸€ä¸ªç»„结æŸä¸€" +"æ ·ï¼ŒåŽç»çš„å组也会打æ–之å‰çš„å组。" + msgid "Random number generation" msgstr "éšæœºæ•°ç”Ÿæˆ" -msgid "Converts from decibels to linear energy (audio)." -msgstr "从分è´è½¬æ¢ä¸ºçº¿æ€§èƒ½é‡ï¼ˆéŸ³é¢‘)。" +msgid "" +"Returns the absolute value of a [Variant] parameter [param x] (i.e. non-" +"negative value). Supported types: [int], [float], [Vector2], [Vector2i], " +"[Vector3], [Vector3i], [Vector4], [Vector4i].\n" +"[codeblock]\n" +"var a = abs(-1)\n" +"# a is 1\n" +"\n" +"var b = abs(-1.2)\n" +"# b is 1.2\n" +"\n" +"var c = abs(Vector2(-3.5, -4))\n" +"# c is (3.5, 4)\n" +"\n" +"var d = abs(Vector2i(-5, -6))\n" +"# d is (5, 6)\n" +"\n" +"var e = abs(Vector3(-7, 8.5, -3.8))\n" +"# e is (7, 8.5, 3.8)\n" +"\n" +"var f = abs(Vector3i(-7, -8, -9))\n" +"# f is (7, 8, 9)\n" +"[/codeblock]\n" +"[b]Note:[/b] For better type safety, use [method absf], [method absi], " +"[method Vector2.abs], [method Vector2i.abs], [method Vector3.abs], [method " +"Vector3i.abs], [method Vector4.abs], or [method Vector4i.abs]." +msgstr "" +"返回一个 [Variant] 类型å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³éžè´Ÿå€¼ï¼‰ã€‚支æŒçš„类型:" +"[int]ã€[float]ã€[Vector2]ã€[Vector2i]ã€[Vector3]ã€[Vector3i]ã€[Vector4]ã€" +"[Vector4i] 。\n" +"[codeblock]\n" +"var a = abs(-1)\n" +"# a=1\n" +"\n" +"var b = abs(-1.2)\n" +"# b=1.2\n" +"\n" +"var c = abs(Vector2(-3.5, -4))\n" +"# c=(3.5, 4)\n" +"\n" +"var d = abs(Vector2i(-5, -6))\n" +"# d=(5, 6)\n" +"\n" +"var e = abs(Vector3(-7, 8.5, -3.8))\n" +"# e=(7, 8.5, 3.8)\n" +"\n" +"var f = abs(Vector3i(-7, -8, -9))\n" +"# f=(7, 8, 9)\n" +"[/codeblock]\n" +"[b]注æ„:[/b] 为了更好的类型安全,请使用 [method absf]ã€[method absi]ã€" +"[method Vector2.abs]ã€[method Vector2i.abs]ã€[method Vector3.abs]ã€[method " +"Vector3i.abs]ã€[method Vector4.abs] 或 [method Vector4i.abs]。" msgid "" -"Prints one or more arguments to strings in the best way possible to standard " -"error line.\n" +"Returns the absolute value of float parameter [param x] (i.e. positive " +"value).\n" "[codeblock]\n" -"printerr(\"prints to stderr\")\n" +"# a is 1.2\n" +"var a = absf(-1.2)\n" "[/codeblock]" msgstr "" -"以å¯èƒ½çš„最佳方å¼å°†ä¸€ä¸ªæˆ–多个å‚数作为å—ç¬¦ä¸²è¾“å‡ºåˆ°æ ‡å‡†é”™è¯¯è¡Œã€‚\n" +"返回浮点å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³æ£å€¼ï¼‰ã€‚\n" "[codeblock]\n" -"printerr(\"prints to stderr\")\n" +"# a=1.2\n" +"var a = absf(-1.2)\n" "[/codeblock]" msgid "" -"Prints one or more arguments to the console with a space between each " -"argument.\n" +"Returns the absolute value of int parameter [param x] (i.e. positive " +"value).\n" "[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # Prints A B C\n" +"# a is 1\n" +"var a = absi(-1)\n" "[/codeblock]" msgstr "" -"将一个或多个å‚数打å°åˆ°æŽ§åˆ¶å°ï¼Œæ¯ä¸ªå‚æ•°ä¹‹é—´æœ‰ä¸€ä¸ªç©ºæ ¼ã€‚\n" +"返回整数å‚æ•° [param x] çš„ç»å¯¹å€¼ï¼ˆå³æ£å€¼ï¼‰ã€‚\n" "[codeblock]\n" -"prints(\"A\", \"B\", \"C\") # 输出 A B C\n" +"# a=1\n" +"var a = absi(-1)\n" "[/codeblock]" msgid "" -"Prints one or more arguments to the console with a tab between each " -"argument.\n" +"Returns the arc cosine of [param x] in radians. Use to get the angle of " +"cosine [param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/" +"code] (inclusive), otherwise, [method acos] will return [constant @GDScript." +"NAN].\n" "[codeblock]\n" -"printt(\"A\", \"B\", \"C\") # Prints A B C\n" +"# c is 0.523599 or 30 degrees if converted with rad_to_deg(c)\n" +"var c = acos(0.866025)\n" "[/codeblock]" msgstr "" -"将一个或多个å‚数打å°åˆ°æŽ§åˆ¶å°ï¼Œæ¯ä¸ªå‚数之间有一个制表符。\n" +"返回 [param x] çš„å余弦,å•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å–余弦 [param x] 的角度。[param " +"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method " +"acos] 将返回 [constant @GDScript.NAN]。\n" "[codeblock]\n" -"printt(\"A\", \"B\", \"C\") # 输出 A B C\n" +"# 如果用 rad_to_deg(c) 转æ¢ï¼Œc为0.523599或30度\n" +"var c = acos(0.866025)\n" "[/codeblock]" msgid "" -"Pushes a warning message to Godot's built-in debugger and to the OS " -"terminal.\n" +"Returns the arc sine of [param x] in radians. Use to get the angle of sine " +"[param x]. [param x] must be between [code]-1.0[/code] and [code]1.0[/code] " +"(inclusive), otherwise, [method asin] will return [constant @GDScript.NAN].\n" "[codeblock]\n" -"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " -"terminal as warning call\n" +"# s is 0.523599 or 30 degrees if converted with rad_to_deg(s)\n" +"var s = asin(0.5)\n" "[/codeblock]" msgstr "" -"å°†è¦å‘Šæ¶ˆæ¯æŽ¨é€åˆ° Godot 的内置调试器和 OS 终端。\n" +"返回 [param x] çš„åæ£å¼¦å€¼ï¼Œå•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å–æ£å¼¦ [param x] 的角度。[param " +"x] 必须在 [code]-1.0[/code] å’Œ [code]1.0[/code](包括)之间,å¦åˆ™ [method " +"asin] 将返回 [constant @GDScript.NAN]。\n" "[codeblock]\n" -"push_warning(\"test warning\") # 以è¦å‘Šçš„å½¢å¼å‘调试器和终端输出 \"test " -"warning\"\n" +"# 如果用 rad_to_deg(s) 转æ¢ï¼Œs为0.523599或30度\n" +"var s = asin(0.5)\n" "[/codeblock]" msgid "" -"Returns a random unsigned 32-bit integer. Use remainder to obtain a random " -"value in the interval [code][0, N - 1][/code] (where N is smaller than " -"2^32).\n" +"Returns the arc tangent of [param x] in radians. Use it to get the angle " +"from an angle's tangent in trigonometry.\n" +"The method cannot know in which quadrant the angle should fall. See [method " +"atan2] if you have both [code]y[/code] and [code]x[/code].\n" +"[codeblock]\n" +"var a = atan(0.5) # a is 0.463648\n" +"[/codeblock]\n" +"If [param x] is between [code]-PI / 2[/code] and [code]PI / 2[/code] " +"(inclusive), [code]atan(tan(x))[/code] is equal to [param x]." +msgstr "" +"返回 [param x] çš„åæ£åˆ‡å€¼ï¼Œå•ä½æ˜¯å¼§åº¦ã€‚在三角函数ä¸ç”¨å®ƒæ¥å¾—到一个角上切线的角" +"度。\n" +"è¯¥æ–¹æ³•æ— æ³•ç¡®å®šè§’åº¦åº”è¯¥è½åœ¨å“ªä¸ªè±¡é™ã€‚å¦‚æžœä½ åŒæ—¶æ‹¥æœ‰ [code]y[/code] å’Œ " +"[code]x[/code],请å‚è§ [method atan2]。\n" +"[codeblock]\n" +"var a = atan(0.5) # a=0.463648\n" +"[/codeblock]\n" +"如果 [param x] 在 [code]-PI/2[/code] å’Œ [code]PI/2[/code](包括)之间," +"[code]atan(tan(x))[/code] ç‰äºŽ [param x]。" + +msgid "" +"Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle " +"of tangent [code]y/x[/code]. To compute the value, the method takes into " +"account the sign of both arguments in order to determine the quadrant.\n" +"Important note: The Y coordinate comes first, by convention.\n" "[codeblock]\n" -"randi() # Returns random integer between 0 and 2^32 - 1\n" -"randi() % 20 # Returns random integer between 0 and 19\n" -"randi() % 100 # Returns random integer between 0 and 99\n" -"randi() % 100 + 1 # Returns random integer between 1 and 100\n" +"var a = atan2(0, -1) # a is 3.141593\n" "[/codeblock]" msgstr "" -"返回一个éšæœºçš„æ— ç¬¦å· 32 ä½æ•´æ•°ã€‚使用余数获得区间 [code][0, N - 1][/code] (其" -"ä¸ N å°äºŽ 2^32)的éšæœºå€¼ã€‚\n" +"返回 [code]y/x[/code] çš„åæ£åˆ‡å€¼ï¼Œå•ä½ä¸ºå¼§åº¦ã€‚用æ¥èŽ·å¾—切线的角度 [code]y/x[/" +"code] 。为了计算该值,该方法考虑了两个å‚数的符å·ï¼Œä»¥ç¡®å®šè±¡é™ã€‚\n" +"é‡è¦æ示:按照惯例,Yåæ ‡åœ¨å‰ã€‚\n" "[codeblock]\n" -"randi() # 返回介于 0 到 2^32 - 1 之间的éšæœºæ•´æ•°\n" -"randi() % 20 # 返回介于 0 到 19之间的éšæœºæ•´æ•°\n" -"randi() % 100 # 返回介于 0 到 99 之间的éšæœºæ•´æ•°\n" -"randi() % 100 + 1 # 返回介于 1 到 100 之间的éšæœºæ•´æ•°\n" +"var a = atan2(0, -1) # a=3.141593\n" "[/codeblock]" +msgid "Converts from decibels to linear energy (audio)." +msgstr "从分è´è½¬æ¢ä¸ºçº¿æ€§èƒ½é‡ï¼ˆéŸ³é¢‘)。" + +msgid "" +"Rounds [param x] downward (towards negative infinity), returning the largest " +"whole number that is not more than [param x].\n" +"A type-safe version of [method floor], returning a [float]." +msgstr "" +"å°† [param x] å‘下èˆå…¥ï¼ˆå‘è´Ÿæ— ç©·å¤§ï¼‰ï¼Œè¿”å›žä¸è¶…过 [param x] 的最大整数。\n" +"一个类型安全的 [method floor] 版本,返回一个 [float]。" + +msgid "" +"Returns whether [param x] is a finite value, i.e. it is not [constant " +"@GDScript.NAN], positive infinity, or negative infinity." +msgstr "" +"返回 [param x] 是å¦ä¸ºæœ‰é™å€¼ï¼Œå³ä¸æ˜¯ [constant @GDScript.NAN]ã€æ£æ— ç©·å¤§æˆ–è´Ÿæ— " +"穷大。" + +msgid "" +"Returns [code]true[/code] if [param x] is either positive infinity or " +"negative infinity." +msgstr "如果 [param x] 是æ£æ— ç©·å¤§æˆ–è´Ÿæ— ç©·å¤§ï¼Œåˆ™è¿”å›ž [code]true[/code] 。" + +msgid "" +"Returns [code]true[/code] if the Object that corresponds to [param id] is a " +"valid object (e.g. has not been deleted from memory). All Objects have a " +"unique instance ID." +msgstr "" +"如果与 [param id] 对应的 Object 是有效的对象(例如没有从内å˜ä¸åˆ 除),则返回 " +"[code]true[/code] 。所有对象都有唯一的实例 ID。" + +msgid "" +"Returns [code]true[/code] if [param instance] is a valid Object (e.g. has " +"not been deleted from memory)." +msgstr "" +"如果 [param instance] 是有效的 Object(例如,没有从内å˜ä¸åˆ 除),则返回 " +"[code]true[/code] 。" + +msgid "" +"Returns [code]true[/code] if [param x] is a NaN (\"Not a Number\" or " +"invalid) value." +msgstr "如果 [param x] 是 NaN(“éžæ•°å—â€æˆ–æ— æ•ˆï¼‰å€¼ï¼Œåˆ™è¿”å›ž [code]true[/code] 。" + msgid "The [AudioServer] singleton." msgstr "[AudioServer] å•ä¾‹ã€‚" @@ -342,6 +1328,9 @@ msgstr "ESC 键。" msgid "Tab key." msgstr "Tab 键。" +msgid "Shift + Tab key." +msgstr "Shift + Tab 键。" + msgid "Backspace key." msgstr "é€€æ ¼é”®ã€‚" @@ -1079,6 +2068,98 @@ msgstr "忙碌错误。" msgid "Skip error." msgstr "跳过错误。" +msgid "" +"Hints that a vector property should allow its components to be linked. For " +"example, this allows [member Vector2.x] and [member Vector2.y] to be edited " +"together." +msgstr "" +"æ示å‘é‡å±žæ€§åº”该å…许分é‡é“¾æŽ¥ã€‚例如,这能够让 [member Vector2.x] å’Œ [member " +"Vector2.y] 被一起编辑。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 2D " +"render layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 2D 渲染层。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 2D " +"physics layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 2D 物ç†å±‚。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 2D " +"navigation layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 2D 导航层。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 3D " +"render layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 3D 渲染层。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 3D " +"physics layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 3D 物ç†å±‚。" + +msgid "" +"Hints that an [int] property is a bitmask using the optionally named 3D " +"navigation layers." +msgstr "æ示 [int] 属性为ä½æŽ©ç ,表示å¯å‘½åçš„ 3D 导航层。" + +msgid "" +"Hints that a [String] property is a path to a file. Editing it will show a " +"file dialog for picking the path. The hint string can be a set of filters " +"with wildcards like [code]\"*.png,*.jpg\"[/code]." +msgstr "" +"æ示 [String] 属性为文件的路径。编辑时会弹出选å–路径的文件对è¯æ¡†ã€‚æ示å—符串" +"å¯ä»¥è®¾ä¸ºä¸€ç»„带有通é…符的ç›é€‰å™¨ï¼Œä¾‹å¦‚ [code]\"*.png,*.jpg\"[/code]。" + +msgid "" +"Hints that a [String] property is a path to a directory. Editing it will " +"show a file dialog for picking the path." +msgstr "æ示 [String] 属性为目录的路径。编辑时会弹出选å–路径的文件对è¯æ¡†ã€‚" + +msgid "" +"Hints that a [String] property is an absolute path to a file outside the " +"project folder. Editing it will show a file dialog for picking the path. The " +"hint string can be a set of filters with wildcards, like [code]\"*.png,*." +"jpg\"[/code]." +msgstr "" +"æ示 [String] 属性为文件的ç»å¯¹è·¯å¾„,ä½äºŽé¡¹ç›®æ–‡ä»¶å¤¹ä¹‹å¤–。编辑时会弹出选å–路径" +"的文件对è¯æ¡†ã€‚æ示å—符串å¯ä»¥è®¾ä¸ºä¸€ç»„带有通é…符的ç›é€‰å™¨ï¼Œä¾‹å¦‚ [code]\"*.png,*." +"jpg\"[/code]。" + +msgid "" +"Hints that a [String] property is an absolute path to a directory outside " +"the project folder. Editing it will show a file dialog for picking the path." +msgstr "" +"æ示 [String] 属性为目录的ç»å¯¹è·¯å¾„,ä½äºŽé¡¹ç›®æ–‡ä»¶å¤¹ä¹‹å¤–。编辑时会弹出选å–路径" +"的文件对è¯æ¡†ã€‚" + +msgid "" +"Hints that a [String] property is text with line breaks. Editing it will " +"show a text input field where line breaks can be typed." +msgstr "" +"æ示 [String] 属性为包å«æ¢è¡Œçš„文本。编辑是会显示文本输入å—段,å¯ä»¥è¿›è¡Œæ¢è¡Œã€‚" + +msgid "Hints that a [String] property is an [Expression]." +msgstr "æ示 [String] 属性为 [Expression]。" + +msgid "" +"Hints that a [String] property should show a placeholder text on its input " +"field, if empty. The hint string is the placeholder text to use." +msgstr "" +"æ示 [String] 属性在为空时应当显示å ä½æ–‡æœ¬ã€‚æ示å—符串为所使用的å ä½æ–‡æœ¬ã€‚" + +msgid "" +"Hints that a quaternion property should disable the temporary euler editor." +msgstr "æ示四元数属性应当ç¦ç”¨ä¸´æ—¶æ¬§æ‹‰å€¼ç¼–辑器。" + +msgid "" +"Hints that a string property is a password, and every character is replaced " +"with the secret character." +msgstr "æ示å—符串属性为密ç ,æ¯ä¸€ä¸ªå—符都会被替æ¢ä¸ºç§˜å¯†å—符。" + msgid "The property is serialized and saved in the scene file (default)." msgstr "将属性åºåˆ—化并ä¿å˜åˆ°åœºæ™¯æ–‡ä»¶ä¸ï¼ˆé»˜è®¤ï¼‰ã€‚" @@ -1257,6 +2338,9 @@ msgstr "å‘é‡æ•°å¦" msgid "Advanced vector math" msgstr "高ç‰å‘é‡æ•°å¦" +msgid "Constructs an [AABB] as a copy of the given [AABB]." +msgstr "æž„é€ ç»™å®š [AABB] 的副本。" + msgid "Constructs an [AABB] from a position and size." msgstr "从一个ä½ç½®å’Œå¤§å°æž„é€ [AABB] 。" @@ -1450,13 +2534,6 @@ msgstr "2D ç²¾çµåŠ¨ç”»" msgid "2D Dodge The Creeps Demo" msgstr "2D Dodge The Creeps 演示" -msgid "" -"The current animation from the [member frames] resource. If this value " -"changes, the [code]frame[/code] counter is reset." -msgstr "" -"æ¥è‡ª [member frames] 资æºçš„当å‰åŠ¨ç”»ã€‚如果这个值å‘生å˜åŒ–,[code]frame[/code] " -"计数器会被é‡ç½®ã€‚" - msgid "If [code]true[/code], texture will be centered." msgstr "如果为 [code]true[/code],纹ç†å°†è¢«å±…ä¸ã€‚" @@ -1466,8 +2543,8 @@ msgstr "如果为 [code]true[/code],纹ç†å°†è¢«æ°´å¹³ç¿»è½¬ã€‚" msgid "If [code]true[/code], texture is flipped vertically." msgstr "如果为 [code]true[/code],纹ç†å°†è¢«åž‚直翻转。" -msgid "The displayed animation frame's index." -msgstr "显示的动画帧的索引。" +msgid "The texture's drawing offset." +msgstr "纹ç†çš„绘图å移é‡ã€‚" msgid "" "The [SpriteFrames] resource containing the animation(s). Allows you the " @@ -1477,12 +2554,6 @@ msgstr "" "包å«åŠ¨ç”»çš„ [SpriteFrames] 资æºã€‚å¯ä»¥å¯¹ [SpriteFrames] 资æºè¿›è¡ŒåŠ è½½ã€ç¼–辑ã€æ¸…" "空ã€å”¯ä¸€åŒ–ã€ä¿å˜çŠ¶æ€ç‰æ“作。" -msgid "The texture's drawing offset." -msgstr "纹ç†çš„绘图å移é‡ã€‚" - -msgid "Emitted when [member frame] changed." -msgstr "当 [member frame] 更改时å‘出。" - msgid "" "2D sprite node in 3D world, that can use multiple 2D textures for animation." msgstr "3D 世界ä¸çš„ 2D ç²¾çµèŠ‚点,å¯ä»¥ä½¿ç”¨å¤šä¸ª 2D 纹ç†è¿›è¡ŒåŠ¨ç”»å¤„ç†ã€‚" @@ -1490,16 +2561,6 @@ msgstr "3D 世界ä¸çš„ 2D ç²¾çµèŠ‚点,å¯ä»¥ä½¿ç”¨å¤šä¸ª 2D 纹ç†è¿›è¡ŒåŠ¨ç msgid "2D Sprite animation (also applies to 3D)" msgstr "2D ç²¾çµåŠ¨ç”»ï¼ˆä¹Ÿé€‚用于 3D)" -msgid "" -"The current animation from the [code]frames[/code] resource. If this value " -"changes, the [code]frame[/code] counter is reset." -msgstr "" -"æ¥è‡ª [code]frames[/code] 资æºçš„当å‰åŠ¨ç”»ã€‚如果这个值å‘生å˜åŒ–,[code]frame[/" -"code] 计数器会被é‡ç½®ã€‚" - -msgid "The [SpriteFrames] resource containing the animation(s)." -msgstr "包å«åŠ¨ç”»çš„ [SpriteFrames] 资æºã€‚" - msgid "Proxy texture for simple frame-based animations." msgstr "基于简å•å¸§åŠ¨ç”»çš„代ç†çº¹ç†ã€‚" @@ -1731,12 +2792,6 @@ msgstr "" "节点上显示过滤器编辑。" msgid "" -"Adds an input to the node. This is only useful for nodes created for use in " -"an [AnimationNodeBlendTree]." -msgstr "" -"ä¸ºèŠ‚ç‚¹æ·»åŠ ä¸€ä¸ªè¾“å…¥ã€‚è¿™åªå¯¹åˆ›å»ºç”¨äºŽ [AnimationNodeBlendTree] 的节点有用。" - -msgid "" "Blend another animation node (in case this node contains children animation " "nodes). This function is only useful if you inherit from [AnimationRootNode] " "instead, else editors will not display your node for addition." @@ -1778,16 +2833,6 @@ msgstr "" msgid "If [code]true[/code], filtering is enabled." msgstr "如果为 [code]true[/code],则å¯ç”¨ç›é€‰åŠŸèƒ½ã€‚" -msgid "" -"Emitted by nodes that inherit from this class and that have an internal tree " -"when one of their nodes changes. The nodes that emit this signal are " -"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " -"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." -msgstr "" -"ç”±ç»§æ‰¿è‡ªè¯¥ç±»ä¸”å†…éƒ¨æœ‰æ ‘çš„èŠ‚ç‚¹å‘出,当其一个节点å‘生å˜åŒ–时。å‘出æ¤ä¿¡å·çš„节点有 " -"[AnimationNodeBlendSpace1D]ã€[AnimationNodeBlendSpace2D]ã€" -"[AnimationNodeStateMachine] å’Œ [AnimationNodeBlendTree]。" - msgid "Do not use filtering." msgstr "ä¸è¦ä½¿ç”¨ç›é€‰åŠŸèƒ½ã€‚" @@ -1912,6 +2957,11 @@ msgid "Returns the number of points on the blend axis." msgstr "返回混åˆè½´ä¸Šçš„点的数é‡ã€‚" msgid "" +"Controls the interpolation between animations. See [enum BlendMode] " +"constants." +msgstr "控制动画之间的æ’å€¼ã€‚è§ [enum BlendMode] 常é‡ã€‚" + +msgid "" "The blend space's axis's upper limit for the points' position. See [method " "add_blend_point]." msgstr "æ··åˆç©ºé—´çš„轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。" @@ -1927,6 +2977,21 @@ msgstr "当在轴上移动一个点时,è¦æ•æ‰åˆ°çš„ä½ç½®å¢žé‡ã€‚" msgid "Label of the virtual axis of the blend space." msgstr "æ··åˆç©ºé—´è™šæ‹Ÿè½´çš„æ ‡ç¾ã€‚" +msgid "The interpolation between animations is linear." +msgstr "动画之间的æ’点是线性的。" + +msgid "" +"The blend space plays the animation of the node the blending position is " +"closest to. Useful for frame-by-frame 2D animations." +msgstr "æ··åˆç©ºé—´æ’放混åˆä½ç½®æœ€æŽ¥è¿‘的节点的动画。对é€å¸§çš„2D动画很有用。" + +msgid "" +"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " +"the last animation's playback position." +msgstr "" +"类似于 [constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„æ’放ä½ç½®å¼€å§‹æ–°çš„动" +"画。" + msgid "" "Blends linearly between three [AnimationNode] of any type placed in a 2D " "space." @@ -1963,11 +3028,6 @@ msgstr "" "新。" msgid "" -"Controls the interpolation between animations. See [enum BlendMode] " -"constants." -msgstr "控制动画之间的æ’å€¼ã€‚è§ [enum BlendMode] 常é‡ã€‚" - -msgid "" "The blend space's X and Y axes' upper limit for the points' position. See " "[method add_blend_point]." msgstr "æ··åˆç©ºé—´çš„ X è½´å’Œ Y 轴的点的ä½ç½®ä¸Šé™ã€‚è§ [method add_blend_point]。" @@ -1991,21 +3051,6 @@ msgid "" "one of their vertices changes position." msgstr "æ¯å½“创建ã€ç§»é™¤æ··åˆç©ºé—´çš„三角形,或当其ä¸ä¸€ä¸ªé¡¶ç‚¹æ”¹å˜ä½ç½®æ—¶å‘出。" -msgid "The interpolation between animations is linear." -msgstr "动画之间的æ’点是线性的。" - -msgid "" -"The blend space plays the animation of the node the blending position is " -"closest to. Useful for frame-by-frame 2D animations." -msgstr "æ··åˆç©ºé—´æ’放混åˆä½ç½®æœ€æŽ¥è¿‘的节点的动画。对é€å¸§çš„2D动画很有用。" - -msgid "" -"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " -"the last animation's playback position." -msgstr "" -"类似于 [constant BLEND_MODE_DISCRETE],但在最åŽä¸€ä¸ªåŠ¨ç”»çš„æ’放ä½ç½®å¼€å§‹æ–°çš„动" -"画。" - msgid "[AnimationTree] node resource that contains many blend type nodes." msgstr "[AnimationTree] 节点资æºï¼Œå…¶ä¸åŒ…å«è®¸å¤šæ··åˆç±»åž‹èŠ‚点。" @@ -2220,18 +3265,6 @@ msgid "Clears all queued, unplayed animations." msgstr "清除所有已排队ã€æœªæ’放的动画。" msgid "" -"Gets the actual playing speed of current animation or 0 if not playing. This " -"speed is the [member playback_speed] property multiplied by " -"[code]custom_speed[/code] argument specified when calling the [method play] " -"method." -msgstr "" -"获å–当å‰åŠ¨ç”»çš„实际æ’放速度,如果没有æ’放则为0。这个速度是调用[method play]æ–¹" -"法时指定的[member playback_speed]属性乘以[code]custom_speed[/code]å‚数。" - -msgid "Returns [code]true[/code] if playing an animation." -msgstr "如果æ£åœ¨æ’放动画,则返回 [code]true[/code]。" - -msgid "" "Queues an animation for playback once the current one is done.\n" "[b]Note:[/b] If a looped animation is currently playing, the queued " "animation will never play unless the looped animation is stopped somehow." @@ -2388,11 +3421,6 @@ msgid "" msgstr "如果为 [code]true[/code],该区域的音频总线将覆盖默认的音频总线。" msgid "" -"The falloff factor for point gravity. The greater the value, the faster " -"gravity decreases with distance." -msgstr "点é‡åŠ›çš„è¡°å‡ç³»æ•°ã€‚该值越大,é‡åŠ›å€¼éšè·ç¦»ä¸‹é™çš„速度就越快。" - -msgid "" "The rate at which objects stop moving in this area. Represents the linear " "velocity lost per second.\n" "See [member ProjectSettings.physics/2d/default_linear_damp] for more details " @@ -2489,6 +3517,9 @@ msgstr "" msgid "A generic array datatype." msgstr "通用数组数æ®ç±»åž‹ã€‚" +msgid "Constructs an empty [Array]." +msgstr "æž„é€ ç©ºçš„ [Array]。" + msgid "" "Appends an element at the end of the array (alias of [method push_back])." msgstr "å‘æ•°ç»„æœ«å°¾è¿½åŠ ä¸€ä¸ªå…ƒç´ ï¼ˆ[method push_back] 的别å)。" @@ -3289,6 +4320,9 @@ msgid "" "range from -30 to 0." msgstr "é™åˆ¶å™¨å¼€å§‹ç”Ÿæ•ˆçš„阈值,以分è´ä¸ºå•ä½ã€‚值的范围å¯ä»¥ä»Ž -30 到 0。" +msgid "Adds a low-pass filter to the audio bus." +msgstr "å‘éŸ³é¢‘æ€»çº¿æ·»åŠ ä¸€ä¸ªä½Žé€šæ»¤æ³¢å™¨ã€‚" + msgid "" "Cuts frequencies higher than the [member AudioEffectFilter.cutoff_hz] and " "allows lower frequencies to pass." @@ -3560,9 +4594,6 @@ msgid "" msgstr "" "返回分é…给给定总线和效果指数(以åŠå¯é€‰çš„通é“)的 [AudioEffectInstance]。" -msgid "Returns the names of all audio devices detected on the system." -msgstr "返回系统ä¸æ£€æµ‹åˆ°çš„所有音频设备的å称。" - msgid "Returns the sample rate at the output of the [AudioServer]." msgstr "返回 [AudioServer] è¾“å‡ºçš„é‡‡æ ·çŽ‡ã€‚" @@ -3596,19 +4627,6 @@ msgstr "解é”音频驱动程åºçš„主循环。(é”定åŽï¼Œä½ 始终需è¦æ‰‹ msgid "Number of available audio buses." msgstr "å¯ç”¨éŸ³é¢‘总线的数é‡ã€‚" -msgid "" -"Name of the current device for audio output (see [method get_device_list]). " -"On systems with multiple audio outputs (such as analog, USB and HDMI audio), " -"this can be used to select the audio output device. The value " -"[code]\"Default\"[/code] will play audio on the system-wide default audio " -"output. If an invalid device name is set, the value will be reverted back to " -"[code]\"Default\"[/code]." -msgstr "" -"当å‰éŸ³é¢‘输出设备åç§°ï¼ˆè§ [method get_device_list])。在具有多个音频输出的系统" -"ä¸ï¼ˆä¾‹å¦‚模拟ã€USBã€HDMI 音频),å¯ç”¨äºŽé€‰æ‹©éŸ³é¢‘输出设备。将值设为 " -"[code]\"Default\"[/code] 则会从系统默认的音频输出æ’æ”¾éŸ³é¢‘ã€‚å¦‚æžœè®¾ç½®äº†æ— æ•ˆçš„è®¾" -"备å称,该值会被æ¢å¤ä¸º [code]\"Default\"[/code]。" - msgid "Emitted when the [AudioBusLayout] changes." msgstr "当 [AudioBusLayout] 改å˜æ—¶å‘出。" @@ -3813,15 +4831,9 @@ msgstr "" "é‡å®šå‘,使其在特定的音频总线ä¸æ’放。一个例å是å¯ä»¥ç”¨æ¥åˆ¶ä½œâ€œæ°´åŸŸâ€ï¼Œå°†æ°´ä¸æ’放" "的声音é‡å®šå‘至å•ç‹¬çš„音频总线,让声音å¬èµ·æ¥åƒæ˜¯åœ¨æ°´ä¸‹æ’放。" -msgid "Dampens audio over distance with this as an exponent." -msgstr "以æ¤ä¸ºæŒ‡æ•°ï¼Œå°†å£°éŸ³åœ¨è·ç¦»ä¸Šè¿›è¡Œè¡°å‡ã€‚" - msgid "Maximum distance from which audio is still hearable." msgstr "音频ä»å¯å¬åˆ°çš„最大è·ç¦»ã€‚" -msgid "Base volume without dampening." -msgstr "基础音é‡ï¼Œæ— è¡°å‡ã€‚" - msgid "Plays positional sound in 3D space." msgstr "在 3D 空间ä¸æ’放与ä½ç½®ç›¸å…³çš„声音。" @@ -3830,14 +4842,6 @@ msgid "" "[AudioStreamPlayer3D]." msgstr "返回与这个 [AudioStreamPlayer3D] 相关è”çš„ [AudioStreamPlayback] 对象。" -msgid "" -"Dampens audio using a low-pass filter above this frequency, in Hz. To " -"disable the dampening effect entirely, set this to [code]20500[/code] as " -"this frequency is above the human hearing limit." -msgstr "" -"使用高于æ¤é¢‘率的低通滤波器衰å‡éŸ³é¢‘,以 Hz 为å•ä½ã€‚è¦å®Œå…¨ç¦ç”¨é˜»å°¼æ•ˆæžœï¼Œè¯·å°†å…¶" -"设置为 [code]20500[/code]ï¼Œå› ä¸ºè¯¥é¢‘çŽ‡é«˜äºŽäººç±»å¬åŠ›æžé™ã€‚" - msgid "Amount how much the filter affects the loudness, in decibels." msgstr "滤波器对å“度的影å“程度,以分è´ä¸ºå•ä½ã€‚" @@ -3869,21 +4873,6 @@ msgstr "" "æ ¡éªŒã€‚è¿™æ˜¯å› ä¸ºéŸ³é¢‘æ€»çº¿å¸ƒå±€å¯ä»¥åœ¨è®¾ç½®è¿™ä¸ªå±žæ€§åŽå†åŠ 载。如果这个给定的å称在è¿" "è¡Œæ—¶æ— æ³•è§£æžï¼Œå°±ä¼šå›žé€€åˆ° [code]\"Master\"[/code]。" -msgid "The angle in which the audio reaches cameras undampened." -msgstr "音频到达相机的角度,ä¸å—è¡°å‡ã€‚" - -msgid "" -"If [code]true[/code], the audio should be dampened according to the " -"direction of the sound." -msgstr "如果为 [code]true[/code]ï¼Œåˆ™åº”æ ¹æ®å£°éŸ³çš„æ–¹å‘对音频进行衰å‡ã€‚" - -msgid "" -"Dampens audio if camera is outside of [member emission_angle_degrees] and " -"[member emission_angle_enabled] is set by this factor, in decibels." -msgstr "" -"å¦‚æžœæ ·æœºåœ¨ [member emission_angle_degrees] 之外,并且 [member " -"emission_angle_enabled] 被设置为这个系数,则对音频进行å‡å¼±ï¼Œå•ä½æ˜¯åˆ†è´ã€‚" - msgid "Sets the absolute maximum of the soundlevel, in decibels." msgstr "设置声级的ç»å¯¹æœ€å¤§å€¼ï¼Œä»¥åˆ†è´ä¸ºå•ä½ã€‚" @@ -3902,29 +4891,6 @@ msgid "" "over a larger distance." msgstr "è¡°å‡æ•ˆæžœçš„系数。更高的值使声音在更远的è·ç¦»å¯ä»¥å¬åˆ°ã€‚" -msgid "The base sound level unaffected by dampening, in decibels." -msgstr "ä¸å—阻尼影å“的基本声级,å•ä½ä¸ºåˆ†è´ã€‚" - -msgid "Linear dampening of loudness according to distance." -msgstr "æ ¹æ®è·ç¦»å¯¹å“度进行线性衰å‡ã€‚" - -msgid "Squared dampening of loudness according to distance." -msgstr "æ ¹æ®è·ç¦»å¯¹å“度进行平方衰å‡ã€‚" - -msgid "Logarithmic dampening of loudness according to distance." -msgstr "æ ¹æ®è·ç¦»å¯¹æ•°é™ä½Žå“度。" - -msgid "" -"No dampening of loudness according to distance. The sound will still be " -"heard positionally, unlike an [AudioStreamPlayer]. [constant " -"ATTENUATION_DISABLED] can be combined with a [member max_distance] value " -"greater than [code]0.0[/code] to achieve linear attenuation clamped to a " -"sphere of a defined size." -msgstr "" -"ä¸ä¼šæ ¹æ®è·ç¦»è¡°å‡å“度。与 [AudioStreamPlayer] ä¸åŒï¼Œå£°éŸ³ä»ä¼šåœ¨ä½ç½®ä¸Šè¢«å¬åˆ°ã€‚" -"[constant ATTENUATION_DISABLED] å¯ä»¥ä¸Žå¤§äºŽ [code]0.0[/code] çš„ [member " -"max_distance] 值结åˆä½¿ç”¨ï¼Œä»¥å®žçŽ°çº¿æ€§è¡°å‡ï¼Œé™åˆ¶åœ¨å®šä¹‰çš„çƒä½“大å°ã€‚" - msgid "Disables doppler tracking." msgstr "ç¦ç”¨å¤šæ™®å‹’跟踪。" @@ -4775,6 +5741,9 @@ msgstr "矩阵å˜æ¢æ¼”示" msgid "2.5D Demo" msgstr "2.5D 演示" +msgid "Constructs a [Basis] as a copy of the given [Basis]." +msgstr "æž„é€ ç»™å®š [Basis] 的副本。" + msgid "Constructs a pure rotation basis matrix from the given quaternion." msgstr "æ ¹æ®ç»™å®šçš„å››å…ƒæ•°æž„é€ ä¸€ä¸ªçº¯æ—‹è½¬åŸºçŸ©é˜µã€‚" @@ -4957,6 +5926,9 @@ msgstr "附ç€éª¨éª¼çš„å称。" msgid "Boolean built-in type." msgstr "布尔型内置型。" +msgid "Constructs a [bool] as a copy of the given [bool]." +msgstr "æž„é€ ç»™å®š [bool] 的副本。" + msgid "" "Cast a [float] value to a boolean value, this method will return " "[code]false[/code] if [code]0.0[/code] is passed in, and [code]true[/code] " @@ -5057,6 +6029,12 @@ msgstr "返回当å‰æŒ‰ä¸‹çš„按钮。" msgid "Emitted when one of the buttons of the group is pressed." msgstr "当该组ä¸çš„一个按钮被按下时触å‘。" +msgid "Constructs an empty [Callable], with no object nor method bound." +msgstr "æž„é€ ç©ºçš„ [Callable],没有绑定对象和方法。" + +msgid "Constructs a [Callable] as a copy of the given [Callable]." +msgstr "æž„é€ ç»™å®š [Callable] 的副本。" + msgid "Calls the specified method after optional delay." msgstr "在å¯é€‰çš„延迟之åŽè°ƒç”¨æŒ‡å®šçš„方法。" @@ -5846,8 +6824,11 @@ msgstr "" msgid "BBCode in RichTextLabel" msgstr "RichTextLabel ä¸çš„ BBCode" +msgid "RichTextEffect test project (third-party)" +msgstr "RichTextEffect 测试项目(第三方)" + msgid "The color the character will be drawn with." -msgstr "绘制角色所用的颜色。" +msgstr "绘制å—符所用的颜色。" msgid "" "Contains the arguments passed in the opening BBCode tag. By default, " @@ -5875,6 +6856,18 @@ msgstr "" "1)}\n" "[/codeblock]" +msgid "" +"Number of glyphs in the grapheme cluster. This value is set in the first " +"glyph of a cluster. Setting this property won't affect drawing." +msgstr "" +"å—ç´ ç°‡ä¸çš„å—形数é‡ã€‚该值在簇的第一个å—å½¢ä¸è®¾ç½®ã€‚设置æ¤å±žæ€§ä¸ä¼šå½±å“绘制。" + +msgid "" +"Glyph flags. See [enum TextServer.GraphemeFlag] for more info. Setting this " +"property won't affect drawing." +msgstr "" +"å—å½¢æ ‡å¿—ã€‚è¯¦æƒ…è§ [enum TextServer.GraphemeFlag]。设置æ¤å±žæ€§ä¸ä¼šå½±å“绘制。" + msgid "The position offset the character will be drawn with (in pixels)." msgstr "绘制å—符的ä½ç½®å移é‡ï¼ˆä»¥åƒç´ 为å•ä½ï¼‰ã€‚" @@ -6240,6 +7233,64 @@ msgid "GUI Drag And Drop Demo" msgstr "GUI 拖放演示" msgid "" +"Constructs a default [Color] from opaque black. This is the same as " +"[constant BLACK].\n" +"[b]Note:[/b] in C#, constructs an empty color with all of its components set " +"to [code]0.0[/code] (transparent black)." +msgstr "" +"用ä¸é€æ˜Žçš„é»‘è‰²æž„é€ é»˜è®¤çš„ [Color],与 [constant BLACK] 相åŒã€‚\n" +"[b]注æ„:[/b]在 C# ä¸æž„é€ çš„ç©ºé¢œè‰²ï¼Œå…¶æ‰€æœ‰åˆ†é‡éƒ½ä¸º [code]0.0[/code](é€æ˜Ž" +"黑)。" + +msgid "Constructs a [Color] as a copy of the given [Color]." +msgstr "æž„é€ ç»™å®š [Color] 的副本。" + +msgid "" +"Returns the linear interpolation between this color's components and [param " +"to]'s components. The interpolation factor [param weight] should be between " +"0.0 and 1.0 (inclusive). See also [method @GlobalScope.lerp].\n" +"[codeblocks]\n" +"[gdscript]\n" +"var red = Color(1.0, 0.0, 0.0)\n" +"var aqua = Color(0.0, 1.0, 0.8)\n" +"\n" +"red.lerp(aqua, 0.2) # Returns Color(0.8, 0.2, 0.16)\n" +"red.lerp(aqua, 0.5) # Returns Color(0.5, 0.5, 0.4)\n" +"red.lerp(aqua, 1.0) # Returns Color(0.0, 1.0, 0.8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var red = new Color(1.0f, 0.0f, 0.0f);\n" +"var aqua = new Color(0.0f, 1.0f, 0.8f);\n" +"\n" +"red.Lerp(aqua, 0.2f); // Returns Color(0.8f, 0.2f, 0.16f)\n" +"red.Lerp(aqua, 0.5f); // Returns Color(0.5f, 0.5f, 0.4f)\n" +"red.Lerp(aqua, 1.0f); // Returns Color(0.0f, 1.0f, 0.8f)\n" +"[/csharp]\n" +"[/codeblocks]" +msgstr "" +"返回将该颜色的分é‡å’Œ [param to] 的分é‡è¿›è¡Œçº¿æ€§æ’值的结果。æ’值系数 [param " +"weight] 应该在 0.0 å’Œ 1.0 之间(é—区间)。å¦è¯·å‚阅 [method @GlobalScope." +"lerp]。\n" +"[codeblocks]\n" +"[gdscript]\n" +"var red = Color(1.0, 0.0, 0.0)\n" +"var aqua = Color(0.0, 1.0, 0.8)\n" +"\n" +"red.lerp(aqua, 0.2) # 返回 Color(0.8, 0.2, 0.16)\n" +"red.lerp(aqua, 0.5) # 返回 Color(0.5, 0.5, 0.4)\n" +"red.lerp(aqua, 1.0) # 返回 Color(0.0, 1.0, 0.8)\n" +"[/gdscript]\n" +"[csharp]\n" +"var red = new Color(1.0f, 0.0f, 0.0f);\n" +"var aqua = new Color(0.0f, 1.0f, 0.8f);\n" +"\n" +"red.Lerp(aqua, 0.2f); // 返回 Color(0.8f, 0.2f, 0.16f)\n" +"red.Lerp(aqua, 0.5f); // 返回 Color(0.5f, 0.5f, 0.4f)\n" +"red.Lerp(aqua, 1.0f); // 返回 Color(0.0f, 1.0f, 0.8f)\n" +"[/csharp]\n" +"[/codeblocks]" + +msgid "" "The color's alpha component, typically on the range of 0 to 1. A value of 0 " "means that the color is fully transparent. A value of 1 means that the color " "is fully opaque." @@ -7063,11 +8114,6 @@ msgstr "" "ä¿¡å·ã€‚å‚阅常é‡æ¥äº†è§£æ¯ä¸ªå¸¸é‡çš„作用。" msgid "" -"The size of the node's bounding rectangle, in pixels. [Container] nodes " -"update this property automatically." -msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚[Container] 节点会自动更新æ¤å±žæ€§ã€‚" - -msgid "" "Tells the parent [Container] nodes how they should resize and place the node " "on the X axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." @@ -8226,6 +9272,15 @@ msgstr "å—典类型。" msgid "GDScript basics: Dictionary" msgstr "GDScript 基础:å—å…¸" +msgid "Constructs an empty [Dictionary]." +msgstr "æž„é€ ç©ºçš„ [Dictionary]。" + +msgid "Returns the list of keys in the dictionary." +msgstr "返回该å—å…¸ä¸çš„键列表。" + +msgid "Returns the list of values in this dictionary." +msgstr "返回该å—å…¸ä¸çš„值列表。" + msgid "Type used to handle the filesystem." msgstr "用于处ç†æ–‡ä»¶ç³»ç»Ÿçš„类型。" @@ -9476,6 +10531,37 @@ msgid "" "project." msgstr "在文件对è¯æ¡†ä¸è®¾ç½®æœ¬é¡¹ç›®æœ€è¿‘访问过的文件夹列表。" +msgid "" +"The tint intensity to use for the subresources background in the Inspector " +"dock. The tint is used to distinguish between different subresources in the " +"inspector. Higher values result in a more noticeable background color " +"difference." +msgstr "" +"检查器é¢æ¿ä¸ï¼Œå资æºèƒŒæ™¯çš„ç€è‰²å¼ºåº¦ã€‚ç€è‰²ç”¨äºŽåŒºåˆ†æ£€æŸ¥å™¨ä¸ä¸åŒçš„å资æºã€‚值越" +"高,背景色差越容易区分。" + +msgid "" +"The \"start\" stop of the color gradient to use for bones in the 2D skeleton " +"editor." +msgstr "2D 骨架编辑器ä¸ï¼Œéª¨éª¼é¢œè‰²æ¸å˜çš„“开始â€ç‚¹ã€‚" + +msgid "" +"The \"end\" stop of the color gradient to use for bones in the 2D skeleton " +"editor." +msgstr "2D 骨架编辑器ä¸ï¼Œéª¨éª¼é¢œè‰²æ¸å˜çš„“结æŸâ€ç‚¹ã€‚" + +msgid "" +"The color to use for inverse kinematics-enabled bones in the 2D skeleton " +"editor." +msgstr "2D 骨架编辑器ä¸ï¼Œç”¨äºŽå¯ç”¨äº†åå‘è¿åŠ¨å¦çš„骨骼的颜色。" + +msgid "" +"The outline color to use for non-selected bones in the 2D skeleton editor. " +"See also [member editors/2d/bone_selected_color]." +msgstr "" +"2D 骨架编辑器ä¸ï¼Œç”¨äºŽæœªé€‰ä¸éª¨éª¼çš„轮廓颜色。å¦è§ [member editors/2d/" +"bone_selected_color]。" + msgid "Emitted after any editor setting has changed." msgstr "在编辑器设置改å˜åŽè§¦å‘。" @@ -9932,6 +11018,44 @@ msgstr "è¦æ˜¾ç¤ºçš„最大图层 ID。åªæœ‰åœ¨ä½¿ç”¨ [constant BG_CANVAS] èƒŒæ™ msgid "The background mode. See [enum BGMode] for possible values." msgstr "背景模å¼ã€‚å¯èƒ½çš„å–å€¼è§ [enum BGMode]。" +msgid "" +"If set above [code]0.0[/code] (exclusive), blends between the fog's color " +"and the color of the background [Sky]. This has a small performance cost " +"when set above [code]0.0[/code]. Must have [member background_mode] set to " +"[constant BG_SKY].\n" +"This is useful to simulate [url=https://en.wikipedia.org/wiki/" +"Aerial_perspective]aerial perspective[/url] in large scenes with low density " +"fog. However, it is not very useful for high-density fog, as the sky will " +"shine through. When set to [code]1.0[/code], the fog color comes completely " +"from the [Sky]. If set to [code]0.0[/code], aerial perspective is disabled." +msgstr "" +"如果设置大于 [code]0.0[/code](ä¸å«ï¼‰ï¼Œä¼šåœ¨é›¾çš„颜色和背景 [Sky] 的颜色之间进" +"行混åˆã€‚设置大于 [code]0.0[/code] 时有较å°çš„性能代价。必须将 [member " +"background_mode] 设置为 [constant BG_SKY]。\n" +"对于模拟雾密度较低的大场景ä¸çš„[https://zh.wikipedia.org/wiki/" +"%E7%A9%BA%E6%B0%94%E9%80%8F%E8%A7%86]空气é€è§†[/url]很有用。但对于高密度的雾æ¥" +"说ä¸æ˜¯å¾ˆæœ‰ç”¨ï¼Œå› 为天空会被照亮。设置为 [code]1.0[/code] 时,雾的颜色完全æ¥è‡ª " +"[Sky]。设置为 [code]0.0[/code] 时,会ç¦ç”¨ç©ºæ°”é€è§†ã€‚" + +msgid "The fog's color." +msgstr "雾的颜色。" + +msgid "The fog's brightness. Higher values result in brighter fog." +msgstr "雾的亮度。值越高,雾越亮。" + +msgid "" +"The factor to use when affecting the sky with non-volumetric fog. [code]1.0[/" +"code] means that fog can fully obscure the sky. Lower values reduce the " +"impact of fog on sky rendering, with [code]0.0[/code] not affecting sky " +"rendering at all.\n" +"[b]Note:[/b] [member fog_sky_affect] has no visual effect if [member " +"fog_aerial_perspective] is [code]1.0[/code]." +msgstr "" +"éžä½“积雾影å“天空时使用的系数。[code]1.0[/code] 表示雾å¯ä»¥å®Œå…¨é®è”½å¤©ç©ºã€‚较低的" +"值会å‡å°‘雾对天空渲染的影å“,[code]0.0[/code] 完全ä¸å½±å“天空的渲染。\n" +"[b]注æ„:[/b]如果 [member fog_aerial_perspective] 为 [code]1.0[/code]," +"[member fog_sky_affect] ä¸ä¼šæœ‰è§†è§‰æ•ˆæžœã€‚" + msgid "The glow blending mode." msgstr "辉光混åˆæ¨¡å¼ã€‚" @@ -9942,6 +11066,9 @@ msgstr "" "泛光的强度。如果设置为大于 [code]0[/code] 的值,则将在比 [member " "glow_hdr_threshold] æˆå‘˜æ›´æš—的区域ä¸æ˜¾ç¤ºè¾‰å…‰ã€‚" +msgid "If [code]true[/code], the glow effect is enabled." +msgstr "如果为 [code]true[/code],则å¯ç”¨è¾‰å…‰æ•ˆæžœã€‚" + msgid "" "The higher threshold of the HDR glow. Areas brighter than this threshold " "will be clamped for the purposes of the glow effect." @@ -9952,6 +11079,31 @@ msgid "The bleed scale of the HDR glow." msgstr "HDR 辉光的逸出缩放。" msgid "" +"The intensity of the 1st level of glow. This is the most \"local\" level " +"(least blurry)." +msgstr "第 1 级辉光的强度。这是最“局部â€çš„级别(最ä¸æ¨¡ç³Šï¼‰ã€‚" + +msgid "The intensity of the 2nd level of glow." +msgstr "第 2 级辉光的强度。" + +msgid "The intensity of the 3rd level of glow." +msgstr "第 3 级辉光的强度。" + +msgid "The intensity of the 4th level of glow." +msgstr "第 4 级辉光的强度。" + +msgid "The intensity of the 5th level of glow." +msgstr "第 5 级辉光的强度。" + +msgid "The intensity of the 6th level of glow." +msgstr "第 6 级辉光的强度。" + +msgid "" +"The intensity of the 7th level of glow. This is the most \"global\" level " +"(blurriest)." +msgstr "第 7 级辉光的强度。这是最“全局â€çš„级别(最模糊)。" + +msgid "" "The screen-space ambient occlusion intensity on materials that have an AO " "texture defined. Values higher than [code]0[/code] will make the SSAO effect " "visible in areas darkened by AO textures." @@ -10313,12 +11465,18 @@ msgstr "åº”ç”¨äºŽæ–‡ä»¶å›¾æ ‡çš„é¢œè‰²è°ƒåˆ¶ã€‚" msgid "The color modulation applied to the folder icon." msgstr "åº”ç”¨äºŽæ–‡ä»¶å¤¹å›¾æ ‡çš„é¢œè‰²è°ƒåˆ¶ã€‚" +msgid "Custom icon for the back arrow." +msgstr "å‘åŽç®å¤´çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" + msgid "Custom icon for files." msgstr "æ–‡ä»¶çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" msgid "Custom icon for folders." msgstr "æ–‡ä»¶å¤¹çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" +msgid "Custom icon for the forward arrow." +msgstr "å‘å‰ç®å¤´çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" + msgid "Custom icon for the parent folder arrow." msgstr "父文件夹ç®å¤´çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" @@ -10331,12 +11489,55 @@ msgstr "切æ¢éšè—æŒ‰é’®çš„è‡ªå®šä¹‰å›¾æ ‡ã€‚" msgid "Float built-in type." msgstr "浮点数内置类型。" +msgid "" +"The [float] built-in type is a 64-bit double-precision floating-point " +"number, equivalent to [code]double[/code] in C++. This type has 14 reliable " +"decimal digits of precision. The [float] type can be stored in [Variant], " +"which is the generic type used by the engine. The maximum value of [float] " +"is approximately [code]1.79769e308[/code], and the minimum is approximately " +"[code]-1.79769e308[/code].\n" +"Many methods and properties in the engine use 32-bit single-precision " +"floating-point numbers instead, equivalent to [code]float[/code] in C++, " +"which have 6 reliable decimal digits of precision. For data structures such " +"as [Vector2] and [Vector3], Godot uses 32-bit floating-point numbers by " +"default, but it can be changed to use 64-bit doubles if Godot is compiled " +"with the [code]precision=double[/code] option.\n" +"Math done using the [float] type is not guaranteed to be exact or " +"deterministic, and will often result in small errors. You should usually use " +"the [method @GlobalScope.is_equal_approx] and [method @GlobalScope." +"is_zero_approx] methods instead of [code]==[/code] to compare [float] values " +"for equality." +msgstr "" +"[float] 内置类型是 64 ä½åŒç²¾åº¦æµ®ç‚¹æ•°ï¼Œç›¸å½“于 C++ ä¸çš„ [code]double[/code]。这" +"个类型有 14 个å¯é çš„å进制å°æ•°ä½ç²¾åº¦ã€‚å¯ä»¥åœ¨å¼•æ“Žæ‰€ä½¿ç”¨çš„通用类型 [Variant] ä¸" +"å˜å‚¨ [float] 类型。[float] 的最大值约为 [code]1.79769e308[/code],最å°å€¼çº¦ä¸º " +"[code]-1.79769e308[/code]。\n" +"ä¸è¿‡å¼•æ“Žä¸çš„大多数方法和属性使用的都是 32 ä½å•ç²¾åº¦æµ®ç‚¹æ•°ï¼Œç›¸å½“于 C++ ä¸çš„ " +"[code]float[/code],有 6 ä½å¯é çš„å进制å°æ•°ä½ç²¾åº¦ã€‚Godot 在 [Vector2] å’Œ " +"[Vector3] ç‰æ•°æ®ç»“æž„ä¸é»˜è®¤ä½¿ç”¨ 32 ä½æµ®ç‚¹æ•°ï¼Œä½†å¦‚æžœ Godot 编译时使用了 " +"[code]precision=double[/code] 选项,就会改为 64 ä½ double。\n" +"使用 [float] 类型进行的数å¦è¿ç®—æ— æ³•ä¿è¯ç²¾ç¡®ä¸Žç¨³å®šï¼Œç»å¸¸ä¼šäº§ç”Ÿè¾ƒå°çš„è¯¯å·®ã€‚ä½ é€š" +"常应该使用 [method @GlobalScope.is_equal_approx] å’Œ [method @GlobalScope." +"is_zero_approx] 方法æ¥æ¯”较 [float] 值是å¦ç›¸ç‰ï¼Œä¸åº”该用 [code]==[/code]。" + msgid "Wikipedia: Double-precision floating-point format" msgstr "维基百科:åŒç²¾åº¦æµ®ç‚¹æ•°æ ¼å¼" msgid "Wikipedia: Single-precision floating-point format" msgstr "维基百科:å•ç²¾åº¦æµ®ç‚¹æ•°æ ¼å¼" +msgid "Constructs a default-initialized [float] set to [code]0.0[/code]." +msgstr "æž„é€ é»˜è®¤åˆå§‹åŒ–çš„ [float],会被设为 [code]0.0[/code]。" + +msgid "Constructs a [float] as a copy of the given [float]." +msgstr "æž„é€ ç»™å®š [float] 的副本。" + +msgid "" +"Converts a [String] to a [float], following the same rules as [method String." +"to_float]." +msgstr "" +"å°† [String] 转æ¢ä¸º [float],éµå¾ªä¸Ž [method String.to_float] 相åŒçš„规则。" + msgid "" "Cast a [bool] value to a floating-point value, [code]float(true)[/code] will " "be equal to 1.0 and [code]float(false)[/code] will be equal to 0.0." @@ -10344,6 +11545,12 @@ msgstr "" "å°† [bool] 值转æ¢ä¸ºæµ®ç‚¹å€¼ï¼Œ[code]float(true)[/code] å°†ç‰äºŽ 1.0," "[code]float(false)[/code] å°†ç‰äºŽ 0.0。" +msgid "" +"Cast an [int] value to a floating-point value, [code]float(1)[/code] will be " +"equal to [code]1.0[/code]." +msgstr "" +"å°† [int] 值转æ¢ä¸ºæµ®ç‚¹å€¼ï¼Œ[code]float(1)[/code] å°†ç‰äºŽ [code]1.0[/code]。" + msgid "Base class for flow containers." msgstr "æµå¼å®¹å™¨çš„基类。" @@ -10369,6 +11576,9 @@ msgstr "å节点的垂直分隔é‡ã€‚" msgid "Returns the font ascent (number of pixels above the baseline)." msgstr "返回å—体的上å‡å¹…度(超出基线的åƒç´ 数)。" +msgid "Returns the font descent (number of pixels below the baseline)." +msgstr "返回å—体的å‡å°‘é‡ï¼ˆä½ŽäºŽåŸºçº¿çš„åƒç´ 数)。" + msgid "A script implemented in the GDScript programming language." msgstr "用 GDScript 编程è¯è¨€å®žçŽ°çš„脚本。" @@ -10443,11 +11653,6 @@ msgid "" "the X axis." msgstr "æ£æ–¹å‘的最å°æ—‹è½¬ï¼Œä»¥æŒ£è„±å¹¶ç»• X 轴旋转。" -msgid "" -"The amount of rotational damping across the Y axis. The lower, the more " -"dampening occurs." -msgstr "Y 轴上的旋转阻尼é‡ã€‚值越低,旋转的阻尼就越大。" - msgid "If [code]true[/code], rotation across the Y axis is limited." msgstr "如果为 [code]true[/code],则跨越 Y 轴的旋转将å—到é™åˆ¶ã€‚" @@ -10480,11 +11685,6 @@ msgid "" "the Y axis." msgstr "æ£æ–¹å‘的最å°æ—‹è½¬ï¼Œä»¥æŒ£è„±å¹¶ç»• Y 轴旋转。" -msgid "" -"The amount of rotational damping across the Z axis. The lower, the more " -"dampening occurs." -msgstr "跨越 Z 轴的旋转阻尼é‡ã€‚值越低,阻尼就越多。" - msgid "If [code]true[/code], rotation across the Z axis is limited." msgstr "如果为 [code]true[/code],则跨越 Z 轴的旋转将å—到é™åˆ¶ã€‚" @@ -10697,11 +11897,6 @@ msgid "The speed of all rotations across the axes." msgstr "所有跨轴旋转的速度。" msgid "" -"The amount of rotational damping across the axes. The lower, the more " -"dampening occurs." -msgstr "跨越 Z 轴的旋转阻尼é‡ã€‚值越低,å‘生的阻尼就越多。" - -msgid "" "The amount of rotational restitution across the axes. The lower, the more " "restitution occurs." msgstr "在å„轴上的旋转æ¢å¤é‡ã€‚值越低,å‘生的æ¢å¤é‡è¶Šå¤§ã€‚" @@ -11178,10 +12373,10 @@ msgid "" msgstr "当用户改å˜æ»šåŠ¨å移é‡æ—¶å‘出。在代ç ä¸æ”¹å˜æ»šåŠ¨å移é‡æ—¶ï¼Œå®ƒä¸ä¼šè¢«è§¦å‘。" msgid "Color of major grid lines." -msgstr "ä¸»ç½‘æ ¼çº¿æ¡é¢œè‰²ã€‚" +msgstr "主è¦æ …æ ¼çº¿çš„é¢œè‰²ã€‚" msgid "Color of minor grid lines." -msgstr "次è¦ç½‘æ ¼çº¿çš„é¢œè‰²ã€‚" +msgstr "次è¦æ …æ ¼çº¿çš„é¢œè‰²ã€‚" msgid "The fill color of the selection rectangle." msgstr "选定的矩形的填充颜色。" @@ -11202,7 +12397,7 @@ msgid "The icon for the snap toggle button." msgstr "å¸é™„åŠ¨æŒ‰é’®çš„å›¾æ ‡ã€‚" msgid "The background drawn under the grid." -msgstr "ç»˜åˆ¶åœ¨ç½‘æ ¼ä¸‹æ–¹çš„èƒŒæ™¯ã€‚" +msgstr "ç»˜åˆ¶åœ¨æ …æ ¼ä¸‹æ–¹çš„èƒŒæ™¯ã€‚" msgid "Disables all input and output slots of the GraphNode." msgstr "ç¦ç”¨ GraphNode 的所有输入和输出槽。" @@ -11341,7 +12536,7 @@ msgstr "[GraphNode] 被选ä¸æ—¶ä½¿ç”¨çš„背景。" msgid "" "Grid container used to arrange Control-derived children in a grid like " "layout." -msgstr "ç½‘æ ¼å®¹å™¨ï¼Œç”¨äºŽå°†æ´¾ç”Ÿè‡ª Control çš„åèŠ‚ç‚¹æŒ‰ç…§ç±»ä¼¼ç½‘æ ¼çš„å½¢å¼æŽ’列。" +msgstr "æ …æ ¼å®¹å™¨ï¼Œç”¨äºŽå°†æ´¾ç”Ÿè‡ª Control çš„åèŠ‚ç‚¹æŒ‰ç…§ç±»ä¼¼æ …æ ¼çš„å½¢å¼æŽ’列。" msgid "" "GridContainer will arrange its Control-derived children in a grid like " @@ -11355,10 +12550,10 @@ msgid "" "[b]Note:[/b] GridContainer only works with child nodes inheriting from " "Control. It won't rearrange child nodes inheriting from Node2D." msgstr "" -"GridContainer 将把它的 Control 派生的åèŠ‚ç‚¹æŽ’å¸ƒåœ¨ä¸€ä¸ªç±»ä¼¼ç½‘æ ¼çš„ç»“æž„ä¸ï¼Œç½‘æ ¼çš„" +"GridContainer 将把它的 Control 派生的åèŠ‚ç‚¹æŽ’å¸ƒåœ¨ä¸€ä¸ªç±»ä¼¼æ …æ ¼çš„ç»“æž„ä¸ï¼Œæ …æ ¼çš„" "列数由 [member columns] 属性指定,行数ç‰äºŽå®¹å™¨ä¸å节点的数é‡é™¤ä»¥åˆ—数。例如," "如果容器有 5 个å节点ã€2 列,那么容器ä¸å°±ä¼šæœ‰ 3 行。\n" -"请注æ„ï¼Œç½‘æ ¼å¸ƒå±€å°†ä¿ç•™æ¯ä¸ªå¤§å°çš„容器的列和行,并且空列将自动扩展。\n" +"请注æ„ï¼Œæ …æ ¼å¸ƒå±€å°†ä¿ç•™æ¯ä¸ªå¤§å°çš„容器的列和行,并且空列将自动扩展。\n" "[b]注æ„:[/b]GridContainer åªå¯¹ç»§æ‰¿è‡ª Control çš„å节点生效。它ä¸ä¼šé‡æ–°æŽ’列继" "承自 Node2D çš„å节点。" @@ -12507,6 +13702,13 @@ msgstr "图åƒæ•°æ®ç±»åž‹ã€‚" msgid "Importing images" msgstr "导入图åƒ" +msgid "" +"Converts a bump map to a normal map. A bump map provides a height offset per-" +"pixel, while a normal map provides a normal direction per pixel." +msgstr "" +"将凹凸贴图转æ¢ä¸ºæ³•çº¿è´´å›¾ã€‚凹凸贴图æä¾›æ¯ä¸ªåƒç´ 的高度å移,而法线贴图æä¾›æ¯ä¸ª" +"åƒç´ 的法线方å‘。" + msgid "Removes the image's mipmaps." msgstr "åˆ é™¤å›¾åƒçš„多级æ¸è¿œçº¹ç†ã€‚" @@ -13630,7 +14832,7 @@ msgid "" "code with [method add_action] and [method action_add_event]. See [method " "Node._input]." msgstr "" -"管ç†æ‰€æœ‰çš„ [InputEventAction],å¯ä»¥é€šè¿‡é¡¹ç›®è®¾ç½®èœå•[b]项目 > 项目设置 > é”®ä½" +"管ç†æ‰€æœ‰çš„ [InputEventAction],å¯ä»¥é€šè¿‡é¡¹ç›®è®¾ç½®èœå•[b]项目 > 项目设置 > 输入" "æ˜ å°„[/b]或在代ç ä¸ç”¨ [method add_action] å’Œ [method action_add_event] 创建/ä¿®" "改。请å‚阅 [method Node._input]。" @@ -13704,6 +14906,9 @@ msgstr "" msgid "Integer built-in type." msgstr "整数内置类型。" +msgid "Constructs an [int] as a copy of the given [int]." +msgstr "æž„é€ ç»™å®š [int] 的副本。" + msgid "" "Cast a [bool] value to an integer value, [code]int(true)[/code] will be " "equals to 1 and [code]int(false)[/code] will be equals to 0." @@ -13741,6 +14946,13 @@ msgstr "" "}\n" "[/codeblock]" +msgid "" +"Returns resolved addresses, or an empty array if an error happened or " +"resolution didn't happen yet (see [method get_resolve_item_status])." +msgstr "" +"如果å‘生错误或尚未å‘生解æžï¼Œåˆ™è¿”回已解æžçš„地å€æˆ–空数组(请å‚阅 [method " +"get_resolve_item_status])。" + msgid "DNS hostname resolver status: No status." msgstr "DNS 主机å解æžå™¨çŠ¶æ€ï¼šæ— 状æ€ã€‚" @@ -15454,16 +16666,6 @@ msgstr "" "[b]注æ„:[/b]如果线程已ç»æ‹¥æœ‰äº’æ–¥é”的所有æƒï¼Œè¯¥å‡½æ•°å°†æ— 阻塞地返回。" msgid "" -"Tries locking this [Mutex], but does not block. Returns [constant OK] on " -"success, [constant ERR_BUSY] otherwise.\n" -"[b]Note:[/b] This function returns [constant OK] if the thread already has " -"ownership of the mutex." -msgstr "" -"试图é”å®šæ¤ [Mutex],但并ä¸é˜»å¡žã€‚æˆåŠŸæ—¶è¿”回 [constant OK],å¦åˆ™è¿”回 [constant " -"ERR_BUSY]。\n" -"[b]注æ„:[/b]如果线程已ç»æ‹¥æœ‰äº†è¯¥ Mutex 的所有æƒï¼Œè¯¥å‡½æ•°è¿”回 [constant OK]。" - -msgid "" "Unlocks this [Mutex], leaving it to other threads.\n" "[b]Note:[/b] If a thread called [method lock] or [method try_lock] multiple " "times while already having ownership of the mutex, it must also call [method " @@ -15474,30 +16676,6 @@ msgstr "" "[method try_lock],它也必须调用相åŒæ¬¡æ•°çš„ [method unlock] æ‰èƒ½æ£ç¡®è§£é”." msgid "" -"Returns this agent's current path from start to finish in global " -"coordinates. The path only updates when the target location is changed or " -"the agent requires a repath. The path array is not intended to be used in " -"direct path movement as the agent has its own internal path logic that would " -"get corrupted by changing the path array manually. Use the intended [method " -"get_next_location] once every physics frame to receive the next path point " -"for the agents movement as this function also updates the internal path " -"logic." -msgstr "" -"返回这个代ç†ä»Žèµ·ç‚¹åˆ°ç»ˆç‚¹çš„当å‰è·¯å¾„,使用全局åæ ‡ã€‚è¯¥è·¯å¾„åªä¼šåœ¨ç›®æ ‡ä½ç½®å‘生å˜" -"化,或者代ç†è¦æ±‚é‡æ–°è®¡ç®—路径时更新。路径数组ä¸åº”直接用作移动路径,代ç†æœ‰å…¶å†…" -"部的路径逻辑,手动修改路径数组å¯èƒ½ä¼šé€ æˆç ´å。请在æ¯ä¸€ä¸ªç‰©ç†å¸§ä¸è°ƒç”¨ä¸€æ¬¡ " -"[method get_next_location] 获å–该代ç†çš„下一个路径点,这个函数会更新其内部的路" -"径逻辑。" - -msgid "" -"Returns the reachable final location in global coordinates. This can change " -"if the navigation path is altered in any way. Because of this, it would be " -"best to check this each frame." -msgstr "" -"返回å¯åˆ°è¾¾çš„最终ä½ç½®çš„全局åæ ‡ã€‚å¦‚æžœå¯¼èˆªè·¯å¾„ç”±äºŽä»»ä½•åŽŸå› å‘生改å˜ï¼Œè¿™ä¸ªä½ç½®ä¹Ÿ" -"å¯èƒ½å‘生å˜åŒ–ã€‚å› æ¤ï¼Œæœ€å¥½æ¯ä¸€å¸§éƒ½æ£€æŸ¥ä¸€ä¸‹ã€‚" - -msgid "" "Returns the [RID] of the navigation map for this NavigationAgent node. This " "function returns always the map set on the NavigationAgent node and not the " "map of the abstract agent on the NavigationServer. If the agent map is " @@ -15513,17 +16691,6 @@ msgstr "" "NavigationAgent 的导航地图,能够åŒæ—¶åœ¨ NavigationServer 上的代ç†ã€‚" msgid "" -"Returns the next location in global coordinates that can be moved to, making " -"sure that there are no static objects in the way. If the agent does not have " -"a navigation path, it will return the position of the agent's parent. The " -"use of this function once every physics frame is required to update the " -"internal path logic of the NavigationAgent." -msgstr "" -"返回å¯ä»¥ç§»åŠ¨è‡³çš„下一个ä½ç½®ï¼Œä½¿ç”¨å…¨å±€åæ ‡ï¼Œç¡®ä¿ä¸é€”没有é™æ€ç‰©ä½“阻挡。如果代ç†" -"没有导航路径,则会返回代ç†çˆ¶èŠ‚点的ä½ç½®ã€‚必须在æ¯ä¸ªç‰©ç†å¸§éƒ½è°ƒç”¨ä¸€æ¬¡è¿™ä¸ªå‡½æ•°ï¼Œ" -"æ›´æ–° NavigationAgent 内部的路径逻辑。" - -msgid "" "Sets the [RID] of the navigation map this NavigationAgent node should use " "and also updates the [code]agent[/code] on the NavigationServer." msgstr "" @@ -15562,14 +16729,6 @@ msgstr "" "å…¥é‡æ–°å¯»è·¯çš„æ»å¾ªçŽ¯ï¼Œå› 为它在æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†ä¸‹ä¸€ä¸ªç‚¹ã€‚" msgid "" -"The maximum distance the agent is allowed away from the ideal path to the " -"final location. This can happen due to trying to avoid collisions. When the " -"maximum distance is exceeded, it recalculates the ideal path." -msgstr "" -"å…许代ç†å离ç†æƒ³è·¯å¾„的最大è·ç¦»ã€‚å¯èƒ½ä¸ºäº†é˜²æ’žè€Œäº§ç”Ÿå离。超出最大è·ç¦»æ—¶ï¼Œä¼šé‡" -"新计算ç†æƒ³è·¯å¾„。" - -msgid "" "The distance threshold before the final target point is considered to be " "reached. This will allow an agent to not have to hit the point of the final " "target exactly, but only the area. If this value is set to low the " @@ -15581,9 +16740,6 @@ msgstr "" "ç»ˆçš„ç›®æ ‡ï¼Œåˆ°è¾¾è¯¥åŒºåŸŸå†…å³å¯ã€‚如果这个值设得太å°ï¼Œè¯¥ NavigationAgent 将陷入é‡æ–°" "寻路的æ»å¾ªçŽ¯ï¼Œå› 为它在æ¯æ¬¡ç‰©ç†å¸§æ›´æ–°åŽéƒ½ä¼šè¶…过或者到ä¸äº†æœ€ç»ˆçš„ç›®æ ‡ç‚¹ã€‚" -msgid "Notifies when the final location is reached." -msgstr "抵达终点ä½ç½®æ—¶å‘出通知。" - msgid "" "The NavigationAgent height offset is subtracted from the y-axis value of any " "vector path position for this NavigationAgent. The NavigationAgent height " @@ -16834,6 +17990,17 @@ msgstr "预先解æžçš„åœºæ™¯æ ‘è·¯å¾„ã€‚" msgid "2D Role Playing Game Demo" msgstr "2D 角色扮演游æˆæ¼”示" +msgid "Constructs an empty [NodePath]." +msgstr "æž„é€ ç©ºçš„ [NodePath]。" + +msgid "" +"Constructs a [NodePath] as a copy of the given [NodePath]. " +"[code]NodePath(\"example\")[/code] is equivalent to [code]^\"example\"[/" +"code]." +msgstr "" +"æž„é€ ç»™å®š [NodePath] 的副本。[code]NodePath(\"example\")[/code] ç‰ä»·äºŽ " +"[code]^\"example\"[/code]。" + msgid "" "Returns [code]true[/code] if the node path is absolute (as opposed to " "relative), which means that it starts with a slash character ([code]/[/" @@ -17164,22 +18331,6 @@ msgstr "" "[b]注æ„:[/b] 线程 ID ä¸æ˜¯ç¡®å®šçš„,也许会在应用程åºé‡æ–°å¯åŠ¨æ—¶è¢«é‡å¤ä½¿ç”¨ã€‚" msgid "" -"Returns [code]true[/code] if the Godot binary used to run the project is a " -"[i]debug[/i] export template, or when running in the editor.\n" -"Returns [code]false[/code] if the Godot binary used to run the project is a " -"[i]release[/i] export template.\n" -"To check whether the Godot binary used to run the project is an export " -"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " -"instead." -msgstr "" -"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]调试[/i]导出模æ¿ï¼Œæˆ–是在编辑器ä¸è¿è¡Œ" -"时,则返回 [code]true[/code]。\n" -"如果用于è¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是[i]å‘布[/i]导出模æ¿ï¼Œåˆ™è¿”回 " -"[code]false[/code]。\n" -"è¦æ£€æŸ¥ç”¨äºŽè¿è¡Œé¡¹ç›®çš„ Godot 二进制文件是å¦ä¸ºå¯¼å‡ºæ¨¡æ¿ï¼ˆè°ƒè¯•æˆ–å‘布),请使用 " -"[code]OS.has_feature(\"standalone\")[/code] 代替。" - -msgid "" "At the moment this function is only used by [code]AudioDriverOpenSL[/code] " "to request permission for [code]RECORD_AUDIO[/code] on Android." msgstr "" @@ -17237,6 +18388,13 @@ msgstr "图片目录路径。" msgid "Ringtones directory path." msgstr "铃声目录路径。" +msgid "Constructs an empty [PackedByteArray]." +msgstr "æž„é€ ç©ºçš„ [PackedByteArray]。" + +msgid "" +"Constructs a [PackedByteArray] as a copy of the given [PackedByteArray]." +msgstr "æž„é€ ç»™å®š [PackedByteArray] 的副本。" + msgid "" "Assigns the given value to all elements in the array. This can typically be " "used together with [method resize] to create an array with a given size and " @@ -17272,15 +18430,52 @@ msgstr "改å˜ç»™å®šç´¢å¼•å¤„çš„å—节。" msgid "Sorts the elements of the array in ascending order." msgstr "将该数组ä¸çš„å…ƒç´ æŒ‰å‡åºæŽ’列。" +msgid "Constructs an empty [PackedColorArray]." +msgstr "æž„é€ ç©ºçš„ [PackedColorArray]。" + +msgid "" +"Constructs a [PackedColorArray] as a copy of the given [PackedColorArray]." +msgstr "æž„é€ ç»™å®š [PackedColorArray] 的副本。" + msgid "Appends a value to the array." msgstr "å°†ä¸€ä¸ªå€¼æ·»åŠ åˆ°æ•°ç»„ä¸ã€‚" msgid "Changes the [Color] at the given index." msgstr "更改给定索引处的 [Color]。" +msgid "Constructs an empty [PackedFloat32Array]." +msgstr "æž„é€ ç©ºçš„ [PackedFloat32Array]。" + +msgid "" +"Constructs a [PackedFloat32Array] as a copy of the given " +"[PackedFloat32Array]." +msgstr "æž„é€ ç»™å®š [PackedFloat32Array] 的副本。" + msgid "Changes the float at the given index." msgstr "更改给定索引处的浮点数。" +msgid "Constructs an empty [PackedFloat64Array]." +msgstr "æž„é€ ç©ºçš„ [PackedFloat64Array]。" + +msgid "" +"Constructs a [PackedFloat64Array] as a copy of the given " +"[PackedFloat64Array]." +msgstr "æž„é€ ç»™å®š [PackedFloat64Array] 的副本。" + +msgid "Constructs an empty [PackedInt32Array]." +msgstr "æž„é€ ç©ºçš„ [PackedInt32Array]。" + +msgid "" +"Constructs a [PackedInt32Array] as a copy of the given [PackedInt32Array]." +msgstr "æž„é€ ç»™å®š [PackedInt32Array] 的副本。" + +msgid "Constructs an empty [PackedInt64Array]." +msgstr "æž„é€ ç©ºçš„ [PackedInt64Array]。" + +msgid "" +"Constructs a [PackedInt64Array] as a copy of the given [PackedInt64Array]." +msgstr "æž„é€ ç»™å®š [PackedInt64Array] 的副本。" + msgid "An abstraction of a serialized scene." msgstr "对åºåˆ—化场景的抽象。" @@ -17318,6 +18513,13 @@ msgstr "" "化的情况。\n" "[b]注æ„:[/b]仅在编辑器构建ä¸å¯ç”¨ã€‚" +msgid "Constructs an empty [PackedStringArray]." +msgstr "æž„é€ ç©ºçš„ [PackedStringArray]。" + +msgid "" +"Constructs a [PackedStringArray] as a copy of the given [PackedStringArray]." +msgstr "æž„é€ ç»™å®š [PackedStringArray] 的副本。" + msgid "Appends a string element at end of the array." msgstr "åœ¨æ•°ç»„çš„æœ«å°¾è¿½åŠ å—ç¬¦ä¸²å…ƒç´ ã€‚" @@ -17327,12 +18529,28 @@ msgstr "更改给定索引处的 [String]。" msgid "2D Navigation Astar Demo" msgstr "2D A 星导航演示" +msgid "Constructs an empty [PackedVector2Array]." +msgstr "æž„é€ ç©ºçš„ [PackedVector2Array]。" + +msgid "" +"Constructs a [PackedVector2Array] as a copy of the given " +"[PackedVector2Array]." +msgstr "æž„é€ ç»™å®š [PackedVector2Array] 的副本。" + msgid "Inserts a [Vector2] at the end." msgstr "在末尾æ’入一个 [Vector2]。" msgid "Changes the [Vector2] at the given index." msgstr "更改给定索引处的 [Vector2]。" +msgid "Constructs an empty [PackedVector3Array]." +msgstr "æž„é€ ç©ºçš„ [PackedVector3Array]。" + +msgid "" +"Constructs a [PackedVector3Array] as a copy of the given " +"[PackedVector3Array]." +msgstr "æž„é€ ç»™å®š [PackedVector3Array] 的副本。" + msgid "Inserts a [Vector3] at the end." msgstr "在末尾æ’入一个 [Vector3]。" @@ -17798,6 +19016,65 @@ msgstr "" msgid "The body's mass." msgstr "实体的质é‡ã€‚" +msgid "" +"The sky's overall brightness multiplier. Higher values result in a brighter " +"sky." +msgstr "天空整体亮度的乘数。数值越高,天空就越亮。" + +msgid "" +"Modulates the [Color] on the bottom half of the sky to represent the ground." +msgstr "调制天空下åŠéƒ¨åˆ†çš„ [Color],这部分代表地é¢ã€‚" + +msgid "" +"Controls the strength of [url=https://en.wikipedia.org/wiki/" +"Mie_scattering]Mie scattering[/url] for the sky. Mie scattering results from " +"light colliding with larger particles (like water). On earth, Mie scattering " +"results in a whitish color around the sun and horizon." +msgstr "" +"控制天空ä¸[url=https://zh.wikipedia.org/wiki/" +"%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]ç±³æ°æ•£å°„[/url]的强度。米æ°æ•£å°„是光与较大" +"çš„ç²’å(例如水)碰撞的结果。在地çƒä¸Šï¼Œç±³æ°æ•£å°„的结果是太阳和地平线周围的颜色" +"å‘白。" + +msgid "" +"Controls the [Color] of the [url=https://en.wikipedia.org/wiki/" +"Mie_scattering]Mie scattering[/url] effect. While not physically accurate, " +"this allows for the creation of alien-looking planets." +msgstr "" +"控制天空ä¸[url=https://zh.wikipedia.org/wiki/" +"%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]ç±³æ°æ•£å°„[/url]效果的 [Color]。虽然在物ç†" +"上并ä¸å‡†ç¡®ï¼Œä½†å¯ä»¥åˆ›é€ 出看上去åƒçš„外星çƒçš„天空。" + +msgid "" +"Controls the direction of the [url=https://en.wikipedia.org/wiki/" +"Mie_scattering]Mie scattering[/url]. A value of [code]1[/code] means that " +"when light hits a particle it's passing through straight forward. A value of " +"[code]-1[/code] means that all light is scatter backwards." +msgstr "" +"控制[url=https://zh.wikipedia.org/wiki/%E7%B1%B3%E6%B0%8F%E6%95%A3%E5%B0%84]" +"ç±³æ°æ•£å°„[/url]çš„æ–¹å‘。值为 [code]1[/code] 表示当光照到粒å时会直接穿过。值为" +"[code]-1[/code] 表示所有的光都是å‘åŽæ•£å°„的。" + +msgid "" +"Controls the strength of the [url=https://en.wikipedia.org/wiki/" +"Rayleigh_scattering]Rayleigh scattering[/url]. Rayleigh scattering results " +"from light colliding with small particles. It is responsible for the blue " +"color of the sky." +msgstr "" +"控制[url=https://zh.wikipedia.org/zh/%E7%91%9E%E5%88%A9%E6%95%A3%E5%B0%84]ç‘ž" +"利散射[/url]的强度。瑞利散射是光与较å°ç²’å碰撞的结果,是天空呈è“è‰²çš„åŽŸå› ã€‚" + +msgid "" +"Controls the [Color] of the [url=https://en.wikipedia.org/wiki/" +"Rayleigh_scattering]Rayleigh scattering[/url]. While not physically " +"accurate, this allows for the creation of alien-looking planets. For " +"example, setting this to a red [Color] results in a Mars-looking atmosphere " +"with a corresponding blue sunset." +msgstr "" +"控制[url=https://zh.wikipedia.org/zh/%E7%91%9E%E5%88%A9%E6%95%A3%E5%B0%84]ç‘ž" +"利散射[/url]çš„ [Color]。虽然在物ç†ä¸Šå¹¶ä¸å‡†ç¡®ï¼Œä½†å¯ä»¥åˆ›é€ 出看上去åƒçš„外星çƒçš„" +"天空。例如,将其设为红色 [Color],å¯ä»¥å¾—到ç«æ˜Ÿå¤§æ°”的外观,日è½æ—¶ä¸ºè“色。" + msgid "Base class for all objects affected by physics in 2D space." msgstr "2D空间ä¸æ‰€æœ‰å—物ç†å½±å“的对象的基类。" @@ -18351,21 +19628,6 @@ msgid "" "a center point." msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域ä¸çš„é‡åŠ›å‘é‡æ˜¯æ–¹å‘,还是ä¸å¿ƒç‚¹ã€‚" -msgid "" -"Constant to set/get the falloff factor for point gravity of an area. The " -"greater this value is, the faster the strength of gravity decreases with the " -"square of distance." -msgstr "" -"常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域ä¸çš„点é‡åŠ›çš„è¡°å‡ç³»æ•°ã€‚这个值越大,é‡åŠ›çš„强度éšç€è·ç¦»çš„" -"平方下é™å¾—越快。" - -msgid "" -"This constant was used to set/get the falloff factor for point gravity. It " -"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]." -msgstr "" -"这个常é‡ç”¨äºŽè®¾ç½®/获å–点é‡åŠ›çš„è¡°å‡å› å。它已ç»è¢« [constant " -"AREA_PARAM_GRAVITY_DISTANCE_SCALE] 所å–代了。" - msgid "Constant to set/get the priority (order of processing) of an area." msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–区域的优先级(处ç†é¡ºåºï¼‰ã€‚" @@ -18419,12 +19681,6 @@ msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的惯性。" msgid "Constant to set/get a body's gravity multiplier." msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的é‡åŠ›å€æ•°ã€‚" -msgid "Constant to set/get a body's linear dampening factor." -msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的线性阻尼系数。" - -msgid "Constant to set/get a body's angular dampening factor." -msgstr "常é‡ï¼Œç”¨äºŽè®¾ç½®/获å–物体的角度阻尼系数。" - msgid "Represents the size of the [enum BodyParameter] enum." msgstr "表示 [enum BodyParameter] 枚举的大å°ã€‚" @@ -18834,6 +20090,9 @@ msgstr "" "而“dâ€æ˜¯åŽŸç‚¹åˆ°å¹³é¢çš„è·ç¦»ï¼ˆåœ¨â€œæ³•çº¿â€æ–¹å‘)。“上方â€æˆ–“上方â€å¹³é¢è¢«è®¤ä¸ºæ˜¯æ³•çº¿æŒ‡å‘çš„" "å¹³é¢ä¸€ä¾§ã€‚" +msgid "Constructs a [Plane] as a copy of the given [Plane]." +msgstr "æž„é€ ç»™å®š [Plane] 的副本。" + msgid "Creates a plane from the three points, given in clockwise order." msgstr "æ ¹æ®é¡ºæ—¶é’ˆé¡ºåºç»™å‡ºçš„三个点创建一个平é¢ã€‚" @@ -19162,6 +20421,12 @@ msgstr "èƒŒæ™¯çš„æ ·å¼ã€‚" msgid "The style of the progress (i.e. the part that fills the bar)." msgstr "è¿›åº¦çš„æ ·å¼ï¼ˆå³å¡«å……进度æ¡çš„部分)。" +msgid "3D projection (4x4 matrix)." +msgstr "3D 投影(4×4 矩阵)。" + +msgid "Constructs a [Projection] as a copy of the given [Projection]." +msgstr "æž„é€ ç»™å®š [Projection] 的副本。" + msgid "Contains global variables accessible from everywhere." msgstr "包å«å…¨å±€å˜é‡ï¼Œå¯ä»¥ä»Žä»»ä½•åœ°æ–¹è®¿é—®ã€‚" @@ -20245,6 +21510,9 @@ msgstr "3D ä¸çš„ 2D 演示" msgid "Quaternion." msgstr "四元数." +msgid "Constructs a [Quaternion] as a copy of the given [Quaternion]." +msgstr "æž„é€ ç»™å®š [Quaternion] 的副本。" + msgid "" "Constructs a quaternion that will rotate around the given axis by the " "specified angle. The axis must be a normalized vector." @@ -20503,6 +21771,9 @@ msgid "" "The ray's destination point, relative to the RayCast's [code]position[/code]." msgstr "å…‰çº¿çš„ç›®æ ‡ç‚¹ï¼Œç›¸å¯¹äºŽè¯¥ RayCast çš„ [code]position[/code]。" +msgid "Constructs a [Rect2] as a copy of the given [Rect2]." +msgstr "æž„é€ ç»™å®š [Rect2] 的副本。" + msgid "Constructs a [Rect2] by position and size." msgstr "按ä½ç½®å’Œå¤§å°æž„é€ ä¸€ä¸ª [Rect2]。" @@ -20527,6 +21798,15 @@ msgid "" msgstr "返回该 [Rect2] çš„ä¸å¿ƒï¼Œç‰äºŽ [member position] + ([member size] / 2)。" msgid "" +"Returns [code]true[/code] if the [Rect2] has area, and [code]false[/code] if " +"the [Rect2] is linear, empty, or has a negative [member size]. See also " +"[method get_area]." +msgstr "" +"如果该 [Rect2] 有é¢ç§¯ï¼Œåˆ™è¿”回 [code]true[/code] ;如果该 [Rect2] 是线性的ã€ç©º" +"的或有负的 [member size],则返回 [code]false[/code] 。å¦è¯·å‚阅 [member " +"get_area]。" + +msgid "" "Returns [code]true[/code] if the [Rect2] contains a point. By convention, " "the right and bottom edges of the [Rect2] are considered exclusive, so " "points on these edges are [b]not[/b] included.\n" @@ -20539,6 +21819,18 @@ msgstr "" "[b]注æ„:[/b]对于[i]大å°ä¸ºè´Ÿ[/i]çš„ [Rect2],该方法并ä¸å¯é 。请使用 [method " "abs] 获å–ç‰ä»·çš„æ£æ•°å¤§å°çŸ©å½¢å†æ£€æŸ¥æ˜¯å¦åŒ…å«æŸä¸ªç‚¹ã€‚" +msgid "Constructs a [Rect2i] as a copy of the given [Rect2i]." +msgstr "æž„é€ ç»™å®š [Rect2i] 的副本。" + +msgid "" +"Returns [code]true[/code] if the [Rect2i] has area, and [code]false[/code] " +"if the [Rect2i] is linear, empty, or has a negative [member size]. See also " +"[method get_area]." +msgstr "" +"如果该 [Rect2i] 有é¢ç§¯ï¼Œåˆ™è¿”回 [code]true[/code] ;如果该 [Rect2i] 是线性的ã€" +"空的或有负的 [member size],则返回 [code]false[/code] 。å¦è¯·å‚阅 [member " +"get_area]。" + msgid "Base class for reference-counted objects." msgstr "引用计数对象的基类。" @@ -20619,21 +21911,6 @@ msgid "" msgstr "定义å射强度。" msgid "" -"The maximum distance away from the [ReflectionProbe] an object can be before " -"it is culled. Decrease this to improve performance, especially when using " -"the [constant UPDATE_ALWAYS] [member update_mode].\n" -"[b]Note:[/b] The maximum reflection distance is always at least equal to the " -"[member extents]. This means that decreasing [member max_distance] will not " -"always cull objects from reflections, especially if the reflection probe's " -"[member extents] are already large." -msgstr "" -"设置对象在被剔除å‰ä¸Žè¯¥ [ReflectionProbe] 的最大è·ç¦»ã€‚调低å¯ä»¥æå‡æ€§èƒ½ï¼Œå°¤å…¶æ˜¯" -"使用 [constant UPDATE_ALWAYS] 作为 [member update_mode] 时。\n" -"[b]注æ„:[/b]最大åå°„è·ç¦»æ€»æ˜¯è‡³å°‘ç‰äºŽ [member extents] 的。这æ„味ç€å‡å° " -"[member max_distance] 并ä¸æ€»èƒ½å°†å¯¹è±¡å‰”除出å射,尤其是在å射探针的 [member " -"extents] 相当大时。" - -msgid "" "Sets how frequently the [ReflectionProbe] is updated. Can be [constant " "UPDATE_ONCE] or [constant UPDATE_ALWAYS]." msgstr "" @@ -21158,12 +22435,6 @@ msgstr "" "多。相当于 [member ReflectionProbe.enable_shadows]。" msgid "" -"Sets the size of the area that the reflection probe will capture. Equivalent " -"to [member ReflectionProbe.extents]." -msgstr "" -"设置å射探针将æ•èŽ·çš„区域的大å°ã€‚相当于 [member ReflectionProbe.extents]。" - -msgid "" "Sets the intensity of the reflection probe. Intensity modulates the strength " "of the reflection. Equivalent to [member ReflectionProbe.intensity]." msgstr "" @@ -21255,10 +22526,6 @@ msgstr "设置视å£çš„调试绘图模å¼ã€‚å¯é€‰é¡¹è§ [enum ViewportDebugDraw msgid "If [code]true[/code], the viewport's canvas is not rendered." msgstr "如果为 [code]true[/code],则ä¸æ¸²æŸ“视å£çš„画布。" -msgid "" -"If [code]true[/code], rendering of a viewport's environment is disabled." -msgstr "如果为 [code]true[/code],则ç¦ç”¨è§†å£çŽ¯å¢ƒçš„渲染。" - msgid "Sets the viewport's global transformation matrix." msgstr "设置视å£çš„全局å˜æ¢çŸ©é˜µã€‚" @@ -21907,17 +23174,6 @@ msgstr "" "è¦æ·»åŠ 一个自定义效果,使用[method install_effect]会更方便。" msgid "" -"If [code]true[/code], the label's height will be automatically updated to " -"fit its content.\n" -"[b]Note:[/b] This property is used as a workaround to fix issues with " -"[RichTextLabel] in [Container]s, but it's unreliable in some cases and will " -"be removed in future versions." -msgstr "" -"如果为 [code]true[/code]ï¼Œæ ‡ç¾çš„高度将自动更新以适应其内容。\n" -"[b]注æ„:[/b]æ¤å±žæ€§ç”¨ä½œè§£å†³ [Container] ä¸ [RichTextLabel] 问题的解决方法,但" -"在æŸäº›æƒ…况下ä¸å¯é ,将在未æ¥ç‰ˆæœ¬ä¸åˆ 除。" - -msgid "" "If [code]true[/code], the label underlines meta tags such as [code][url]" "{text}[/url][/code]." msgstr "" @@ -22024,6 +23280,12 @@ msgstr "[RichTextLabel] çš„æ£å¸¸èƒŒæ™¯ã€‚" msgid "Handle for a [Resource]'s unique ID." msgstr "[Resource] 的唯一 ID çš„å¥æŸ„。" +msgid "Constructs an empty [RID] with the invalid ID [code]0[/code]." +msgstr "æž„é€ ç©ºçš„ [RID]ï¼Œå†…å®¹ä¸ºæ— æ•ˆçš„ ID [code]0[/code]。" + +msgid "Constructs a [RID] as a copy of the given [RID]." +msgstr "æž„é€ ç»™å®š [RID] 的副本。" + msgid "2D Physics Platformer Demo" msgstr "2D 物ç†å¹³å°è·³è·ƒæ¼”示" @@ -22514,14 +23776,6 @@ msgstr "" "å¯ç”¨äºŽåŒæ¥å¤šä¸ª [Thread] çš„åŒæ¥ä¿¡å·é‡ã€‚创建时åˆå§‹åŒ–为零。å°å¿ƒé¿å…æ»é”。对于二" "进制版本,请å‚阅 [Mutex]。" -msgid "" -"Like [method wait], but won't block, so if the value is zero, fails " -"immediately and returns [constant ERR_BUSY]. If non-zero, it returns " -"[constant OK] to report success." -msgstr "" -"与 [method wait] 类似,但ä¸ä¼šé˜»å¡žï¼Œæ‰€ä»¥å¦‚果值为零,则会立å³å¤±è´¥å¹¶è¿”回 " -"[constant ERR_BUSY]。如果éžé›¶ï¼Œåˆ™ä¼šè¿”回 [constant OK],表示æˆåŠŸã€‚" - msgid "The ray's length." msgstr "射线的长度。" @@ -22607,6 +23861,12 @@ msgstr "" msgid "A shortcut for binding input." msgstr "绑定输入的快æ·æ–¹å¼ã€‚" +msgid "Constructs an empty [Signal] with no object nor signal name bound." +msgstr "æž„é€ ç©ºçš„ [Signal],没有绑定对象和信å·å称。" + +msgid "Constructs a [Signal] as a copy of the given [Signal]." +msgstr "æž„é€ ç»™å®š [Signal] 的副本。" + msgid "Skeleton for 2D characters and animated objects." msgstr "2D 角色和动画对象的骨架。" @@ -23206,6 +24466,12 @@ msgstr "" "è½®è¯¢è¿žæŽ¥ä»¥æ£€æŸ¥ä¼ å…¥çš„å—节。在 [method StreamPeer.get_available_bytes] 之å‰è°ƒç”¨" "它以使其æ£å¸¸å·¥ä½œã€‚" +msgid "Constructs an empty [String] ([code]\"\"[/code])." +msgstr "æž„é€ ç©ºçš„ [String]([code]\"\"[/code])。" + +msgid "Constructs a [String] as a copy of the given [String]." +msgstr "æž„é€ ç»™å®š [String] 的副本。" + msgid "" "Returns a copy of the string with special characters escaped using the C " "language standard." @@ -23229,6 +24495,15 @@ msgid "" "meanings according to the XML standard." msgstr "è¿”å›žæ ¹æ® XML æ ‡å‡†å°†è½¬ä¹‰å—符替æ¢ä¸ºå…¶å«ä¹‰çš„å—符串副本。" +msgid "An optimized string type for unique names." +msgstr "针对唯一å称优化的å—符串类型。" + +msgid "Constructs an empty [StringName]." +msgstr "æž„é€ ç©ºçš„ [StringName]。" + +msgid "Constructs a [StringName] as a copy of the given [StringName]." +msgstr "æž„é€ ç»™å®š [StringName] 的副本。" + msgid "Base class for drawing stylized boxes for the UI." msgstr "用于为 UI ç»˜åˆ¶é£Žæ ¼åŒ–æ¡†çš„åŸºç±»ã€‚" @@ -23598,14 +24873,6 @@ msgstr "绘制时扩展æ¤æ ·å¼ç›’的上边è·ï¼Œä½¿å…¶ç»˜åˆ¶å¾—比请求的大 msgid "Modulates the color of the texture when this style box is drawn." msgstr "绘制æ¤æ ·å¼ç›’时用于调制纹ç†çš„颜色。" -msgid "" -"Species a sub-region of the texture to use.\n" -"This is equivalent to first wrapping the texture in an [AtlasTexture] with " -"the same region." -msgstr "" -"指定è¦ä½¿ç”¨çš„纹ç†çš„å区域。\n" -"这相当于首先将纹ç†åŒ…裹在具有相åŒåŒºåŸŸçš„ [AtlasTexture] ä¸ã€‚" - msgid "The texture to use when drawing this style box." msgstr "绘制æ¤æ ·å¼ç›’时所使用的纹ç†ã€‚" @@ -23695,6 +24962,11 @@ msgstr "绘制å‰å§‹ç»ˆæ¸…é™¤æ¸²æŸ“ç›®æ ‡ã€‚" msgid "Never clear the render target." msgstr "æ°¸ä¸æ¸…é™¤æ¸²æŸ“ç›®æ ‡ã€‚" +msgid "" +"Clear the render target on the next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." +msgstr "åœ¨ä¸‹ä¸€å¸§æ¸…é™¤æ¸²æŸ“ç›®æ ‡ï¼Œç„¶åŽåˆ‡æ¢åˆ° [constant CLEAR_MODE_NEVER]。" + msgid "Do not update the render target." msgstr "ä¸è¦æ›´æ–°æ¸²æŸ“ç›®æ ‡ã€‚" @@ -23779,14 +25051,6 @@ msgstr "" "一个顶点æ交,则å¯èƒ½æ ¹æœ¬æ— 法使用æ¤ä¿¡æ¯ã€‚" msgid "" -"Specifies whether the current vertex (if using only vertex arrays) or " -"current index (if also using index arrays) should use smooth normals for " -"normal calculation." -msgstr "" -"指定当å‰é¡¶ç‚¹ï¼ˆå¦‚果仅使用顶点数组)或当å‰ç´¢å¼•ï¼ˆå¦‚果还使用索引数组)是å¦åº”使用" -"平滑法线进行法线计算。" - -msgid "" "Specifies a tangent to use for the [i]next[/i] vertex. If every vertex needs " "to have this information set and you fail to submit it for the first vertex, " "this information may not be used at all." @@ -24039,6 +25303,24 @@ msgstr "返回给定行æ¢è¡Œçš„次数。" msgid "Returns an array of [String]s representing each wrapped index." msgstr "返回代表å„个æ¢è¡Œç´¢å¼•çš„ [String] 数组。" +msgid "Returns the equivalent minimap line at [param position]" +msgstr "返回å°åœ°å›¾ [param position] 处ç‰ä»·çš„è¡Œ" + +msgid "" +"Returns the local position and size for the grapheme at the given [param " +"line] and [param column]. If [code]x[/code] or [code]y[/code] position of " +"the returned rect equal [code]-1[/code], the position is outside of the " +"viewable area of the control.\n" +"[b]Note:[/b] The Y position of the returned rect corresponds to the top side " +"of the line, unlike [method get_pos_at_line_column] which returns the bottom " +"side." +msgstr "" +"返回å—ç´ çš„æœ¬åœ°ä½ç½®å’Œå¤§å°ï¼Œè¯¥å—ç´ ä½äºŽç»™å®šè¡Œ [code]line[/code] 和列 " +"[code]column[/code]。如果返回的矩形ä¸ï¼Œä½ç½®çš„ [code]x[/code] 或 [code]y[/" +"code] ç‰äºŽ [code]-1[/code],表示ä½äºŽè¯¥æŽ§ä»¶çš„å¯è§†èŒƒå›´ä¹‹å¤–。\n" +"[b]注æ„:[/b]ä½ç½®ä¸çš„ Y 对应该行的顶部,而 [method get_pos_at_line_column] è¿”" +"回的则是底部。" + msgid "Returns the text inside the selection." msgstr "返回选择内的文本。" @@ -24063,13 +25345,6 @@ msgstr "有“撤销â€åŠ¨ä½œå¯ç”¨æ—¶è¿”回 [code]true[/code]。" msgid "Returns if the given line is wrapped." msgstr "返回给定的行是å¦æ¢è¡Œã€‚" -msgid "" -"Triggers a right-click menu action by the specified index. See [enum " -"MenuItems] for a list of available indexes." -msgstr "" -"按指定的索引触å‘å³é”®å•å‡»èœå•æ“作。有关å¯ç”¨ç´¢å¼•çš„列表,请å‚阅 [enum " -"MenuItems]。" - msgid "Perform redo operation." msgstr "执行é‡åšæ“作。" @@ -24212,8 +25487,93 @@ msgstr "文本上一个åƒç´ 宽度的大å°ï¼Œä»¥ 3D 缩放。" msgid "The text to generate mesh from." msgstr "用于生æˆç½‘æ ¼çš„æ–‡æœ¬ã€‚" -msgid "Returns the font descent (number of pixels below the baseline)." -msgstr "返回å—体的å‡å°‘é‡ï¼ˆä½ŽäºŽåŸºçº¿çš„åƒç´ 数)。" +msgid "Returns size of the text." +msgstr "返回该文本的大å°ã€‚" + +msgid "Returns extra spacing added between glyphs or lines in pixels." +msgstr "返回å—å½¢æˆ–è¡Œä¹‹é—´æ·»åŠ çš„é¢å¤–é—´è·ï¼Œå•ä½ä¸ºåƒç´ 。" + +msgid "" +"Breaks text into words and returns array of character ranges. Use [param " +"grapheme_flags] to set what characters are used for breaking (see [enum " +"GraphemeFlag])." +msgstr "" +"将文本分解æˆå•è¯å¹¶è¿”回å—符范围的数组。请使用 [param grapheme_flags] æ¥è®¾ç½®å“ª" +"些å—ç¬¦ä¼šè¢«ç”¨äºŽåˆ†è§£ï¼ˆè§ [enum GraphemeFlag])。" + +msgid "" +"Returns grapheme index at the specified pixel offset at the baseline, or " +"[code]-1[/code] if none is found." +msgstr "" +"返回å—ç´ çš„ç´¢å¼•ï¼Œè¯¥å—ç´ ä½äºŽåŸºçº¿ä¸ŠæŒ‡å®šåƒç´ å移的ä½ç½®ï¼Œå¦‚果没有找到,则返回 " +"[code]-1[/code]。" + +msgid "Do not break the line." +msgstr "ä¸æ¢è¡Œã€‚" + +msgid "" +"Break the line at the line mandatory break characters (e.g. [code]\"\\n\"[/" +"code])." +msgstr "在强制æ¢è¡Œç¬¦å¤„æ¢è¡Œï¼ˆä¾‹å¦‚ [code]\"\\n\"[/code])。" + +msgid "Break the line between the words." +msgstr "在å•è¯ä¹‹é—´æ¢è¡Œã€‚" + +msgid "Break the line between any unconnected graphemes." +msgstr "在任何ä¸ç›¸è¿žçš„å—ç´ ä¹‹é—´æ¢è¡Œã€‚" + +msgid "" +"Should be used only in conjunction with [constant BREAK_WORD_BOUND], break " +"the line between any unconnected graphemes, if it's impossible to break it " +"between the words." +msgstr "" +"åªåº”与 [constant BREAK_WORD_BOUND] 一起使用,如果ä¸å¯èƒ½åœ¨å•è¯ä¹‹é—´æ¢è¡Œï¼Œåˆ™åœ¨ä»»" +"何ä¸ç›¸è¿žçš„å—ç´ ä¹‹é—´æ¢è¡Œã€‚" + +msgid "Remove edge spaces from the broken line segments." +msgstr "移除æ¯ä¸€è¡Œå¤´å°¾çš„ç©ºæ ¼ã€‚" + +msgid "Trims the text per word instead of per grapheme." +msgstr "é€è¯ä¿®å‰ªæ–‡æœ¬ï¼Œè€Œä¸æ˜¯é€å—ç´ ä¿®å‰ªæ–‡æœ¬ã€‚" + +msgid "Grapheme is supported by the font, and can be drawn." +msgstr "å—ç´ ç”±å—体支æŒï¼Œå¹¶ä¸”å¯ä»¥è¢«ç»˜åˆ¶ã€‚" + +msgid "Grapheme is part of right-to-left or bottom-to-top run." +msgstr "å—ç´ æ˜¯ä»Žå³è‡³å·¦æˆ–从下至上书写的一部分。" + +msgid "" +"Grapheme is not part of source text, it was added by justification process." +msgstr "å—ç´ ä¸æ˜¯æºæ–‡æœ¬çš„一部分,而是通过两端对é½è¿‡ç¨‹æ·»åŠ 的。" + +msgid "Grapheme is whitespace." +msgstr "å—ç´ æ˜¯ç©ºç™½å—符。" + +msgid "Grapheme is mandatory break point (e.g. [code]\"\\n\"[/code])." +msgstr "å—ç´ æ˜¯å¼ºåˆ¶æ¢è¡Œç‚¹ï¼ˆä¾‹å¦‚ [code]\"\\n\"[/code])。" + +msgid "Grapheme is optional break point (e.g. space)." +msgstr "å—ç´ æ˜¯å¯é€‰æ¢è¡Œç‚¹ï¼ˆä¾‹å¦‚ç©ºæ ¼ï¼‰ã€‚" + +msgid "Grapheme is the tabulation character." +msgstr "å—ç´ æ˜¯åˆ¶è¡¨ç¬¦ã€‚" + +msgid "Grapheme is kashida." +msgstr "å—ç´ æ˜¯ Kashida。" + +msgid "Grapheme is punctuation character." +msgstr "å—ç´ æ˜¯æ ‡ç‚¹ç¬¦å·ã€‚" + +msgid "Grapheme is underscore character." +msgstr "å—ç´ æ˜¯ä¸‹åˆ’çº¿å—符。" + +msgid "" +"Grapheme is connected to the previous grapheme. Breaking line before this " +"grapheme is not safe." +msgstr "å—ç´ ä¸Žå‰ä¸€ä¸ªå—ç´ ç›¸è¿žã€‚åœ¨è¿™ä¸ªå—ç´ ä¹‹å‰æ¢è¡Œæ˜¯ä¸å®‰å…¨çš„。" + +msgid "It is safe to insert a U+0640 before this grapheme for elongation." +msgstr "在这个å—ç´ ä¹‹å‰æ’å…¥ U+0640 以进行伸长是安全的。" msgid "Disables font hinting (smoother but less crisp)." msgstr "ç¦ç”¨å—体æ示(更平滑但ä¸é‚£ä¹ˆæ¸…晰)。" @@ -24948,6 +26308,9 @@ msgstr "" "三个 [Vector2] 值组æˆï¼š[member x]ã€[member y]ã€[member origin]。\n" "更多信æ¯è¯·é˜…è¯»æ–‡æ¡£æ–‡ç« ã€ŠçŸ©é˜µå’Œå˜æ¢ã€‹ã€‚" +msgid "Constructs a [Transform2D] as a copy of the given [Transform2D]." +msgstr "æž„é€ ç»™å®š [Transform2D] 的副本。" + msgid "Constructs the transform from a given angle (in radians) and position." msgstr "从一个给定的角度(å•ä½ä¸ºå¼§åº¦ï¼‰å’Œä½ç½®æž„é€ å˜æ¢ã€‚" @@ -25044,6 +26407,9 @@ msgstr "" "列)组æˆã€‚\n" "更多信æ¯è¯·é˜…è¯»æ–‡æ¡£æ–‡ç« ã€ŠçŸ©é˜µå’Œå˜æ¢ã€‹ã€‚" +msgid "Constructs a [Transform3D] as a copy of the given [Transform3D]." +msgstr "æž„é€ ç»™å®š [Transform3D] 的副本。" + msgid "" "The basis is a matrix containing 3 [Vector3] as its columns: X axis, Y axis, " "and Z axis. These vectors can be interpreted as the basis vectors of local " @@ -25257,22 +26623,9 @@ msgid "" msgstr "" "当具有 [constant TreeItem.CELL_MODE_CUSTOM] çš„å•å…ƒæ ¼è¢«ç‚¹å‡»ï¼Œè¿›è¡Œç¼–辑时触å‘。" -msgid "Emitted when an item's label is double-clicked." -msgstr "å½“ä¸€ä¸ªé¡¹ç›®çš„æ ‡ç¾è¢«åŒå‡»æ—¶è§¦å‘。" - msgid "Emitted when an item is collapsed by a click on the folding arrow." msgstr "当一个项目的折å ç®å¤´è¢«ç‚¹å‡»æŠ˜å 时触å‘。" -msgid "" -"Emitted when a custom button is pressed (i.e. in a [constant TreeItem." -"CELL_MODE_CUSTOM] mode cell)." -msgstr "" -"当自定义按钮被按下时触å‘(å³åœ¨ [constant TreeItem.CELL_MODE_CUSTOM] 模å¼å•å…ƒ" -"æ ¼ä¸ï¼‰ã€‚" - -msgid "Emitted when an item's icon is double-clicked." -msgstr "å½“é¡¹ç›®çš„å›¾æ ‡è¢«åŒå‡»æ—¶è§¦å‘。" - msgid "Emitted when an item is edited." msgstr "当项目被编辑时触å‘。" @@ -26089,6 +27442,9 @@ msgstr "[VBoxContainer] çš„å…ƒç´ ä¹‹é—´çš„åž‚ç›´ç©ºé—´ã€‚" msgid "3Blue1Brown Essence of Linear Algebra" msgstr "3Blue1Brown《线性代数的本质》" +msgid "Constructs a [Vector2] as a copy of the given [Vector2]." +msgstr "æž„é€ ç»™å®š [Vector2] 的副本。" + msgid "" "Returns a new vector with all components in absolute values (i.e. positive)." msgstr "返回一个新的å‘é‡ï¼Œå…¶æ‰€æœ‰åˆ†é‡éƒ½æ˜¯ç»å¯¹å€¼ï¼Œå³æ£å€¼ã€‚" @@ -26179,6 +27535,12 @@ msgstr "上å•ä½å‘é‡ã€‚在 2D ä¸ Y 是å‘下的,所以这个å‘é‡æŒ‡å‘ - msgid "Down unit vector. Y is down in 2D, so this vector points +Y." msgstr "下å•ä½å‘é‡ã€‚在 2D ä¸ Y 是å‘下的,所以这个å‘é‡æŒ‡å‘ +Y。" +msgid "Constructs a [Vector2i] as a copy of the given [Vector2i]." +msgstr "æž„é€ ç»™å®š [Vector2i] 的副本。" + +msgid "Constructs a [Vector3] as a copy of the given [Vector3]." +msgstr "æž„é€ ç»™å®š [Vector3] 的副本。" + msgid "Returns the unsigned minimum angle to the given vector, in radians." msgstr "返回与给定å‘é‡çš„æ— ç¬¦å·æœ€å°è§’度,å•ä½ä¸ºå¼§åº¦ã€‚" @@ -26217,6 +27579,15 @@ msgid "" "direction of south." msgstr "åŽå•ä½å‘é‡ã€‚代表局部的åŽæ–¹å‘,全局的å—æ–¹å‘。" +msgid "Constructs a [Vector3i] as a copy of the given [Vector3i]." +msgstr "æž„é€ ç»™å®š [Vector3i] 的副本。" + +msgid "Constructs a [Vector4] as a copy of the given [Vector4]." +msgstr "æž„é€ ç»™å®š [Vector4] 的副本。" + +msgid "Constructs a [Vector4i] as a copy of the given [Vector4i]." +msgstr "æž„é€ ç»™å®š [Vector4i] 的副本。" + msgid "Physics body that simulates the behavior of a car." msgstr "模拟汽车行为的物ç†ä½“。" @@ -26385,17 +27756,6 @@ msgstr "æ’放结æŸæ—¶è§¦å‘。" msgid "[VideoStream] resource for Ogg Theora videos." msgstr "[VideoStream] Ogg Theora 视频的资æºã€‚" -msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." -msgstr "返回由这个 [VideoStreamTheora] 处ç†çš„ Ogg Theora 视频文件。" - -msgid "" -"Sets the Ogg Theora video file that this [VideoStreamTheora] resource " -"handles. The [code]file[/code] name should have the [code].ogv[/code] " -"extension." -msgstr "" -"设置该 [VideoStreamTheora] 资æºå¤„ç†çš„ Ogg Theora 视频文件。[code]file[/code] " -"çš„å称应该有 [code].ogv[/code] 扩展å。" - msgid "" "Returns the first valid [World2D] for this viewport, searching the [member " "world_2d] property of itself and any Viewport ancestor." @@ -26403,9 +27763,6 @@ msgstr "" "返回该视å£çš„首个有效 [World2D],在它自身åŠä»»ä½• Viewport 祖先节点的 [member " "world_2d] 属性ä¸æŸ¥æ‰¾ã€‚" -msgid "Returns the total transform of the viewport." -msgstr "返回视å£çš„总的å˜æ¢ã€‚" - msgid "" "Returns the mouse's position in this [Viewport] using the coordinate system " "of this [Viewport]." @@ -26441,12 +27798,6 @@ msgstr "" "影,但是会é™ä½Žé˜´å½±çš„è´¨é‡ã€‚一个好的åšæ³•æ˜¯è®©è±¡é™å…·æœ‰ä¸åŒæ•°é‡çš„细分,并尽å¯èƒ½åœ°" "å‡å°‘细分。" -msgid "" -"Moves the mouse pointer to the specified position in this [Viewport] using " -"the coordinate system of this [Viewport]." -msgstr "" -"å°†é¼ æ ‡æŒ‡é’ˆç§»åŠ¨åˆ°è¯¥ [Viewport] ä¸çš„指定ä½ç½®ï¼Œä½¿ç”¨è¯¥ [Viewport] çš„åæ ‡ç³»ã€‚" - msgid "If [code]true[/code], the viewport will process 2D audio streams." msgstr "如果为 [code]true[/code],该视å£å°†å¤„ç† 2D 音频æµã€‚" @@ -28281,9 +29632,6 @@ msgid "" "(any byte combination is allowed)." msgstr "指定 WebSockets 消æ¯åº”以二进制有效载è·çš„å½¢å¼ä¼ 输(å…许任何å—节组åˆï¼‰ã€‚" -msgid "How to make a VR game for WebXR with Godot" -msgstr "如何使用 Godot 制作 WebXR çš„ VR 游æˆ" - msgid "" "Checks if the given [code]session_mode[/code] is supported by the user's " "browser.\n" @@ -28332,6 +29680,18 @@ msgstr "ç›®æ ‡å°„çº¿ç”±æ‰‹æŒæŒ‡ç¤ºå™¨å‘射,很å¯èƒ½æ˜¯ VR 触摸控制器〠msgid "Target ray from touch screen, mouse or other tactile input device." msgstr "ç›®æ ‡å°„çº¿ç”±è§¦æ‘¸å±ã€é¼ æ ‡ç‰è§¦è§‰è¾“入设备å‘射。" +msgid "" +"The window can't be resizing by dragging its resize grip. It's still " +"possible to resize the window using [member size]. This flag is ignored for " +"full screen windows. Set with [member unresizable]." +msgstr "" +"该窗å£ä¸èƒ½é€šè¿‡æ‹–动其调整大å°çš„手柄æ¥è°ƒæ•´å¤§å°ã€‚ä»ç„¶å¯ä»¥ä½¿ç”¨ [member size] æ¥è°ƒ" +"整窗å£çš„大å°ã€‚è¿™ä¸ªæ ‡å¿—å¯¹äºŽå…¨å±çª—å£æ¥è¯´æ˜¯è¢«å¿½ç•¥çš„。用 [member unresizable] 设" +"置。" + +msgid "The color of the title's text." +msgstr "æ ‡é¢˜æ–‡æœ¬çš„é¢œè‰²ã€‚" + msgid "The font used to draw the title." msgstr "ç”¨äºŽç»˜åˆ¶æ ‡é¢˜çš„å—体。" @@ -28542,11 +29902,152 @@ msgstr "追踪功能失效(相机未æ’电或被é®æŒ¡ã€ç¯å¡”å…³é—,ç‰ç‰ msgid "The origin point in AR/VR." msgstr "AR/VR 的原点。" +msgid "The angular velocity for this pose." +msgstr "该姿势的角速度。" + +msgid "" +"If [code]true[/code] our tracking data is up to date. If [code]false[/code] " +"we're no longer receiving new tracking data and our state is whatever that " +"last valid state was." +msgstr "" +"如果为 [code]true[/code],则我们的追踪数æ®æ˜¯æœ€æ–°çš„。如果为 [code]false[/" +"code],我们将ä¸å†æŽ¥æ”¶æ–°çš„追踪数æ®ï¼Œå¹¶ä¸”我们的状æ€æ˜¯æœ€åŽä¸€ä¸ªæœ‰æ•ˆçŠ¶æ€ã€‚" + +msgid "The linear velocity of this pose." +msgstr "该姿势的线速度。" + +msgid "" +"The tracking confidence for this pose, provides insight on how accurate the " +"spatial positioning of this record is." +msgstr "æ¤å§¿åŠ¿çš„追踪置信度,æ供了有关æ¤è®°å½•çš„空间定ä½å‡†ç¡®åº¦çš„洞察力。" + +msgid "" +"The transform containing the original and transform as reported by the XR " +"runtime." +msgstr "该å˜æ¢åŒ…å«ç”± XR è¿è¡Œæ—¶æŠ¥å‘Šçš„原点和å˜æ¢ã€‚" + +msgid "No tracking information is available for this pose." +msgstr "æ¤å§¿åŠ¿æ²¡æœ‰å¯ç”¨çš„追踪信æ¯ã€‚" + +msgid "Tracking information is deemed accurate and up to date." +msgstr "追踪信æ¯è¢«è®¤ä¸ºæ˜¯å‡†ç¡®ä¸”最新的。" + msgid "A tracked object." -msgstr "跟踪对象。" +msgstr "追踪对象。" + +msgid "" +"An instance of this object represents a device that is tracked, such as a " +"controller or anchor point. HMDs aren't represented here as they are handled " +"internally.\n" +"As controllers are turned on and the [XRInterface] detects them, instances " +"of this object are automatically added to this list of active tracking " +"objects accessible through the [XRServer].\n" +"The [XRController3D] and [XRAnchor3D] both consume objects of this type and " +"should be used in your project. The positional trackers are just under-the-" +"hood objects that make this all work. These are mostly exposed so that " +"GDExtension-based interfaces can interact with them." +msgstr "" +"æ¤å¯¹è±¡çš„一个实例,表示一个被追踪的设备,例如一个控制器或锚点。HMD 没有在æ¤å¤„" +"è¡¨ç¤ºï¼Œå› ä¸ºå®ƒä»¬æ˜¯åœ¨å†…éƒ¨å¤„ç†çš„。\n" +"当控制器被打开,并且 [XRInterface] 检测到它们时,æ¤å¯¹è±¡çš„å®žä¾‹ä¼šè‡ªåŠ¨è¢«æ·»åŠ åˆ°å¯" +"通过 [XRServer] 访问的活动追踪对象列表ä¸ã€‚\n" +"[XRController3D] å’Œ [XRAnchor3D] 都使用这ç§ç±»åž‹çš„对象,并且应该在您的项目ä¸ä½¿" +"用。ä½ç½®è¿½è¸ªå™¨åªæ˜¯ä½¿è¿™ä¸€åˆ‡æ£å¸¸å·¥ä½œçš„底层对象。这些大部分都是公开的,以便基于 " +"GDExtension 的接å£ï¼Œå¯ä»¥ä¸Žå®ƒä»¬äº¤äº’。" + +msgid "" +"Returns an input for this tracker. It can return a boolean, float or " +"[Vector2] value depending on whether the input is a button, trigger or " +"thumbstick/thumbpad." +msgstr "" +"返回æ¤è¿½è¸ªå™¨çš„输入。它å¯ä»¥è¿”回一个布尔值ã€æµ®ç‚¹æ•°æˆ– [Vector2] 值,具体å–决于输" +"入是一个按钮ã€è§¦å‘器还是拇指æ†/拇指æ¿ã€‚" + +msgid "" +"Returns the current [XRPose] state object for the bound [param name] pose." +msgstr "返回绑定 [param name] å§¿åŠ¿çš„å½“å‰ [XRPose] 状æ€å¯¹è±¡ã€‚" + +msgid "" +"Returns [code]true[/code] if the tracker is available and is currently " +"tracking the bound [param name] pose." +msgstr "" +"如果追踪器å¯ç”¨ï¼Œå¹¶ä¸”当å‰æ£åœ¨è¿½è¸ªç»‘定的 [param name] 姿势,则返回 [code]true[/" +"code]。" + +msgid "" +"Marks this pose as invalid, we don't clear the last reported state but it " +"allows users to decide if trackers need to be hidden if we loose tracking or " +"just remain at their last known position." +msgstr "" +"å°†æ¤å§¿åŠ¿æ ‡è®°ä¸ºæ— 效,我们ä¸ä¼šæ¸…除最åŽæŠ¥å‘Šçš„状æ€ï¼Œä½†å¦‚果我们失去追踪,它å…许用" +"户决定是å¦éœ€è¦éšè—追踪器,或仅ä¿ç•™åœ¨å…¶æœ€åŽä¸€ä¸ªå·²çŸ¥ä½ç½®ã€‚" + +msgid "" +"Changes the value for the given input. This method is called by a " +"[XRInterface] implementation and should not be used directly." +msgstr "更改给定输入的值。æ¤æ–¹æ³•ç”±ä¸€ä¸ª [XRInterface] 实现调用,ä¸åº”直接使用。" + +msgid "" +"Sets the transform, linear velocity, angular velocity and tracking " +"confidence for the given pose. This method is called by a [XRInterface] " +"implementation and should not be used directly." +msgstr "" +"设置给定姿势的å˜æ¢ã€çº¿é€Ÿåº¦ã€è§’速度和追踪置信度。æ¤æ–¹æ³•ç”±ä¸€ä¸ª [XRInterface] 实" +"现调用,ä¸åº”直接使用。" + +msgid "The description of this tracker." +msgstr "æ¤è¿½è¸ªå™¨çš„æ述。" + +msgid "Defines which hand this tracker relates to." +msgstr "定义æ¤è¿½è¸ªå™¨ä¸Žå“ªåªæ‰‹ç›¸å…³ã€‚" + +msgid "" +"The unique name of this tracker. The trackers that are available differ " +"between various XR runtimes and can often be configured by the user. Godot " +"maintains a number of reserved names that it expects the [XRInterface] to " +"implement if applicable:\n" +"- [code]left_hand[/code] identifies the controller held in the players left " +"hand\n" +"- [code]right_hand[/code] identifies the controller held in the players " +"right hand" +msgstr "" +"æ¤è¿½è¸ªå™¨çš„唯一å称。å¯ç”¨çš„è¿½è¸ªå™¨å› å„ç§ XR è¿è¡Œæ—¶è€Œå¼‚,并且通常å¯ä»¥ç”±ç”¨æˆ·é…" +"置。Godot 维护了一些ä¿ç•™å称,如果å¯åº”用,它希望 [XRInterface] æ¥å®žçŽ°ï¼š\n" +"- [code]left_hand[/code] æ ‡è¯†çŽ©å®¶å·¦æ‰‹æ¡æŒçš„控制器\n" +"- [code]right_hand[/code] æ ‡è¯†çŽ©å®¶å³æ‰‹æ¡æŒçš„控制器" + +msgid "" +"The profile associated with this tracker, interface dependent but will " +"indicate the type of controller being tracked." +msgstr "与æ¤è¿½è¸ªå™¨å…³è”çš„é…置文件,å–决于界é¢ï¼Œä½†å°†æŒ‡ç¤ºè¢«è¿½è¸ªçš„控制器类型。" + +msgid "The type of tracker." +msgstr "该追踪器的类型。" + +msgid "" +"Emitted when a button on this tracker is pressed. Note that many XR runtimes " +"allow other inputs to be mapped to buttons." +msgstr "" +"当该追踪器上的一个按钮被按下时å‘出。请注æ„,许多 XR è¿è¡Œæ—¶å…è®¸å°†å…¶ä»–è¾“å…¥æ˜ å°„" +"到按钮。" + +msgid "Emitted when a button on this tracker is released." +msgstr "当该追踪器上的一个按钮被释放时å‘出。" + +msgid "Emitted when a trigger or similar input on this tracker changes value." +msgstr "当æ¤è¿½è¸ªå™¨ä¸Šçš„一个触å‘器或类似输入更改值时å‘出。" + +msgid "Emitted when a thumbstick or thumbpad on this tracker moves." +msgstr "当该追踪器上的一个拇指æ†æˆ–拇指æ¿ç§»åŠ¨æ—¶å‘出。" + +msgid "Emitted when the state of a pose tracked by this tracker changes." +msgstr "当被æ¤è¿½è¸ªå™¨è¿½è¸ªçš„一个姿势状æ€å‘生å˜åŒ–æ—¶å‘出。" + +msgid "Emitted when the profile of our tracker changes." +msgstr "当我们的追踪器的é…ç½®å‘生å˜åŒ–æ—¶å‘出。" msgid "The hand this tracker is held in is unknown or not applicable." -msgstr "这个追踪器所æŒçš„手是未知的或ä¸é€‚用的。" +msgstr "手æŒè¯¥è¿½è¸ªå™¨çš„手是未知的或ä¸é€‚用的。" msgid "This tracker is the left hand controller." msgstr "æ¤è·Ÿè¸ªå™¨æ˜¯å·¦æ‰‹æŽ§åˆ¶å™¨ã€‚" @@ -28555,30 +30056,63 @@ msgid "This tracker is the right hand controller." msgstr "æ¤è·Ÿè¸ªå™¨æ˜¯å³æ‰‹æŽ§åˆ¶å™¨ã€‚" msgid "Server for AR and VR features." -msgstr "AR å’Œ VR 功能的æœåŠ¡ã€‚" +msgstr "用于 AR å’Œ VR 功能的æœåŠ¡ã€‚" msgid "" "The AR/VR server is the heart of our Advanced and Virtual Reality solution " "and handles all the processing." -msgstr "AR/VR æœåŠ¡å™¨æ˜¯æˆ‘们“高级虚拟现实â€è§£å†³æ–¹æ¡ˆçš„æ ¸å¿ƒï¼Œè´Ÿè´£è¿›è¡Œæ‰€æœ‰å¤„ç†ã€‚" +msgstr "AR/VR æœåŠ¡å™¨æ˜¯æˆ‘们“高级虚拟现实â€è§£å†³æ–¹æ¡ˆçš„æ ¸å¿ƒï¼Œè´Ÿè´£æ‰§è¡Œæ‰€æœ‰å¤„ç†ã€‚" + +msgid "Registers an [XRInterface] object." +msgstr "注册一个 [XRInterface] 对象。" + +msgid "" +"Registers a new [XRPositionalTracker] that tracks a spatial location in real " +"space." +msgstr "注册一个新的 [XRPositionalTracker],用于跟踪现实空间ä¸çš„一个空间ä½ç½®ã€‚" msgid "Returns the primary interface's transformation." msgstr "返回主界é¢çš„å˜æ¢ã€‚" msgid "" +"Returns the interface registered at the given [param idx] index in the list " +"of interfaces." +msgstr "返回在接å£åˆ—表ä¸ç»™å®š [param idx] 索引处注册的接å£ã€‚" + +msgid "" "Returns the number of interfaces currently registered with the AR/VR server. " "If your project supports multiple AR/VR platforms, you can look through the " "available interface, and either present the user with a selection or simply " "try to initialize each interface and use the first one that returns " "[code]true[/code]." msgstr "" -"返回当å‰åœ¨AR/VRæœåŠ¡å™¨ä¸Šæ³¨å†Œçš„接å£æ•°é‡ã€‚å¦‚æžœä½ çš„é¡¹ç›®æ”¯æŒå¤šä¸ªAR/VRå¹³å°ï¼Œä½ å¯ä»¥" -"查看å¯ç”¨çš„接å£ï¼Œå¹¶å‘用户展示一个选择,或者简å•åœ°å°è¯•åˆå§‹åŒ–æ¯ä¸ªæŽ¥å£ï¼Œå¹¶ä½¿ç”¨ç¬¬" -"一个返回 [code]true[/code]的接å£ã€‚" +"返回当å‰åœ¨AR/VRæœåŠ¡ä¸Šæ³¨å†Œçš„ç•Œé¢æ•°é‡ã€‚å¦‚æžœä½ çš„é¡¹ç›®æ”¯æŒå¤šä¸ªAR/VRå¹³å°ï¼Œä½ å¯ä»¥æŸ¥" +"看å¯ç”¨çš„ç•Œé¢ï¼Œå¹¶å‘用户展示一个选择,或者简å•åœ°å°è¯•åˆå§‹åŒ–æ¯ä¸ªç•Œé¢ï¼Œå¹¶ä½¿ç”¨ç¬¬ä¸€" +"个返回 [code]true[/code]çš„ç•Œé¢ã€‚" msgid "" "Returns a list of available interfaces the ID and name of each interface." -msgstr "返回å¯ç”¨æŽ¥å£çš„列表,æ¯ä¸ªæŽ¥å£çš„IDå’Œå称。" +msgstr "返回å¯ç”¨ç•Œé¢çš„列表,æ¯ä¸ªç•Œé¢çš„IDå’Œå称。" + +msgid "" +"Returns the reference frame transform. Mostly used internally and exposed " +"for GDExtension build interfaces." +msgstr "返回引用帧的å˜æ¢ã€‚主è¦åœ¨å†…部使用,并公开以用于 GDExtension 构建接å£ã€‚" + +msgid "Returns the positional tracker with the given [param tracker_name]." +msgstr "返回具有给定 [param tracker_name] çš„ä½ç½®è¿½è¸ªå™¨ã€‚" + +msgid "Returns a dictionary of trackers for [param tracker_types]." +msgstr "返回 [param tracker_types] 的追踪器å—典。" + +msgid "Removes this [param interface]." +msgstr "移除该 [param interface]。" + +msgid "Removes this positional [param tracker]." +msgstr "移除该ä½ç½® [param tracker]。" + +msgid "The primary [XRInterface] currently bound to the [XRServer]." +msgstr "当å‰ç»‘定到 [XRServer] 的主 [XRInterface]。" msgid "" "Allows you to adjust the scale to your game's units. Most AR/VR platforms " @@ -28587,6 +30121,40 @@ msgstr "" "å…è®¸ä½ æ ¹æ®ä½ 的游æˆçš„å•ä½æ¥è°ƒæ•´ç¼©æ”¾ã€‚大多数 AR/VR å¹³å°å‡å®š 1 个游æˆä¸–ç•Œå•ä½ = " "1 个现实世界的米。" +msgid "" +"Emitted when a new tracker has been added. If you don't use a fixed number " +"of controllers or if you're using [XRAnchor3D]s for an AR solution, it is " +"important to react to this signal to add the appropriate [XRController3D] or " +"[XRAnchor3D] nodes related to this new tracker." +msgstr "" +"å½“ä¸€ä¸ªæ–°çš„è¿½è¸ªå™¨è¢«æ·»åŠ æ—¶å‘出。如果您ä¸ä½¿ç”¨ä¸€ä¸ªå›ºå®šæ•°é‡çš„控制器,或者如果您将 " +"[XRAnchor3D] 用于一个 AR 解决方案,请务必对æ¤ä¿¡å·åšå‡ºååº”ï¼Œä»¥æ·»åŠ ä¸Žè¯¥æ–°è¿½è¸ªå™¨" +"相适的 [XRController3D] 或 [XRAnchor3D] 节点 。" + +msgid "" +"Emitted when a tracker is removed. You should remove any [XRController3D] or " +"[XRAnchor3D] points if applicable. This is not mandatory, the nodes simply " +"become inactive and will be made active again when a new tracker becomes " +"available (i.e. a new controller is switched on that takes the place of the " +"previous one)." +msgstr "" +"当一个追踪器被移除时å‘出。如æ¤ï¼Œæ‚¨åº”该移除任何 [XRController3D] 或 " +"[XRanchor3D] 点。这ä¸æ˜¯å¼ºåˆ¶æ€§çš„,这些节点åªæ˜¯å˜å¾—ä¸æ´»åŠ¨ï¼Œå¹¶ä¸”当一个新的追踪器" +"å¯ç”¨æ—¶ï¼Œå°†å†æ¬¡æ¿€æ´»ï¼ˆå³æ‰“开一个新的控制器,æ¥ä»£æ›¿å‰ä¸€ä¸ªæŽ§åˆ¶å™¨ï¼‰ã€‚" + +msgid "" +"Emitted when an existing tracker has been updated. This can happen if the " +"user switches controllers." +msgstr "当现有追踪器被更新时å‘出。如果用户切æ¢æŽ§åˆ¶å™¨ï¼Œåˆ™å¯èƒ½ä¼šå‘生这ç§æƒ…况。" + +msgid "" +"The tracker tracks the location of the players head. This is usually a " +"location centered between the players eyes. Note that for handheld AR " +"devices this can be the current location of the device." +msgstr "" +"追踪器追踪玩家头部的ä½ç½®ã€‚这通常是玩家眼ç›ä¹‹é—´çš„ä¸å¿ƒä½ç½®ã€‚请注æ„,对于手æŒå¼ " +"AR 设备,这å¯èƒ½æ˜¯è¯¥è®¾å¤‡çš„当å‰ä½ç½®ã€‚" + msgid "The tracker tracks the location of a controller." msgstr "追踪器追踪控制器的ä½ç½®ã€‚" @@ -28624,3 +30192,15 @@ msgid "" "Does not reset the orientation of the HMD, only the position of the player " "gets centered." msgstr "ä¸é‡ç½® HMD çš„æ–¹å‘,åªè®©çŽ©å®¶çš„ä½ç½®å±…ä¸ã€‚" + +msgid "" +"Opens the zip archive at the given [param path] and reads its file index." +msgstr "打开给定 [param path] 的压缩文件,并读å–其文件索引。" + +msgid "" +"Loads the whole content of a file in the loaded zip archive into memory and " +"returns it.\n" +"Must be called after [method open]." +msgstr "" +"å°†åŠ è½½çš„ zip å˜æ¡£ä¸æ–‡ä»¶çš„å…¨éƒ¨å†…å®¹åŠ è½½åˆ°å†…å˜ä¸å¹¶è¿”回它。\n" +"必须在 [method open] 之åŽè°ƒç”¨ã€‚" diff --git a/drivers/alsa/SCsub b/drivers/alsa/SCsub index 1d76bb18c4..f17acb0f91 100644 --- a/drivers/alsa/SCsub +++ b/drivers/alsa/SCsub @@ -3,6 +3,7 @@ Import("env") if "alsa" in env and env["alsa"]: - env.add_source_files(env.drivers_sources, "asound-so_wrap.c") + if env["use_sowrap"]: + env.add_source_files(env.drivers_sources, "asound-so_wrap.c") env.add_source_files(env.drivers_sources, "*.cpp") diff --git a/drivers/alsa/audio_driver_alsa.cpp b/drivers/alsa/audio_driver_alsa.cpp index 20cd8dd26c..689f76389b 100644 --- a/drivers/alsa/audio_driver_alsa.cpp +++ b/drivers/alsa/audio_driver_alsa.cpp @@ -37,7 +37,7 @@ #include <errno.h> -#ifdef PULSEAUDIO_ENABLED +#if defined(PULSEAUDIO_ENABLED) && defined(SOWRAP_ENABLED) extern "C" { extern int initialize_pulse(int verbose); } @@ -153,6 +153,7 @@ Error AudioDriverALSA::init_output_device() { } Error AudioDriverALSA::init() { +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else @@ -167,7 +168,7 @@ Error AudioDriverALSA::init() { if (initialize_asound(dylibloader_verbose)) { return ERR_CANT_OPEN; } - +#endif active.clear(); exit_thread.clear(); diff --git a/drivers/alsa/audio_driver_alsa.h b/drivers/alsa/audio_driver_alsa.h index 821ba1d145..b62d7188dd 100644 --- a/drivers/alsa/audio_driver_alsa.h +++ b/drivers/alsa/audio_driver_alsa.h @@ -38,7 +38,11 @@ #include "core/templates/safe_refcount.h" #include "servers/audio_server.h" +#ifdef SOWRAP_ENABLED #include "asound-so_wrap.h" +#else +#include <alsa/asoundlib.h> +#endif class AudioDriverALSA : public AudioDriver { Thread thread; diff --git a/drivers/alsamidi/midi_driver_alsamidi.h b/drivers/alsamidi/midi_driver_alsamidi.h index 3c6300411c..80cc96310f 100644 --- a/drivers/alsamidi/midi_driver_alsamidi.h +++ b/drivers/alsamidi/midi_driver_alsamidi.h @@ -39,7 +39,12 @@ #include "core/templates/safe_refcount.h" #include "core/templates/vector.h" +#ifdef SOWRAP_ENABLED #include "../alsa/asound-so_wrap.h" +#else +#include <alsa/asoundlib.h> +#endif + #include <stdio.h> class MIDIDriverALSAMidi : public MIDIDriver { diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 0e217f699e..2a524e8c3a 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -566,6 +566,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou uint32_t index = 0; Item *current_clip = nullptr; + GLES3::CanvasShaderData *shader_data_cache = nullptr; // Record Batches. // First item always forms its own batch. @@ -602,7 +603,6 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou } } - GLES3::CanvasShaderData *shader_data_cache = nullptr; if (material != state.canvas_instance_batches[state.current_batch_index].material) { _new_batch(batch_broken); @@ -2259,6 +2259,7 @@ void RasterizerCanvasGLES3::reset_canvas() { glDisable(GL_DEPTH_TEST); glDisable(GL_SCISSOR_TEST); glEnable(GL_BLEND); + glBlendEquation(GL_FUNC_ADD); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); glActiveTexture(GL_TEXTURE0 + GLES3::Config::get_singleton()->max_texture_image_units - 2); diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index 2e3e6263ed..600aa908cc 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -306,6 +306,15 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display glReadBuffer(GL_COLOR_ATTACHMENT0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, GLES3::TextureStorage::system_fbo); + + if (p_screen_rect.position != Vector2()) { + // Viewport doesn't cover entire window so clear window to black before blitting. + Size2i win_size = DisplayServer::get_singleton()->window_get_size(); + glViewport(0, 0, win_size.width, win_size.height); + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + } + Vector2i screen_rect_end = p_screen_rect.get_end(); glBlitFramebuffer(0, 0, rt->size.x, rt->size.y, p_screen_rect.position.x, flip_y ? screen_rect_end.y : p_screen_rect.position.y, screen_rect_end.x, flip_y ? p_screen_rect.position.y : screen_rect_end.y, diff --git a/drivers/gles3/shaders/stdlib_inc.glsl b/drivers/gles3/shaders/stdlib_inc.glsl index 0b76c4334a..92bf2d87e4 100644 --- a/drivers/gles3/shaders/stdlib_inc.glsl +++ b/drivers/gles3/shaders/stdlib_inc.glsl @@ -14,11 +14,7 @@ uint float2half(uint f) { uint half2float(uint h) { uint h_e = h & uint(0x7c00); - if (h_e == uint(0x0000)) { - return uint(0); - } else { - return ((h & uint(0x8000)) << uint(16)) | ((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13)); - } + return ((h & uint(0x8000)) << uint(16)) | uint((h_e >> uint(10)) != uint(0)) * (((h_e + uint(0x1c000)) << uint(13)) | ((h & uint(0x03ff)) << uint(13))); } uint packHalf2x16(vec2 v) { diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index aa8df606cf..2c530e3ae6 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -2881,6 +2881,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority) if (material->data) { material->data->set_render_priority(priority); } + material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL); } bool MaterialStorage::material_is_animated(RID p_material) { diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp index 36b34dd8a2..1adba019ba 100644 --- a/drivers/gles3/storage/mesh_storage.cpp +++ b/drivers/gles3/storage/mesh_storage.cpp @@ -1686,6 +1686,8 @@ void MeshStorage::multimesh_set_buffer(RID p_multimesh, const Vector<float> &p_b uint32_t old_stride = multimesh->xform_format == RS::MULTIMESH_TRANSFORM_2D ? 8 : 12; old_stride += multimesh->uses_colors ? 4 : 0; old_stride += multimesh->uses_custom_data ? 4 : 0; + ERR_FAIL_COND(p_buffer.size() != (multimesh->instances * (int)old_stride)); + for (int i = 0; i < multimesh->instances; i++) { { float *dataptr = w + i * old_stride; diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index 9c9c39cc0e..ce66943328 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -806,6 +806,7 @@ void TextureStorage::texture_2d_update(RID p_texture, const Ref<Image> &p_image, texture_set_data(p_texture, p_image, p_layer); #ifdef TOOLS_ENABLED Texture *tex = texture_owner.get_or_null(p_texture); + ERR_FAIL_COND(!tex); tex->image_cache_2d.unref(); #endif diff --git a/drivers/pulseaudio/SCsub b/drivers/pulseaudio/SCsub index 467d1448dc..f48489d787 100644 --- a/drivers/pulseaudio/SCsub +++ b/drivers/pulseaudio/SCsub @@ -3,6 +3,7 @@ Import("env") if "pulseaudio" in env and env["pulseaudio"]: - env.add_source_files(env.drivers_sources, "pulse-so_wrap.c") + if env["use_sowrap"]: + env.add_source_files(env.drivers_sources, "pulse-so_wrap.c") env.add_source_files(env.drivers_sources, "*.cpp") diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp index 0246af4fea..797ffd67fe 100644 --- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp +++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp @@ -37,7 +37,11 @@ #include "core/version.h" #ifdef ALSAMIDI_ENABLED +#ifdef SOWRAP_ENABLED #include "drivers/alsa/asound-so_wrap.h" +#else +#include <alsa/asoundlib.h> +#endif #endif void AudioDriverPulseAudio::pa_state_cb(pa_context *c, void *userdata) { @@ -272,6 +276,7 @@ Error AudioDriverPulseAudio::init_output_device() { } Error AudioDriverPulseAudio::init() { +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else @@ -284,7 +289,7 @@ Error AudioDriverPulseAudio::init() { if (initialize_pulse(dylibloader_verbose)) { return ERR_CANT_OPEN; } - +#endif active.clear(); exit_thread.clear(); diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.h b/drivers/pulseaudio/audio_driver_pulseaudio.h index f4ff44d361..585e882059 100644 --- a/drivers/pulseaudio/audio_driver_pulseaudio.h +++ b/drivers/pulseaudio/audio_driver_pulseaudio.h @@ -38,7 +38,11 @@ #include "core/templates/safe_refcount.h" #include "servers/audio_server.h" +#ifdef SOWRAP_ENABLED #include "pulse-so_wrap.h" +#else +#include <pulse/pulseaudio.h> +#endif class AudioDriverPulseAudio : public AudioDriver { Thread thread; diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index 43d3f53904..ee3cb876cf 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -318,6 +318,10 @@ Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_per return FAILED; } +void FileAccessUnix::close() { + _close(); +} + CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr; FileAccessUnix::~FileAccessUnix() { diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 884fb9567f..79c4e73636 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -82,6 +82,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override; virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual void close() override; + FileAccessUnix() {} virtual ~FileAccessUnix(); }; diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 58569dc69e..91a746636a 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -5927,7 +5927,7 @@ Error RenderingDeviceVulkan::buffer_clear(RID p_buffer, uint32_t p_offset, uint3 return OK; } -Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) { +Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer, uint32_t p_offset, uint32_t p_size) { _THREAD_SAFE_METHOD_ // It could be this buffer was just created. @@ -5944,12 +5944,20 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) { VkCommandBuffer command_buffer = frames[frame].setup_command_buffer; + // Size of buffer to retrieve. + if (!p_size) { + p_size = buffer->size; + } else { + ERR_FAIL_COND_V_MSG(p_size + p_offset > buffer->size, Vector<uint8_t>(), + "Size is larger than the buffer."); + } + Buffer tmp_buffer; - _buffer_allocate(&tmp_buffer, buffer->size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT); + _buffer_allocate(&tmp_buffer, p_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VMA_MEMORY_USAGE_AUTO_PREFER_HOST, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT); VkBufferCopy region; - region.srcOffset = 0; + region.srcOffset = p_offset; region.dstOffset = 0; - region.size = buffer->size; + region.size = p_size; vkCmdCopyBuffer(command_buffer, buffer->buffer, tmp_buffer.buffer, 1, ®ion); // Dst buffer is in CPU, but I wonder if src buffer needs a barrier for this. // Flush everything so memory can be safely mapped. _flush(true); @@ -5960,9 +5968,9 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) { Vector<uint8_t> buffer_data; { - buffer_data.resize(buffer->size); + buffer_data.resize(p_size); uint8_t *w = buffer_data.ptrw(); - memcpy(w, buffer_mem, buffer->size); + memcpy(w, buffer_mem, p_size); } vmaUnmapMemory(allocator, tmp_buffer.allocation); @@ -8454,14 +8462,17 @@ void RenderingDeviceVulkan::set_resource_name(RID p_id, const String p_name) { } void RenderingDeviceVulkan::draw_command_begin_label(String p_label_name, const Color p_color) { + _THREAD_SAFE_METHOD_ context->command_begin_label(frames[frame].draw_command_buffer, p_label_name, p_color); } void RenderingDeviceVulkan::draw_command_insert_label(String p_label_name, const Color p_color) { + _THREAD_SAFE_METHOD_ context->command_insert_label(frames[frame].draw_command_buffer, p_label_name, p_color); } void RenderingDeviceVulkan::draw_command_end_label() { + _THREAD_SAFE_METHOD_ context->command_end_label(frames[frame].draw_command_buffer); } diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 63c6b97515..91a09fa970 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -1122,7 +1122,7 @@ public: virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS); // Works for any buffer. virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS); - virtual Vector<uint8_t> buffer_get_data(RID p_buffer); + virtual Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0); /*************************/ /**** RENDER PIPELINE ****/ diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 179de8227a..b8cea7136d 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -1871,7 +1871,10 @@ Error VulkanContext::_update_swap_chain(Window *window) { // Set the windows present mode if it is available, otherwise FIFO is used (guaranteed supported). if (present_mode_available) { - window->presentMode = requested_present_mode; + if (window->presentMode != requested_present_mode) { + window->presentMode = requested_present_mode; + print_verbose("Using present mode: " + String(string_VkPresentModeKHR(window->presentMode))); + } } else { String present_mode_string; switch (window->vsync_mode) { @@ -1892,8 +1895,6 @@ Error VulkanContext::_update_swap_chain(Window *window) { window->vsync_mode = DisplayServer::VSYNC_ENABLED; // Set to default. } - print_verbose("Using present mode: " + String(string_VkPresentModeKHR(window->presentMode))); - free(presentModes); // Determine the number of VkImages to use in the swap chain. diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp index ea40622afc..0e51586b5a 100644 --- a/drivers/windows/file_access_windows.cpp +++ b/drivers/windows/file_access_windows.cpp @@ -375,6 +375,10 @@ Error FileAccessWindows::_set_unix_permissions(const String &p_file, uint32_t p_ return ERR_UNAVAILABLE; } +void FileAccessWindows::close() { + _close(); +} + FileAccessWindows::~FileAccessWindows() { _close(); } @@ -391,6 +395,7 @@ void FileAccessWindows::initialize() { reserved_file_index++; } } + void FileAccessWindows::finalize() { invalid_files.clear(); } diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h index 2b9960d494..453f8d3b5f 100644 --- a/drivers/windows/file_access_windows.h +++ b/drivers/windows/file_access_windows.h @@ -82,6 +82,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override; virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual void close() override; + static void initialize(); static void finalize(); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 8426dfd1ac..9eabc31621 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -1522,6 +1522,8 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation, boo animation = p_animation; read_only = p_read_only; + length->set_read_only(read_only); + if (animation.is_valid()) { len_hb->show(); if (read_only) { @@ -2003,7 +2005,6 @@ void AnimationTrackEdit::_notification(int p_what) { draw_texture(down_icon, Vector2(ofs, int(get_size().height - down_icon->get_height()) / 2)); update_mode_rect.size.x += down_icon->get_width(); } else if (animation->track_get_type(track) == Animation::TYPE_BEZIER) { - Ref<Texture2D> bezier_icon = get_theme_icon(SNAME("EditBezier"), SNAME("EditorIcons")); update_mode_rect.size.x += down_icon->get_width(); update_mode_rect = Rect2(); } else { @@ -2228,7 +2229,7 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool if (i > 0) { text += ", "; } - text += String(args[i]); + text += args[i].get_construct_string(); } text += ")"; @@ -2540,7 +2541,7 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const { if (i > 0) { text += ", "; } - text += String(args[i]); + text += args[i].get_construct_string(); } text += ")\n"; @@ -3311,25 +3312,15 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim, bool p_re snap->set_disabled(false); snap_mode->set_disabled(false); - bezier_edit_icon->set_disabled(true); - imported_anim_warning->hide(); - bool import_warning_done = false; - bool bezier_done = false; for (int i = 0; i < animation->get_track_count(); i++) { if (animation->track_is_imported(i)) { imported_anim_warning->show(); - import_warning_done = true; - } - if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { - bezier_edit_icon->set_disabled(false); - bezier_done = true; - } - if (import_warning_done && bezier_done) { break; } } + _check_bezier_exist(); } else { hscroll->hide(); edit->set_disabled(true); @@ -3343,6 +3334,24 @@ void AnimationTrackEditor::set_animation(const Ref<Animation> &p_anim, bool p_re } } +void AnimationTrackEditor::_check_bezier_exist() { + bool is_exist = false; + for (int i = 0; i < animation->get_track_count(); i++) { + if (animation->track_get_type(i) == Animation::TrackType::TYPE_BEZIER) { + is_exist = true; + break; + } + } + if (is_exist) { + bezier_edit_icon->set_disabled(false); + } else { + if (bezier_edit->is_visible()) { + _cancel_bezier_edit(); + } + bezier_edit_icon->set_disabled(true); + } +} + Ref<Animation> AnimationTrackEditor::get_current_animation() const { return animation; } @@ -4292,6 +4301,8 @@ void AnimationTrackEditor::_update_tracks() { memdelete(track_vbox->get_child(0)); } + timeline->set_track_edit(nullptr); + track_edits.clear(); groups.clear(); @@ -4490,6 +4501,8 @@ void AnimationTrackEditor::_animation_changed() { return; // All will be updated, don't bother with anything. } + _check_bezier_exist(); + if (key_edit) { if (key_edit->setting) { // If editing a key, just redraw the edited track, makes refresh less costly. @@ -4710,7 +4723,6 @@ void AnimationTrackEditor::_new_track_node_selected(NodePath p_path) { adding_track_path = path_to; prop_selector->set_type_filter(filter); prop_selector->select_property_from_instance(node); - bezier_edit_icon->set_disabled(false); } break; case Animation::TYPE_AUDIO: { if (!node->is_class("AudioStreamPlayer") && !node->is_class("AudioStreamPlayer2D") && !node->is_class("AudioStreamPlayer3D")) { diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h index 2a59bda2a4..c733f397e3 100644 --- a/editor/animation_track_editor.h +++ b/editor/animation_track_editor.h @@ -399,6 +399,7 @@ class AnimationTrackEditor : public VBoxContainer { void _update_tracks(); void _redraw_tracks(); void _redraw_groups(); + void _check_bezier_exist(); void _name_limit_changed(); void _timeline_changed(float p_new_pos, bool p_drag, bool p_timeline_only); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index 2895aa9710..be4a070213 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -847,9 +847,14 @@ bool AnimationTrackEditTypeAudio::is_key_selectable_by_distance() const { void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int p_x, bool p_selected, int p_clip_left, int p_clip_right) { Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), p_index); - if (!stream.is_valid()) { - AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right); + AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right); // Draw diamond. + return; + } + + float len = stream->get_length(); + if (len == 0) { + AnimationTrackEdit::draw_key(p_index, p_pixels_sec, p_x, p_selected, p_clip_left, p_clip_right); // Draw diamond. return; } @@ -871,16 +876,10 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Label")); float fh = int(font->get_height(font_size) * 1.5); - float len = stream->get_length(); - Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream); float preview_len = preview->get_length(); - if (len == 0) { - len = preview_len; - } - int pixel_total_len = len * p_pixels_sec; len -= end_ofs; @@ -1044,16 +1043,13 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { continue; } - float start_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), i); - float end_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), i); float len = stream->get_length(); - if (len == 0) { - Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream); - float preview_len = preview->get_length(); - len = preview_len; + continue; } + float start_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), i); + float end_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), i); len -= end_ofs; len -= start_ofs; diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index b217cd57bf..9a8a1097cd 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -1312,20 +1312,15 @@ void CodeTextEditor::move_lines_up() { Vector<int> new_group{ c }; Pair<int, int> group_border; - if (text_editor->has_selection(c)) { - group_border.first = text_editor->get_selection_from_line(c); - group_border.second = text_editor->get_selection_to_line(c); - } else { - group_border.first = text_editor->get_caret_line(c); - group_border.second = text_editor->get_caret_line(c); - } + group_border.first = _get_affected_lines_from(c); + group_border.second = _get_affected_lines_to(c); for (int j = i; j < caret_edit_order.size() - 1; j++) { int c_current = caret_edit_order[j]; int c_next = caret_edit_order[j + 1]; - int next_start_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_from_line(c_next) : text_editor->get_caret_line(c_next); - int next_end_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_to_line(c_next) : text_editor->get_caret_line(c_next); + int next_start_pos = _get_affected_lines_from(c_next); + int next_end_pos = _get_affected_lines_to(c_next); int current_start_pos = text_editor->has_selection(c_current) ? text_editor->get_selection_from_line(c_current) : text_editor->get_caret_line(c_current); @@ -1405,27 +1400,22 @@ void CodeTextEditor::move_lines_down() { // Lists of carets representing each group Vector<Vector<int>> caret_groups; Vector<Pair<int, int>> group_borders; - + Vector<int> group_border_ends; // Search for groups of carets and their selections residing on the same lines for (int i = 0; i < caret_edit_order.size(); i++) { int c = caret_edit_order[i]; Vector<int> new_group{ c }; Pair<int, int> group_border; - if (text_editor->has_selection(c)) { - group_border.first = text_editor->get_selection_from_line(c); - group_border.second = text_editor->get_selection_to_line(c); - } else { - group_border.first = text_editor->get_caret_line(c); - group_border.second = text_editor->get_caret_line(c); - } + group_border.first = _get_affected_lines_from(c); + group_border.second = _get_affected_lines_to(c); for (int j = i; j < caret_edit_order.size() - 1; j++) { int c_current = caret_edit_order[j]; int c_next = caret_edit_order[j + 1]; - int next_start_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_from_line(c_next) : text_editor->get_caret_line(c_next); - int next_end_pos = text_editor->has_selection(c_next) ? text_editor->get_selection_to_line(c_next) : text_editor->get_caret_line(c_next); + int next_start_pos = _get_affected_lines_from(c_next); + int next_end_pos = _get_affected_lines_to(c_next); int current_start_pos = text_editor->has_selection(c_current) ? text_editor->get_selection_from_line(c_current) : text_editor->get_caret_line(c_current); @@ -1442,16 +1432,17 @@ void CodeTextEditor::move_lines_down() { } } group_borders.push_back(group_border); + group_border_ends.push_back(text_editor->has_selection(c) ? text_editor->get_selection_to_line(c) : text_editor->get_caret_line(c)); caret_groups.push_back(new_group); } for (int i = 0; i < group_borders.size(); i++) { - if (group_borders[i].second + 1 > text_editor->get_line_count() - 1) { + if (group_border_ends[i] + 1 > text_editor->get_line_count() - 1) { continue; } // If the group starts overlapping with the upper group don't move it - if (i > 0 && group_borders[i].second + 1 >= group_borders[i - 1].first) { + if (i > 0 && group_border_ends[i] + 1 >= group_borders[i - 1].first) { continue; } @@ -1498,87 +1489,44 @@ void CodeTextEditor::move_lines_down() { text_editor->queue_redraw(); } -void CodeTextEditor::_delete_line(int p_line, int p_caret) { - // this is currently intended to be called within delete_lines() - // so `begin_complex_operation` is omitted here - text_editor->set_line(p_line, ""); - if (p_line == 0 && text_editor->get_line_count() > 1) { - text_editor->set_caret_line(1, p_caret == 0, true, 0, p_caret); - text_editor->set_caret_column(0, p_caret == 0, p_caret); - } - text_editor->backspace(p_caret); - if (p_line < text_editor->get_line_count()) { - text_editor->unfold_line(p_line); - } - text_editor->set_caret_line(p_line, p_caret == 0, true, 0, p_caret); -} - void CodeTextEditor::delete_lines() { text_editor->begin_complex_operation(); - Vector<int> carets_to_remove; - Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order(); - for (int i = 0; i < caret_edit_order.size(); i++) { - int c = caret_edit_order[i]; - int cl = text_editor->get_caret_line(c); - - bool swaped_caret = false; - for (int j = i + 1; j < caret_edit_order.size(); j++) { - if (text_editor->has_selection(caret_edit_order[j])) { - if (text_editor->get_selection_from_line() == cl) { - carets_to_remove.push_back(caret_edit_order[j]); - continue; - } - - if (text_editor->get_selection_to_line() == cl) { - if (text_editor->has_selection(c)) { - if (text_editor->get_selection_to_line(c) != cl) { - text_editor->select(cl + 1, 0, text_editor->get_selection_to_line(c), text_editor->get_selection_to_column(c), c); - break; - } - } - - carets_to_remove.push_back(c); - i = j - 1; - swaped_caret = true; - break; - } - break; - } - - if (text_editor->get_caret_line(caret_edit_order[j]) == cl) { - carets_to_remove.push_back(caret_edit_order[j]); - i = j; + Vector<int> lines; + int last_line = INT_MAX; + for (const int &c : caret_edit_order) { + for (int line = _get_affected_lines_to(c); line >= _get_affected_lines_from(c); line--) { + if (line >= last_line) { continue; } - break; + last_line = line; + lines.append(line); } + } - if (swaped_caret) { - continue; + for (const int &line : lines) { + if (line != text_editor->get_line_count() - 1) { + text_editor->remove_text(line, 0, line + 1, 0); + } else { + text_editor->remove_text(line - 1, text_editor->get_line(line - 1).length(), line, text_editor->get_line(line).length()); } - - if (text_editor->has_selection(c)) { - int to_line = text_editor->get_selection_to_line(c); - int from_line = text_editor->get_selection_from_line(c); - int count = Math::abs(to_line - from_line) + 1; - - text_editor->set_caret_line(from_line, false, true, 0, c); - text_editor->deselect(c); - for (int j = 0; j < count; j++) { - _delete_line(from_line, c); + // Readjust carets. + int new_line = MIN(line, text_editor->get_line_count() - 1); + text_editor->unfold_line(new_line); + for (const int &c : caret_edit_order) { + if (text_editor->get_caret_line(c) == line || (text_editor->get_caret_line(c) == line + 1 && text_editor->get_caret_column(c) == 0)) { + text_editor->deselect(c); + text_editor->set_caret_line(new_line, c == 0, true, 0, c); + continue; } - } else { - _delete_line(text_editor->get_caret_line(c), c); + if (text_editor->get_caret_line(c) > line) { + text_editor->set_caret_line(text_editor->get_caret_line(c) - 1, c == 0, true, 0, c); + continue; + } + break; } } - - // Sort and remove backwards to preserve indexes. - carets_to_remove.sort(); - for (int i = carets_to_remove.size() - 1; i >= 0; i--) { - text_editor->remove_caret(carets_to_remove[i]); - } text_editor->merge_overlapping_carets(); text_editor->end_complex_operation(); } @@ -1634,77 +1582,68 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) { text_editor->begin_complex_operation(); Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order(); - for (const int &c : caret_edit_order) { - if (text_editor->has_selection(c)) { - int begin = text_editor->get_selection_from_line(c); - int end = text_editor->get_selection_to_line(c); - - // End of selection ends on the first column of the last line, ignore it. - if (text_editor->get_selection_to_column(c) == 0) { - end -= 1; + caret_edit_order.reverse(); + int last_line = -1; + for (const int &c1 : caret_edit_order) { + int from = _get_affected_lines_from(c1); + from += from == last_line ? 1 : 0; + int to = _get_affected_lines_to(c1); + last_line = to; + // Check first if there's any uncommented lines in selection. + bool is_commented = true; + for (int line = from; line <= to; line++) { + if (!text_editor->get_line(line).begins_with(delimiter)) { + is_commented = false; + break; } + } - int col_to = text_editor->get_selection_to_column(c); - int cursor_pos = text_editor->get_caret_column(c); - - // Check if all lines in the selected block are commented. - bool is_commented = true; - for (int i = begin; i <= end; i++) { - if (!text_editor->get_line(i).begins_with(delimiter)) { - is_commented = false; - break; - } + // Caret positions need to be saved since they could be moved at the eol. + Vector<int> caret_cols; + Vector<int> selection_to_cols; + for (const int &c2 : caret_edit_order) { + if (text_editor->get_caret_line(c2) >= from && text_editor->get_caret_line(c2) <= to) { + caret_cols.append(text_editor->get_caret_column(c2)); } - for (int i = begin; i <= end; i++) { - String line_text = text_editor->get_line(i); - - if (line_text.strip_edges().is_empty()) { - line_text = delimiter; - } else { - if (is_commented) { - line_text = line_text.substr(delimiter.length(), line_text.length()); - } else { - line_text = delimiter + line_text; - } - } - text_editor->set_line(i, line_text); + if (text_editor->has_selection(c2) && text_editor->get_selection_to_line(c2) >= from && text_editor->get_selection_to_line(c2) <= to) { + selection_to_cols.append(text_editor->get_selection_to_column(c2)); } + } - // Adjust selection & cursor position. - int offset = (is_commented ? -1 : 1) * delimiter.length(); - int col_from = text_editor->get_selection_from_column(c) > 0 ? text_editor->get_selection_from_column(c) + offset : 0; - - if (is_commented && text_editor->get_caret_column(c) == text_editor->get_line(text_editor->get_caret_line(c)).length() + 1) { - cursor_pos += 1; + // Comment/uncomment. + for (int line = from; line <= to; line++) { + String line_text = text_editor->get_line(line); + if (line_text.strip_edges().is_empty()) { + text_editor->set_line(line, delimiter); + continue; } - - if (text_editor->get_selection_to_column(c) != 0 && col_to != text_editor->get_line(text_editor->get_selection_to_line(c)).length() + 1) { - col_to += offset; + if (is_commented) { + text_editor->set_line(line, line_text.substr(delimiter.length(), line_text.length())); + continue; } + text_editor->set_line(line, delimiter + line_text); + } - if (text_editor->get_caret_column(c) != 0) { - cursor_pos += offset; + // Readjust carets and selections. + int caret_i = 0; + int selection_i = 0; + int offset = (is_commented ? -1 : 1) * delimiter.length(); + for (const int &c2 : caret_edit_order) { + bool is_line_selection = text_editor->has_selection(c2) && text_editor->get_selection_from_line(c2) < text_editor->get_selection_to_line(c2); + if (text_editor->get_caret_line(c2) >= from && text_editor->get_caret_line(c2) <= to) { + int caret_col = caret_cols[caret_i++]; + caret_col += (is_line_selection && caret_col == 0) ? 0 : offset; + text_editor->set_caret_column(caret_col, c2 == 0, c2); } - - text_editor->select(begin, col_from, text_editor->get_selection_to_line(c), col_to, c); - text_editor->set_caret_column(cursor_pos, c == 0, c); - - } else { - int begin = text_editor->get_caret_line(c); - String line_text = text_editor->get_line(begin); - int delimiter_length = delimiter.length(); - - int col = text_editor->get_caret_column(c); - if (line_text.begins_with(delimiter)) { - line_text = line_text.substr(delimiter_length, line_text.length()); - col -= delimiter_length; - } else { - line_text = delimiter + line_text; - col += delimiter_length; + if (text_editor->has_selection(c2) && text_editor->get_selection_to_line(c2) >= from && text_editor->get_selection_to_line(c2) <= to) { + int from_col = text_editor->get_selection_from_column(c2); + from_col += (is_line_selection && from_col == 0) ? 0 : offset; + int to_col = selection_to_cols[selection_i++]; + to_col += (to_col == 0) ? 0 : offset; + text_editor->select( + text_editor->get_selection_from_line(c2), from_col, + text_editor->get_selection_to_line(c2), to_col, c2); } - - text_editor->set_line(begin, line_text); - text_editor->set_caret_column(col, c == 0, c); } } text_editor->merge_overlapping_carets(); @@ -1942,6 +1881,22 @@ void CodeTextEditor::_toggle_scripts_pressed() { update_toggle_scripts_button(); } +int CodeTextEditor::_get_affected_lines_from(int p_caret) { + return text_editor->has_selection(p_caret) ? text_editor->get_selection_from_line(p_caret) : text_editor->get_caret_line(p_caret); +} + +int CodeTextEditor::_get_affected_lines_to(int p_caret) { + if (!text_editor->has_selection(p_caret)) { + return text_editor->get_caret_line(p_caret); + } + int line = text_editor->get_selection_to_line(p_caret); + // Don't affect a line with no selected characters + if (text_editor->get_selection_to_column(p_caret) == 0) { + line--; + } + return line; +} + void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { @@ -2010,9 +1965,36 @@ void CodeTextEditor::set_warning_count(int p_warning_count) { } void CodeTextEditor::toggle_bookmark() { - for (int i = 0; i < text_editor->get_caret_count(); i++) { - int line = text_editor->get_caret_line(i); - text_editor->set_line_as_bookmarked(line, !text_editor->is_line_bookmarked(line)); + Vector<int> caret_edit_order = text_editor->get_caret_index_edit_order(); + caret_edit_order.reverse(); + int last_line = -1; + for (const int &c : caret_edit_order) { + int from = text_editor->has_selection(c) ? text_editor->get_selection_from_line(c) : text_editor->get_caret_line(c); + from += from == last_line ? 1 : 0; + int to = text_editor->has_selection(c) ? text_editor->get_selection_to_line(c) : text_editor->get_caret_line(c); + if (to < from) { + continue; + } + // Check first if there's any bookmarked lines in the selection. + bool selection_has_bookmarks = false; + for (int line = from; line <= to; line++) { + if (text_editor->is_line_bookmarked(line)) { + selection_has_bookmarks = true; + break; + } + } + + // Set bookmark on caret or remove all bookmarks from the selection. + if (!selection_has_bookmarks) { + if (text_editor->get_caret_line(c) != last_line) { + text_editor->set_line_as_bookmarked(text_editor->get_caret_line(c), true); + } + } else { + for (int line = from; line <= to; line++) { + text_editor->set_line_as_bookmarked(line, false); + } + } + last_line = to; } } diff --git a/editor/code_editor.h b/editor/code_editor.h index fe2a31a7a7..343720637b 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -198,9 +198,11 @@ class CodeTextEditor : public VBoxContainer { void _update_status_bar_theme(); - void _delete_line(int p_line, int p_caret); void _toggle_scripts_pressed(); + int _get_affected_lines_from(int p_caret); + int _get_affected_lines_to(int p_caret); + protected: virtual void _load_theme_settings() {} virtual void _validate_script() {} diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index f843733f2c..a6defd0e14 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -890,7 +890,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() { hbc->add_child(autoload_add_path); autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL); autoload_add_path->set_clear_button_enabled(true); - autoload_add_path->set_placeholder(vformat(TTR(R"(Set path or press "%s" to create a script.)"), TTR("Add"))); + autoload_add_path->set_placeholder(vformat(TTR("Set path or press \"%s\" to create a script."), TTR("Add"))); autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed)); browse_button = memnew(Button); diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index ec1ef8a6bc..8a595be6e6 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -1237,10 +1237,23 @@ void EditorFileSystem::_notification(int p_what) { case NOTIFICATION_PROCESS: { if (use_threads) { + /** This hack exists because of the EditorProgress nature + * of processing events recursively. This needs to be rewritten + * at some point entirely, but in the meantime the following + * hack prevents deadlock on import. + */ + + static bool prevent_recursive_process_hack = false; + if (prevent_recursive_process_hack) { + break; + } + + prevent_recursive_process_hack = true; + + bool done_importing = false; + if (scanning_changes) { if (scanning_changes_done) { - scanning_changes = false; - set_process(false); thread_sources.wait_to_finish(); @@ -1251,6 +1264,8 @@ void EditorFileSystem::_notification(int p_what) { } emit_signal(SNAME("sources_changed"), sources_changed.size() > 0); first_scan = false; + scanning_changes = false; // Changed to false here to prevent recursive triggering of scan thread. + done_importing = true; } } else if (!scanning && thread.is_started()) { set_process(false); @@ -1268,10 +1283,12 @@ void EditorFileSystem::_notification(int p_what) { first_scan = false; } - if (!is_processing() && scan_changes_pending) { + if (done_importing && scan_changes_pending) { scan_changes_pending = false; scan_changes(); } + + prevent_recursive_process_hack = false; } } break; } @@ -2167,6 +2184,11 @@ void EditorFileSystem::_find_group_files(EditorFileSystemDirectory *efd, HashMap void EditorFileSystem::reimport_file_with_custom_parameters(const String &p_file, const String &p_importer, const HashMap<StringName, Variant> &p_custom_params) { _reimport_file(p_file, p_custom_params, p_importer); + + // Emit the resource_reimported signal for the single file we just reimported. + Vector<String> reloads; + reloads.append(p_file); + emit_signal(SNAME("resources_reimported"), reloads); } void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_import_data) { @@ -2175,6 +2197,7 @@ void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_im } void EditorFileSystem::reimport_files(const Vector<String> &p_files) { + ERR_FAIL_COND_MSG(importing, "Attempted to call reimport_files() recursively, this is not allowed."); importing = true; Vector<String> reloads; diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index bb7098643a..acbc3ce0dc 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -45,15 +45,34 @@ DocTools *EditorHelp::doc = nullptr; -void EditorHelp::_update_theme() { - text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp")); - title_color = get_theme_color(SNAME("title_color"), SNAME("EditorHelp")); - headline_color = get_theme_color(SNAME("headline_color"), SNAME("EditorHelp")); - comment_color = get_theme_color(SNAME("comment_color"), SNAME("EditorHelp")); - symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp")); - value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp")); - qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp")); - type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); +void EditorHelp::_update_theme_item_cache() { + VBoxContainer::_update_theme_item_cache(); + + theme_cache.text_color = get_theme_color(SNAME("text_color"), SNAME("EditorHelp")); + theme_cache.title_color = get_theme_color(SNAME("title_color"), SNAME("EditorHelp")); + theme_cache.headline_color = get_theme_color(SNAME("headline_color"), SNAME("EditorHelp")); + theme_cache.comment_color = get_theme_color(SNAME("comment_color"), SNAME("EditorHelp")); + theme_cache.symbol_color = get_theme_color(SNAME("symbol_color"), SNAME("EditorHelp")); + theme_cache.value_color = get_theme_color(SNAME("value_color"), SNAME("EditorHelp")); + theme_cache.qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp")); + theme_cache.type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); + + theme_cache.doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); + theme_cache.doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); + theme_cache.doc_italic_font = get_theme_font(SNAME("doc_italic"), SNAME("EditorFonts")); + theme_cache.doc_title_font = get_theme_font(SNAME("doc_title"), SNAME("EditorFonts")); + theme_cache.doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); + theme_cache.doc_kbd_font = get_theme_font(SNAME("doc_keyboard"), SNAME("EditorFonts")); + + theme_cache.doc_font_size = get_theme_font_size(SNAME("doc_size"), SNAME("EditorFonts")); + theme_cache.doc_title_font_size = get_theme_font_size(SNAME("doc_title_size"), SNAME("EditorFonts")); + theme_cache.doc_code_font_size = get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts")); + theme_cache.doc_kbd_font_size = get_theme_font_size(SNAME("doc_keyboard_size"), SNAME("EditorFonts")); + + theme_cache.background_style = get_theme_stylebox(SNAME("background"), SNAME("EditorHelp")); + + class_desc->add_theme_font_override("normal_font", theme_cache.doc_font); + class_desc->add_theme_font_size_override("normal_font_size", theme_cache.doc_font_size); class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); class_desc->add_theme_constant_override("line_separation", get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp"))); @@ -61,13 +80,6 @@ void EditorHelp::_update_theme() { class_desc->add_theme_constant_override("table_v_separation", get_theme_constant(SNAME("table_v_separation"), SNAME("EditorHelp"))); class_desc->add_theme_constant_override("text_highlight_h_padding", get_theme_constant(SNAME("text_highlight_h_padding"), SNAME("EditorHelp"))); class_desc->add_theme_constant_override("text_highlight_v_padding", get_theme_constant(SNAME("text_highlight_v_padding"), SNAME("EditorHelp"))); - - doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); - doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); - doc_title_font = get_theme_font(SNAME("doc_title"), SNAME("EditorFonts")); - doc_code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); - - doc_title_font_size = get_theme_font_size(SNAME("doc_title_size"), SNAME("EditorFonts")); } void EditorHelp::_search(bool p_search_previous) { @@ -187,14 +199,12 @@ void EditorHelp::_class_desc_input(const Ref<InputEvent> &p_input) { void EditorHelp::_class_desc_resized(bool p_force_update_theme) { // Add extra horizontal margins for better readability. // The margins increase as the width of the editor help container increases. - Ref<Font> font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); - int font_size = get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts")); - real_t char_width = font->get_char_size('x', font_size).width; + real_t char_width = theme_cache.doc_code_font->get_char_size('x', theme_cache.doc_code_font_size).width; const int new_display_margin = MAX(30 * EDSCALE, get_parent_anchorable_rect().size.width - char_width * 120 * EDSCALE) * 0.5; if (display_margin != new_display_margin || p_force_update_theme) { display_margin = new_display_margin; - Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"))->duplicate(); + Ref<StyleBox> class_desc_stylebox = theme_cache.background_style->duplicate(); class_desc_stylebox->set_content_margin(SIDE_LEFT, display_margin); class_desc_stylebox->set_content_margin(SIDE_RIGHT, display_margin); class_desc->add_theme_style_override("normal", class_desc_stylebox); @@ -204,7 +214,7 @@ void EditorHelp::_class_desc_resized(bool p_force_update_theme) { void EditorHelp::_add_type(const String &p_type, const String &p_enum) { if (p_type.is_empty() || p_type == "void") { - class_desc->push_color(Color(type_color, 0.5)); + class_desc->push_color(Color(theme_cache.type_color, 0.5)); class_desc->push_hint(TTR("No return value.")); class_desc->add_text("void"); class_desc->pop(); @@ -224,7 +234,7 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) { } } - class_desc->push_color(type_color); + class_desc->push_color(theme_cache.type_color); bool add_array = false; if (can_ref) { if (t.ends_with("[]")) { @@ -333,7 +343,7 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->push_meta("@method " + p_method.name); } - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(p_method.name); class_desc->pop(); @@ -341,12 +351,12 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->pop(); //meta } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("("); class_desc->pop(); for (int j = 0; j < p_method.arguments.size(); j++) { - class_desc->push_color(text_color); + class_desc->push_color(theme_cache.text_color); if (j > 0) { class_desc->add_text(", "); } @@ -355,10 +365,10 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview class_desc->add_text(": "); _add_type(p_method.arguments[j].type, p_method.arguments[j].enumeration); if (!p_method.arguments[j].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" = "); class_desc->pop(); - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(p_method.arguments[j].default_value)); class_desc->pop(); } @@ -367,21 +377,21 @@ void EditorHelp::_add_method(const DocData::MethodDoc &p_method, bool p_overview } if (is_vararg) { - class_desc->push_color(text_color); + class_desc->push_color(theme_cache.text_color); if (p_method.arguments.size()) { class_desc->add_text(", "); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("..."); class_desc->pop(); class_desc->pop(); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(")"); class_desc->pop(); if (!p_method.qualifiers.is_empty()) { - class_desc->push_color(qualifier_color); + class_desc->push_color(theme_cache.qualifier_color); PackedStringArray qualifiers = p_method.qualifiers.split_spaces(); for (const String &qualifier : qualifiers) { @@ -426,6 +436,38 @@ void EditorHelp::_add_bulletpoint() { class_desc->add_text(String(prefix)); } +void EditorHelp::_push_normal_font() { + class_desc->push_font(theme_cache.doc_font); + class_desc->push_font_size(theme_cache.doc_font_size); +} + +void EditorHelp::_pop_normal_font() { + class_desc->pop(); + class_desc->pop(); +} + +void EditorHelp::_push_title_font() { + class_desc->push_color(theme_cache.title_color); + class_desc->push_font(theme_cache.doc_title_font); + class_desc->push_font_size(theme_cache.doc_title_font_size); +} + +void EditorHelp::_pop_title_font() { + class_desc->pop(); + class_desc->pop(); + class_desc->pop(); +} + +void EditorHelp::_push_code_font() { + class_desc->push_font(theme_cache.doc_code_font); + class_desc->push_font_size(theme_cache.doc_code_font_size); +} + +void EditorHelp::_pop_code_font() { + class_desc->pop(); + class_desc->pop(); +} + Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) { if (!doc->class_list.has(p_class)) { return ERR_DOES_NOT_EXIST; @@ -447,13 +489,9 @@ Error EditorHelp::_goto_desc(const String &p_class, int p_vscr) { } void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods) { - Ref<Font> font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); - class_desc->pop(); // title font size - class_desc->pop(); // title font - class_desc->pop(); // title color - class_desc->add_newline(); - class_desc->push_font(font); + + _push_code_font(); class_desc->push_indent(1); class_desc->push_table(2); class_desc->set_table_column_expand(1, true); @@ -504,18 +542,14 @@ void EditorHelp::_update_method_list(const Vector<DocData::MethodDoc> p_methods) class_desc->pop(); //table class_desc->pop(); - class_desc->pop(); // font + _pop_code_font(); + class_desc->add_newline(); class_desc->add_newline(); } void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, const Vector<DocData::MethodDoc> p_methods, const String &p_method_type) { - Ref<Font> font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); - Ref<Font> code_font = get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); - String link_color_text = title_color.to_html(false); - class_desc->pop(); // title font size - class_desc->pop(); // title font - class_desc->pop(); // title color + String link_color_text = theme_cache.title_color.to_html(false); class_desc->add_newline(); class_desc->add_newline(); @@ -531,15 +565,15 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, } for (int i = 0; i < methods_filtered.size(); i++) { - class_desc->push_font(code_font); + _push_code_font(); _add_method(methods_filtered[i], false); - class_desc->pop(); + _pop_code_font(); class_desc->add_newline(); class_desc->add_newline(); - class_desc->push_color(text_color); - class_desc->push_font(font); + class_desc->push_color(theme_cache.text_color); + _push_normal_font(); class_desc->push_indent(1); if (methods_filtered[i].errors_returned.size()) { class_desc->append_text(TTR("Error codes returned:")); @@ -571,7 +605,7 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, } else { class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); class_desc->add_text(" "); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); if (p_classdoc.is_script_doc) { class_desc->append_text(vformat(TTR("There is currently no description for this %s."), p_method_type)); } else { @@ -581,8 +615,9 @@ void EditorHelp::_update_method_descriptions(const DocData::ClassDoc p_classdoc, } class_desc->pop(); + _pop_normal_font(); class_desc->pop(); - class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); class_desc->add_newline(); @@ -601,25 +636,20 @@ void EditorHelp::_update_doc() { method_line.clear(); section_line.clear(); - _update_theme(); - String link_color_text = title_color.to_html(false); + String link_color_text = theme_cache.title_color.to_html(false); DocData::ClassDoc cd = doc->class_list[edited_class]; // Make a copy, so we can sort without worrying. // Class name section_line.push_back(Pair<String, int>(TTR("Top"), 0)); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); - class_desc->push_color(title_color); + _push_title_font(); class_desc->add_text(TTR("Class:") + " "); - _add_type_icon(edited_class, doc_title_font_size); + _add_type_icon(edited_class, theme_cache.doc_title_font_size); class_desc->add_text(" "); - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(edited_class); class_desc->pop(); // color - class_desc->pop(); // color - class_desc->pop(); // font size - class_desc->pop(); // font + _pop_title_font(); if (cd.is_deprecated) { class_desc->add_text(" "); @@ -639,8 +669,8 @@ void EditorHelp::_update_doc() { // Ascendents if (!cd.inherits.is_empty()) { - class_desc->push_color(title_color); - class_desc->push_font(doc_font); + class_desc->push_color(theme_cache.title_color); + _push_normal_font(); class_desc->add_text(TTR("Inherits:") + " "); String inherits = cd.inherits; @@ -657,7 +687,7 @@ void EditorHelp::_update_doc() { } } - class_desc->pop(); + _pop_normal_font(); class_desc->pop(); class_desc->add_newline(); } @@ -667,11 +697,11 @@ void EditorHelp::_update_doc() { bool found = false; bool prev = false; - class_desc->push_font(doc_font); + _push_normal_font(); for (const KeyValue<String, DocData::ClassDoc> &E : doc->class_list) { if (E.value.inherits == cd.name) { if (!found) { - class_desc->push_color(title_color); + class_desc->push_color(theme_cache.title_color); class_desc->add_text(TTR("Inherited by:") + " "); found = true; } @@ -685,7 +715,7 @@ void EditorHelp::_update_doc() { prev = true; } } - class_desc->pop(); + _pop_normal_font(); if (found) { class_desc->pop(); @@ -722,13 +752,14 @@ void EditorHelp::_update_doc() { if (!cd.brief_description.strip_edges().is_empty()) { has_description = true; - class_desc->push_color(text_color); - class_desc->push_font(doc_bold_font); + class_desc->push_color(theme_cache.text_color); + class_desc->push_font(theme_cache.doc_bold_font); class_desc->push_indent(1); _add_text(DTR(cd.brief_description)); class_desc->pop(); class_desc->pop(); class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); class_desc->add_newline(); @@ -740,23 +771,20 @@ void EditorHelp::_update_doc() { section_line.push_back(Pair<String, int>(TTR("Description"), class_desc->get_paragraph_count() - 2)); description_line = class_desc->get_paragraph_count() - 2; - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Description")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); - class_desc->push_color(text_color); - class_desc->push_font(doc_font); + class_desc->push_color(theme_cache.text_color); + _push_normal_font(); class_desc->push_indent(1); _add_text(DTR(cd.description)); class_desc->pop(); + _pop_normal_font(); class_desc->pop(); - class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); class_desc->add_newline(); @@ -765,7 +793,7 @@ void EditorHelp::_update_doc() { if (!has_description) { class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); class_desc->add_text(" "); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); if (cd.is_script_doc) { class_desc->append_text(TTR("There is currently no description for this class.")); @@ -780,18 +808,15 @@ void EditorHelp::_update_doc() { // Online tutorials if (cd.tutorials.size()) { - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Online Tutorials")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); - class_desc->push_indent(1); - class_desc->push_font(doc_code_font); class_desc->add_newline(); + class_desc->push_indent(1); + _push_code_font(); + for (int i = 0; i < cd.tutorials.size(); i++) { const String link = DTR(cd.tutorials[i].link); String linktxt = (cd.tutorials[i].title.is_empty()) ? link : DTR(cd.tutorials[i].title); @@ -800,14 +825,15 @@ void EditorHelp::_update_doc() { linktxt = link.substr(seppos + 2); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->append_text("[url=" + link + "]" + linktxt + "[/url]"); class_desc->pop(); class_desc->add_newline(); } + _pop_code_font(); class_desc->pop(); - class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); } @@ -829,16 +855,13 @@ void EditorHelp::_update_doc() { if (has_properties) { section_line.push_back(Pair<String, int>(TTR("Properties"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Properties")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); - class_desc->push_font(doc_code_font); + + _push_code_font(); class_desc->push_indent(1); class_desc->push_table(4); class_desc->set_table_column_expand(1, true); @@ -853,9 +876,9 @@ void EditorHelp::_update_doc() { // Property type. class_desc->push_cell(); class_desc->push_paragraph(HORIZONTAL_ALIGNMENT_RIGHT, Control::TEXT_DIRECTION_AUTO, ""); - class_desc->push_font(doc_code_font); + _push_code_font(); _add_type(cd.properties[i].type, cd.properties[i].enumeration); - class_desc->pop(); + _pop_code_font(); class_desc->pop(); class_desc->pop(); // cell @@ -880,8 +903,8 @@ void EditorHelp::_update_doc() { // Property name. class_desc->push_cell(); - class_desc->push_font(doc_code_font); - class_desc->push_color(headline_color); + _push_code_font(); + class_desc->push_color(theme_cache.headline_color); if (describe) { class_desc->push_meta("@member " + cd.properties[i].name); @@ -894,15 +917,15 @@ void EditorHelp::_update_doc() { } class_desc->pop(); - class_desc->pop(); + _pop_code_font(); class_desc->pop(); // cell // Property value. class_desc->push_cell(); - class_desc->push_font(doc_code_font); + _push_code_font(); if (!cd.properties[i].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); if (cd.properties[i].overridden) { class_desc->add_text(" ["); class_desc->push_meta("@member " + cd.properties[i].overrides + "." + cd.properties[i].name); @@ -914,11 +937,11 @@ void EditorHelp::_update_doc() { } class_desc->pop(); - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(cd.properties[i].default_value)); class_desc->pop(); - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); class_desc->pop(); } @@ -930,46 +953,47 @@ void EditorHelp::_update_doc() { EXPERIMENTAL_DOC_TAG; } - class_desc->pop(); + _pop_code_font(); class_desc->pop(); // cell // Property setters and getters. class_desc->push_cell(); - class_desc->push_font(doc_code_font); + _push_code_font(); if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" [" + TTR("property:") + " "); class_desc->pop(); // color if (!cd.properties[i].setter.is_empty()) { - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); class_desc->add_text("setter"); class_desc->pop(); // color } if (!cd.properties[i].getter.is_empty()) { if (!cd.properties[i].setter.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(", "); class_desc->pop(); // color } - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); class_desc->add_text("getter"); class_desc->pop(); // color } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); class_desc->pop(); // color } - class_desc->pop(); + _pop_code_font(); class_desc->pop(); // cell } class_desc->pop(); // table class_desc->pop(); - class_desc->pop(); // font + _pop_code_font(); + class_desc->add_newline(); class_desc->add_newline(); } @@ -998,10 +1022,10 @@ void EditorHelp::_update_doc() { } section_line.push_back(Pair<String, int>(TTR("Constructors"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Constructors")); + _pop_title_font(); + _update_method_list(cd.constructors); } @@ -1011,10 +1035,10 @@ void EditorHelp::_update_doc() { } section_line.push_back(Pair<String, int>(TTR("Methods"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Methods")); + _pop_title_font(); + _update_method_list(methods); } @@ -1024,23 +1048,19 @@ void EditorHelp::_update_doc() { } section_line.push_back(Pair<String, int>(TTR("Operators"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Operators")); + _pop_title_font(); + _update_method_list(cd.operators); } // Theme properties if (!cd.theme_properties.is_empty()) { section_line.push_back(Pair<String, int>(TTR("Theme Properties"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Theme Properties")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); @@ -1062,59 +1082,55 @@ void EditorHelp::_update_doc() { if (theme_data_type != cd.theme_properties[i].data_type) { theme_data_type = cd.theme_properties[i].data_type; - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); if (data_type_names.has(theme_data_type)) { class_desc->add_text(data_type_names[theme_data_type]); } else { class_desc->add_text(""); } - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); } // Theme item header. - class_desc->push_font(doc_code_font); + _push_code_font(); _add_bulletpoint(); // Theme item object type. _add_type(cd.theme_properties[i].type); // Theme item name. - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); class_desc->add_text(" "); _add_text(cd.theme_properties[i].name); class_desc->pop(); // Theme item default value. if (!cd.theme_properties[i].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" [" + TTR("default:") + " "); class_desc->pop(); - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(cd.theme_properties[i].default_value)); class_desc->pop(); - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); class_desc->pop(); } - class_desc->pop(); // monofont + _pop_code_font(); // Theme item description. if (!cd.theme_properties[i].description.strip_edges().is_empty()) { - class_desc->push_font(doc_font); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); + _push_normal_font(); class_desc->push_indent(1); _add_text(DTR(cd.theme_properties[i].description)); class_desc->pop(); // indent + _pop_normal_font(); class_desc->pop(); // color - class_desc->pop(); // font } class_desc->add_newline(); @@ -1132,13 +1148,9 @@ void EditorHelp::_update_doc() { } section_line.push_back(Pair<String, int>(TTR("Signals"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Signals")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); @@ -1148,16 +1160,16 @@ void EditorHelp::_update_doc() { for (int i = 0; i < cd.signals.size(); i++) { signal_line[cd.signals[i].name] = class_desc->get_paragraph_count() - 2; // Gets overridden if description. - class_desc->push_font(doc_code_font); // monofont + _push_code_font(); _add_bulletpoint(); - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(cd.signals[i].name); class_desc->pop(); - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("("); class_desc->pop(); for (int j = 0; j < cd.signals[i].arguments.size(); j++) { - class_desc->push_color(text_color); + class_desc->push_color(theme_cache.text_color); if (j > 0) { class_desc->add_text(", "); } @@ -1166,7 +1178,7 @@ void EditorHelp::_update_doc() { class_desc->add_text(": "); _add_type(cd.signals[i].arguments[j].type); if (!cd.signals[i].arguments[j].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" = "); class_desc->pop(); _add_text(cd.signals[i].arguments[j].default_value); @@ -1175,7 +1187,7 @@ void EditorHelp::_update_doc() { class_desc->pop(); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(")"); if (cd.signals[i].is_deprecated) { @@ -1186,16 +1198,18 @@ void EditorHelp::_update_doc() { } class_desc->pop(); - class_desc->pop(); // end monofont + _pop_code_font(); + if (!cd.signals[i].description.strip_edges().is_empty()) { - class_desc->push_font(doc_font); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); + _push_normal_font(); class_desc->push_indent(1); _add_text(DTR(cd.signals[i].description)); class_desc->pop(); // indent - class_desc->pop(); - class_desc->pop(); // font + _pop_normal_font(); + class_desc->pop(); // color } + class_desc->add_newline(); class_desc->add_newline(); } @@ -1228,13 +1242,9 @@ void EditorHelp::_update_doc() { // Enums if (enums.size()) { section_line.push_back(Pair<String, int>(TTR("Enumerations"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Enumerations")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->push_indent(1); class_desc->add_newline(); @@ -1242,24 +1252,26 @@ void EditorHelp::_update_doc() { for (KeyValue<String, Vector<DocData::ConstantDoc>> &E : enums) { enum_line[E.key] = class_desc->get_paragraph_count() - 2; - class_desc->push_font(doc_code_font); - class_desc->push_color(title_color); + _push_code_font(); + class_desc->push_color(theme_cache.title_color); if (E.value.size() && E.value[0].is_bitfield) { class_desc->add_text("flags "); } else { class_desc->add_text("enum "); } class_desc->pop(); + String e = E.key; if ((e.get_slice_count(".") > 1) && (e.get_slice(".", 0) == edited_class)) { e = e.get_slice(".", 1); } - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); class_desc->add_text(e); class_desc->pop(); - class_desc->pop(); - class_desc->push_color(symbol_color); + _pop_code_font(); + + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(":"); class_desc->pop(); @@ -1268,13 +1280,14 @@ void EditorHelp::_update_doc() { // Enum description. if (e != "@unnamed_enums" && cd.enums.has(e)) { - class_desc->push_color(text_color); - class_desc->push_font(doc_font); + class_desc->push_color(theme_cache.text_color); + _push_normal_font(); class_desc->push_indent(1); _add_text(cd.enums[e]); class_desc->pop(); + _pop_normal_font(); class_desc->pop(); - class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); } @@ -1293,18 +1306,18 @@ void EditorHelp::_update_doc() { // Add the enum constant line to the constant_line map so we can locate it as a constant. constant_line[enum_list[i].name] = class_desc->get_paragraph_count() - 2; - class_desc->push_font(doc_code_font); + _push_code_font(); _add_bulletpoint(); - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(enum_list[i].name); class_desc->pop(); - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" = "); class_desc->pop(); - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(enum_list[i].value)); class_desc->pop(); - class_desc->pop(); + _pop_code_font(); if (enum_list[i].is_deprecated) { DEPRECATED_DOC_TAG; @@ -1317,10 +1330,10 @@ void EditorHelp::_update_doc() { class_desc->add_newline(); if (!enum_list[i].description.strip_edges().is_empty()) { - class_desc->push_font(doc_font); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); + _push_normal_font(); _add_text(DTR(enum_list[i].description)); - class_desc->pop(); + _pop_normal_font(); class_desc->pop(); if (DTR(enum_list[i].description).find("\n") > 0) { class_desc->add_newline(); @@ -1346,20 +1359,17 @@ void EditorHelp::_update_doc() { // Constants if (constants.size()) { section_line.push_back(Pair<String, int>(TTR("Constants"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Constants")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->push_indent(1); class_desc->add_newline(); for (int i = 0; i < constants.size(); i++) { constant_line[constants[i].name] = class_desc->get_paragraph_count() - 2; - class_desc->push_font(doc_code_font); + + _push_code_font(); if (constants[i].value.begins_with("Color(") && constants[i].value.ends_with(")")) { String stripped = constants[i].value.replace(" ", "").replace("Color(", "").replace(")", ""); @@ -1373,17 +1383,17 @@ void EditorHelp::_update_doc() { _add_bulletpoint(); } - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(constants[i].name); class_desc->pop(); - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" = "); class_desc->pop(); - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(constants[i].value)); class_desc->pop(); - class_desc->pop(); + _pop_code_font(); if (constants[i].is_deprecated) { DEPRECATED_DOC_TAG; @@ -1396,10 +1406,10 @@ void EditorHelp::_update_doc() { class_desc->add_newline(); if (!constants[i].description.strip_edges().is_empty()) { - class_desc->push_font(doc_font); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); + _push_normal_font(); _add_text(DTR(constants[i].description)); - class_desc->pop(); + _pop_normal_font(); class_desc->pop(); if (DTR(constants[i].description).find("\n") > 0) { class_desc->add_newline(); @@ -1421,13 +1431,9 @@ void EditorHelp::_update_doc() { } section_line.push_back(Pair<String, int>(TTR("Annotations"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Annotations")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); @@ -1437,18 +1443,18 @@ void EditorHelp::_update_doc() { for (int i = 0; i < cd.annotations.size(); i++) { annotation_line[cd.annotations[i].name] = class_desc->get_paragraph_count() - 2; // Gets overridden if description. - class_desc->push_font(doc_code_font); // monofont + _push_code_font(); _add_bulletpoint(); - class_desc->push_color(headline_color); + class_desc->push_color(theme_cache.headline_color); _add_text(cd.annotations[i].name); class_desc->pop(); if (cd.annotations[i].arguments.size() > 0) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("("); class_desc->pop(); for (int j = 0; j < cd.annotations[i].arguments.size(); j++) { - class_desc->push_color(text_color); + class_desc->push_color(theme_cache.text_color); if (j > 0) { class_desc->add_text(", "); } @@ -1457,7 +1463,7 @@ void EditorHelp::_update_doc() { class_desc->add_text(": "); _add_type(cd.annotations[i].arguments[j].type); if (!cd.annotations[i].arguments[j].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" = "); class_desc->pop(); _add_text(cd.annotations[i].arguments[j].default_value); @@ -1467,43 +1473,43 @@ void EditorHelp::_update_doc() { } if (cd.annotations[i].qualifiers.contains("vararg")) { - class_desc->push_color(text_color); + class_desc->push_color(theme_cache.text_color); if (cd.annotations[i].arguments.size()) { class_desc->add_text(", "); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("..."); class_desc->pop(); class_desc->pop(); } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(")"); class_desc->pop(); } if (!cd.annotations[i].qualifiers.is_empty()) { - class_desc->push_color(qualifier_color); + class_desc->push_color(theme_cache.qualifier_color); class_desc->add_text(" "); _add_text(cd.annotations[i].qualifiers); class_desc->pop(); } - class_desc->pop(); // end monofont + _pop_code_font(); if (!cd.annotations[i].description.strip_edges().is_empty()) { - class_desc->push_font(doc_font); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); + _push_normal_font(); class_desc->push_indent(1); _add_text(DTR(cd.annotations[i].description)); class_desc->pop(); // indent - class_desc->pop(); - class_desc->pop(); // font + _pop_normal_font(); + class_desc->pop(); // color } else { class_desc->push_indent(1); class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); class_desc->add_text(" "); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); if (cd.is_script_doc) { class_desc->append_text(TTR("There is currently no description for this annotation.")); } else { @@ -1523,13 +1529,9 @@ void EditorHelp::_update_doc() { // Property descriptions if (has_properties) { section_line.push_back(Pair<String, int>(TTR("Property Descriptions"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Property Descriptions")); - class_desc->pop(); // font size - class_desc->pop(); // font - class_desc->pop(); // color + _pop_title_font(); class_desc->add_newline(); class_desc->add_newline(); @@ -1538,6 +1540,10 @@ void EditorHelp::_update_doc() { if (cd.properties[i].overridden) { continue; } + // Ignore undocumented private. + if (cd.properties[i].name.begins_with("_") && cd.properties[i].description.strip_edges().is_empty()) { + continue; + } property_line[cd.properties[i].name] = class_desc->get_paragraph_count() - 2; @@ -1545,30 +1551,30 @@ void EditorHelp::_update_doc() { class_desc->set_table_column_expand(1, true); class_desc->push_cell(); - class_desc->push_font(doc_code_font); + _push_code_font(); _add_bulletpoint(); _add_type(cd.properties[i].type, cd.properties[i].enumeration); class_desc->add_text(" "); - class_desc->pop(); // font + _pop_code_font(); class_desc->pop(); // cell class_desc->push_cell(); - class_desc->push_font(doc_code_font); - class_desc->push_color(headline_color); + _push_code_font(); + class_desc->push_color(theme_cache.headline_color); _add_text(cd.properties[i].name); class_desc->pop(); // color if (!cd.properties[i].default_value.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" [" + TTR("default:") + " "); class_desc->pop(); // color - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); _add_text(_fix_constant(cd.properties[i].default_value)); class_desc->pop(); // color - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); class_desc->pop(); // color } @@ -1581,32 +1587,32 @@ void EditorHelp::_update_doc() { } if (cd.is_script_doc && (!cd.properties[i].setter.is_empty() || !cd.properties[i].getter.is_empty())) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(" [" + TTR("property:") + " "); class_desc->pop(); // color if (!cd.properties[i].setter.is_empty()) { - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); class_desc->add_text("setter"); class_desc->pop(); // color } if (!cd.properties[i].getter.is_empty()) { if (!cd.properties[i].setter.is_empty()) { - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text(", "); class_desc->pop(); // color } - class_desc->push_color(value_color); + class_desc->push_color(theme_cache.value_color); class_desc->add_text("getter"); class_desc->pop(); // color } - class_desc->push_color(symbol_color); + class_desc->push_color(theme_cache.symbol_color); class_desc->add_text("]"); class_desc->pop(); // color } - class_desc->pop(); // font + _pop_code_font(); class_desc->pop(); // cell // Script doc doesn't have setter, getter. @@ -1621,8 +1627,9 @@ void EditorHelp::_update_doc() { class_desc->pop(); // cell class_desc->push_cell(); - class_desc->push_font(doc_code_font); - class_desc->push_color(text_color); + _push_code_font(); + class_desc->push_color(theme_cache.text_color); + if (method_map[cd.properties[i].setter].arguments.size() > 1) { // Setters with additional arguments are exposed in the method list, so we link them here for quick access. class_desc->push_meta("@method " + cd.properties[i].setter); @@ -1631,12 +1638,14 @@ void EditorHelp::_update_doc() { } else { class_desc->add_text(cd.properties[i].setter + TTR("(value)")); } + class_desc->pop(); // color - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); class_desc->add_text(" setter"); class_desc->pop(); // color - class_desc->pop(); // font + _pop_code_font(); class_desc->pop(); // cell + method_line[cd.properties[i].setter] = property_line[cd.properties[i].name]; } @@ -1645,8 +1654,9 @@ void EditorHelp::_update_doc() { class_desc->pop(); // cell class_desc->push_cell(); - class_desc->push_font(doc_code_font); - class_desc->push_color(text_color); + _push_code_font(); + class_desc->push_color(theme_cache.text_color); + if (method_map[cd.properties[i].getter].arguments.size() > 0) { // Getters with additional arguments are exposed in the method list, so we link them here for quick access. class_desc->push_meta("@method " + cd.properties[i].getter); @@ -1655,12 +1665,14 @@ void EditorHelp::_update_doc() { } else { class_desc->add_text(cd.properties[i].getter + "()"); } - class_desc->pop(); //color - class_desc->push_color(comment_color); + + class_desc->pop(); // color + class_desc->push_color(theme_cache.comment_color); class_desc->add_text(" getter"); - class_desc->pop(); //color - class_desc->pop(); //font - class_desc->pop(); //cell + class_desc->pop(); // color + _pop_code_font(); + class_desc->pop(); // cell + method_line[cd.properties[i].getter] = property_line[cd.properties[i].name]; } } @@ -1670,15 +1682,15 @@ void EditorHelp::_update_doc() { class_desc->add_newline(); class_desc->add_newline(); - class_desc->push_color(text_color); - class_desc->push_font(doc_font); + class_desc->push_color(theme_cache.text_color); + _push_normal_font(); class_desc->push_indent(1); if (!cd.properties[i].description.strip_edges().is_empty()) { _add_text(DTR(cd.properties[i].description)); } else { class_desc->add_image(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); class_desc->add_text(" "); - class_desc->push_color(comment_color); + class_desc->push_color(theme_cache.comment_color); if (cd.is_script_doc) { class_desc->append_text(TTR("There is currently no description for this property.")); } else { @@ -1687,8 +1699,9 @@ void EditorHelp::_update_doc() { class_desc->pop(); } class_desc->pop(); + _pop_normal_font(); class_desc->pop(); - class_desc->pop(); + class_desc->add_newline(); class_desc->add_newline(); class_desc->add_newline(); @@ -1698,30 +1711,30 @@ void EditorHelp::_update_doc() { // Constructor descriptions if (!cd.constructors.is_empty()) { section_line.push_back(Pair<String, int>(TTR("Constructor Descriptions"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Constructor Descriptions")); + _pop_title_font(); + _update_method_descriptions(cd, cd.constructors, "constructor"); } // Method descriptions if (!methods.is_empty()) { section_line.push_back(Pair<String, int>(TTR("Method Descriptions"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Method Descriptions")); + _pop_title_font(); + _update_method_descriptions(cd, methods, "method"); } // Operator descriptions if (!cd.operators.is_empty()) { section_line.push_back(Pair<String, int>(TTR("Operator Descriptions"), class_desc->get_paragraph_count() - 2)); - class_desc->push_color(title_color); - class_desc->push_font(doc_title_font); - class_desc->push_font_size(doc_title_font_size); + _push_title_font(); class_desc->add_text(TTR("Operator Descriptions")); + _pop_title_font(); + _update_method_descriptions(cd, cd.operators, "operator"); } @@ -1816,6 +1829,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control Ref<Font> doc_code_font = p_owner_node->get_theme_font(SNAME("doc_source"), SNAME("EditorFonts")); Ref<Font> doc_kbd_font = p_owner_node->get_theme_font(SNAME("doc_keyboard"), SNAME("EditorFonts")); + int doc_code_font_size = p_owner_node->get_theme_font_size(SNAME("doc_source_size"), SNAME("EditorFonts")); + int doc_kbd_font_size = p_owner_node->get_theme_font_size(SNAME("doc_keyboard_size"), SNAME("EditorFonts")); + const Color type_color = p_owner_node->get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); const Color code_color = p_owner_node->get_theme_color(SNAME("code_color"), SNAME("EditorHelp")); const Color kbd_color = p_owner_node->get_theme_color(SNAME("kbd_color"), SNAME("EditorHelp")); @@ -1939,10 +1955,12 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control if (tag != "/img") { p_rt->pop(); if (code_tag) { + p_rt->pop(); // font size // Pop both color and background color. p_rt->pop(); p_rt->pop(); } else if (codeblock_tag) { + p_rt->pop(); // font size // Pop color, cell and table. p_rt->pop(); p_rt->pop(); @@ -1964,6 +1982,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control // Use monospace font to make clickable references // easier to distinguish from inline code and other text. p_rt->push_font(doc_code_font); + p_rt->push_font_size(doc_code_font_size); Color target_color = link_color; if (link_tag == "method") { @@ -1978,7 +1997,9 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control p_rt->add_text(link_target + (link_tag == "method" ? "()" : "")); p_rt->pop(); p_rt->pop(); - p_rt->pop(); + + p_rt->pop(); // font size + p_rt->pop(); // font pos = brk_end + 1; } else if (tag.begins_with("param ")) { @@ -1987,13 +2008,16 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control // Use monospace font with translucent background color to make code easier to distinguish from other text. p_rt->push_font(doc_code_font); + p_rt->push_font_size(doc_code_font_size); + p_rt->push_bgcolor(param_bg_color); p_rt->push_color(code_color); p_rt->add_text(param_name); p_rt->pop(); p_rt->pop(); - p_rt->pop(); + p_rt->pop(); // font size + p_rt->pop(); // font pos = brk_end + 1; } else if (doc->class_list.has(tag)) { @@ -2001,29 +2025,37 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control // Use monospace font to make clickable references // easier to distinguish from inline code and other text. p_rt->push_font(doc_code_font); + p_rt->push_font_size(doc_code_font_size); + p_rt->push_color(type_color); p_rt->push_meta("#" + tag); p_rt->add_text(tag); p_rt->pop(); p_rt->pop(); - p_rt->pop(); + + p_rt->pop(); // font size + p_rt->pop(); // font pos = brk_end + 1; } else if (tag == "b") { // Use bold font. p_rt->push_font(doc_bold_font); + pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "i") { // Use italics font. p_rt->push_font(doc_italic_font); + pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "code") { // Use monospace font with darkened background color to make code easier to distinguish from other text. p_rt->push_font(doc_code_font); + p_rt->push_font_size(doc_code_font_size); p_rt->push_bgcolor(code_bg_color); p_rt->push_color(code_color.lerp(p_owner_node->get_theme_color(SNAME("error_color"), SNAME("Editor")), 0.6)); + code_tag = true; pos = brk_end + 1; tag_stack.push_front(tag); @@ -2032,22 +2064,28 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control // Use a single-column table with cell row background color instead of `[bgcolor]`. // This makes the background color highlight cover the entire block, rather than individual lines. p_rt->push_font(doc_code_font); + p_rt->push_font_size(doc_code_font_size); + p_rt->push_table(1); p_rt->push_cell(); p_rt->set_cell_row_background_color(code_bg_color, Color(code_bg_color, 0.99)); p_rt->set_cell_padding(Rect2(10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE, 10 * EDSCALE)); p_rt->push_color(code_dark_color); + codeblock_tag = true; pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "kbd") { // Use keyboard font with custom color and background color. p_rt->push_font(doc_kbd_font); + p_rt->push_font_size(doc_kbd_font_size); p_rt->push_bgcolor(kbd_bg_color); p_rt->push_color(kbd_color); + code_tag = true; // Though not strictly a code tag, logic is similar. pos = brk_end + 1; tag_stack.push_front(tag); + } else if (tag == "center") { // Align to center. p_rt->push_paragraph(HORIZONTAL_ALIGNMENT_CENTER, Control::TEXT_DIRECTION_AUTO, ""); @@ -2081,6 +2119,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control } else if (tag.begins_with("url=")) { String url = tag.substr(4, tag.length()); p_rt->push_meta(url); + pos = brk_end + 1; tag_stack.push_front("url"); } else if (tag == "img") { @@ -2101,6 +2140,7 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt, Control String col = tag.substr(6, tag.length()); Color color = Color::from_string(col, Color()); p_rt->push_color(color); + pos = brk_end + 1; tag_stack.push_front("color"); @@ -2163,6 +2203,11 @@ void EditorHelp::_toggle_scripts_pressed() { void EditorHelp::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_POSTINITIALIZE: { + // Requires theme to be up to date. + _class_desc_resized(false); + } break; + case NOTIFICATION_READY: case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { _wait_for_thread(); @@ -2275,13 +2320,11 @@ EditorHelp::EditorHelp() { add_child(class_desc); class_desc->set_threaded(true); class_desc->set_v_size_flags(SIZE_EXPAND_FILL); - class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); class_desc->connect("finished", callable_mp(this, &EditorHelp::_class_desc_finished)); class_desc->connect("meta_clicked", callable_mp(this, &EditorHelp::_class_desc_select)); class_desc->connect("gui_input", callable_mp(this, &EditorHelp::_class_desc_input)); class_desc->connect("resized", callable_mp(this, &EditorHelp::_class_desc_resized).bind(false)); - _class_desc_resized(false); // Added second so it opens at the bottom so it won't offset the entire widget. find_bar = memnew(FindBar); @@ -2431,7 +2474,6 @@ void FindBar::popup_search() { void FindBar::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { find_prev->set_icon(get_theme_icon(SNAME("MoveUp"), SNAME("EditorIcons"))); find_next->set_icon(get_theme_icon(SNAME("MoveDown"), SNAME("EditorIcons"))); diff --git a/editor/editor_help.h b/editor/editor_help.h index 81cd6d6674..b2ffe3bc29 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -125,25 +125,33 @@ class EditorHelp : public VBoxContainer { String base_path; - Color text_color; - Color title_color; - Color headline_color; - Color comment_color; - Color symbol_color; - Color value_color; - Color qualifier_color; - Color type_color; - - Ref<Font> doc_font; - Ref<Font> doc_bold_font; - Ref<Font> doc_title_font; - Ref<Font> doc_code_font; - - int doc_title_font_size; + struct ThemeCache { + Ref<StyleBox> background_style; + + Color text_color; + Color title_color; + Color headline_color; + Color comment_color; + Color symbol_color; + Color value_color; + Color qualifier_color; + Color type_color; + + Ref<Font> doc_font; + Ref<Font> doc_bold_font; + Ref<Font> doc_italic_font; + Ref<Font> doc_title_font; + Ref<Font> doc_code_font; + Ref<Font> doc_kbd_font; + + int doc_font_size = 0; + int doc_title_font_size = 0; + int doc_code_font_size = 0; + int doc_kbd_font_size = 0; + } theme_cache; int scroll_to = -1; - void _update_theme(); void _help_callback(const String &p_topic); void _add_text(const String &p_bbcode); @@ -156,6 +164,13 @@ class EditorHelp : public VBoxContainer { void _add_bulletpoint(); + void _push_normal_font(); + void _pop_normal_font(); + void _push_title_font(); + void _pop_title_font(); + void _push_code_font(); + void _pop_code_font(); + void _class_desc_finished(); void _class_list_select(const String &p_select); void _class_desc_select(const String &p_select); @@ -181,6 +196,8 @@ class EditorHelp : public VBoxContainer { static void _gen_doc_thread(void *p_udata); protected: + virtual void _update_theme_item_cache() override; + void _notification(int p_what); static void _bind_methods(); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 275e47e370..4533bcc51c 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -693,7 +693,7 @@ void EditorProperty::gui_input(const Ref<InputEvent> &p_event) { bool is_valid_revert = false; Variant revert_value = EditorPropertyRevert::get_property_revert_value(object, property, &is_valid_revert); ERR_FAIL_COND(!is_valid_revert); - emit_changed(property, revert_value); + emit_changed(_get_revert_property(), revert_value); update_property(); } @@ -2566,12 +2566,13 @@ bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName } void EditorInspector::update_tree() { - //to update properly if all is refreshed + // Store currently selected and focused elements to restore after the update. + // TODO: Can be useful to store more context for the focusable, such as the caret position in LineEdit. StringName current_selected = property_selected; int current_focusable = -1; if (property_focusable != -1) { - //check focusable is really focusable + // Check that focusable is actually focusable. bool restore_focus = false; Control *focused = get_viewport() ? get_viewport()->gui_get_focus_owner() : nullptr; if (focused) { @@ -2579,8 +2580,8 @@ void EditorInspector::update_tree() { while (parent) { EditorInspector *inspector = Object::cast_to<EditorInspector>(parent); if (inspector) { - restore_focus = inspector == this; //may be owned by another inspector - break; //exit after the first inspector is found, since there may be nested ones + restore_focus = inspector == this; // May be owned by another inspector. + break; // Exit after the first inspector is found, since there may be nested ones. } parent = parent->get_parent(); } @@ -2591,7 +2592,9 @@ void EditorInspector::update_tree() { } } - _clear(); + // Only hide plugins if we are not editing any object. + // This should be handled outside of the update_tree call anyway (see EditorInspector::edit), but might as well keep it safe. + _clear(!object); if (!object) { return; @@ -3301,17 +3304,19 @@ void EditorInspector::update_property(const String &p_prop) { } } -void EditorInspector::_clear() { +void EditorInspector::_clear(bool p_hide_plugins) { while (main_vbox->get_child_count()) { memdelete(main_vbox->get_child(0)); } + property_selected = StringName(); property_focusable = -1; editor_property_map.clear(); sections.clear(); pending.clear(); restart_request_props.clear(); - if (_is_main_editor_inspector()) { + + if (p_hide_plugins && _is_main_editor_inspector()) { EditorNode::get_singleton()->hide_unused_editors(this); } } @@ -3405,7 +3410,6 @@ void EditorInspector::register_text_enter(Node *p_line_edit) { } void EditorInspector::_filter_changed(const String &p_text) { - _clear(); update_tree(); } diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index eab495ef3d..37ff2e9b52 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -451,7 +451,7 @@ class EditorInspector : public ScrollContainer { List<EditorInspectorSection *> sections; HashSet<StringName> pending; - void _clear(); + void _clear(bool p_hide_plugins = true); Object *object = nullptr; // diff --git a/editor/editor_locale_dialog.cpp b/editor/editor_locale_dialog.cpp index fbf3c99690..13b4a8c128 100644 --- a/editor/editor_locale_dialog.cpp +++ b/editor/editor_locale_dialog.cpp @@ -294,7 +294,7 @@ void EditorLocaleDialog::_update_tree() { if (!is_edit_mode) { TreeItem *t = script_list->create_item(s_root); - t->set_text(0, "[Default]"); + t->set_text(0, TTR("[Default]")); t->set_metadata(0, ""); } @@ -404,7 +404,7 @@ EditorLocaleDialog::EditorLocaleDialog() { } { edit_filters = memnew(CheckButton); - edit_filters->set_text("Edit Filters"); + edit_filters->set_text(TTR("Edit Filters")); edit_filters->set_toggle_mode(true); edit_filters->set_pressed(false); edit_filters->connect("toggled", callable_mp(this, &EditorLocaleDialog::_edit_filters)); @@ -412,7 +412,7 @@ EditorLocaleDialog::EditorLocaleDialog() { } { advanced = memnew(CheckButton); - advanced->set_text("Advanced"); + advanced->set_text(TTR("Advanced")); advanced->set_toggle_mode(true); advanced->set_pressed(false); advanced->connect("toggled", callable_mp(this, &EditorLocaleDialog::_toggle_advanced)); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 3adebb2f8e..a0e876315c 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -691,10 +691,11 @@ void EditorNode::_notification(int p_what) { bool theme_changed = EditorSettings::get_singleton()->check_changed_settings_in_group("interface/theme") || - EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") || EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/font") || EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/main_font") || EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/code_font") || + EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") || + EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/help/help") || EditorSettings::get_singleton()->check_changed_settings_in_group("filesystem/file_dialog/thumbnail_size"); if (theme_changed) { @@ -3685,7 +3686,7 @@ void EditorNode::_set_main_scene_state(Dictionary p_state, Node *p_for_scene) { Node *editor_node = SceneTreeDock::get_singleton()->get_tree_editor()->get_selected(); editor_node = editor_node == nullptr ? get_edited_scene() : editor_node; - if (Object::cast_to<Node2D>(editor_node) || Object::cast_to<Control>(editor_node)) { + if (Object::cast_to<CanvasItem>(editor_node)) { editor_select(EDITOR_2D); } else if (Object::cast_to<Node3D>(editor_node)) { editor_select(EDITOR_3D); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 33bba90c70..30c7d2b85f 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -4174,9 +4174,12 @@ struct EditorPropertyRangeHint { bool radians = false; }; -static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const String &p_hint_text, double p_default_step) { +static EditorPropertyRangeHint _parse_range_hint(PropertyHint p_hint, const String &p_hint_text, double p_default_step, bool is_int = false) { EditorPropertyRangeHint hint; hint.step = p_default_step; + if (is_int) { + hint.hide_slider = false; // Always show slider for ints, unless specified in hint range. + } Vector<String> slices = p_hint_text.split(","); if (p_hint == PROPERTY_HINT_RANGE) { ERR_FAIL_COND_V_MSG(slices.size() < 2, hint, @@ -4294,7 +4297,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } else { EditorPropertyInteger *editor = memnew(EditorPropertyInteger); - EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); editor->setup(hint.min, hint.max, hint.step, hint.hide_slider, hint.or_greater, hint.or_less, hint.suffix); return editor; @@ -4383,7 +4386,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } break; case Variant::VECTOR2I: { EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide)); - EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); editor->setup(hint.min, hint.max, p_hint == PROPERTY_HINT_LINK, hint.suffix); return editor; @@ -4396,7 +4399,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } break; case Variant::RECT2I: { EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i(p_wide)); - EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); editor->setup(hint.min, hint.max, hint.suffix); return editor; @@ -4410,7 +4413,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } break; case Variant::VECTOR3I: { EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide)); - EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); editor->setup(hint.min, hint.max, p_hint == PROPERTY_HINT_LINK, hint.suffix); return editor; @@ -4424,7 +4427,7 @@ EditorProperty *EditorInspectorDefaultPlugin::get_editor_for_property(Object *p_ } break; case Variant::VECTOR4I: { EditorPropertyVector4i *editor = memnew(EditorPropertyVector4i); - EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1); + EditorPropertyRangeHint hint = _parse_range_hint(p_hint, p_hint_text, 1, true); editor->setup(hint.min, hint.max, hint.suffix); return editor; diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index 24cfa7ad7b..80ebd32295 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -1009,6 +1009,14 @@ void EditorPropertyDictionary::update_property() { prop = memnew(EditorPropertyRID); } break; + case Variant::SIGNAL: { + prop = memnew(EditorPropertySignal); + + } break; + case Variant::CALLABLE: { + prop = memnew(EditorPropertyCallable); + + } break; case Variant::OBJECT: { if (Object::cast_to<EncodedObjectAsID>(value)) { EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID); diff --git a/editor/editor_property_name_processor.cpp b/editor/editor_property_name_processor.cpp index a183e62618..b62615adcc 100644 --- a/editor/editor_property_name_processor.cpp +++ b/editor/editor_property_name_processor.cpp @@ -137,6 +137,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() { capitalize_string_remaps["bptc"] = "BPTC"; capitalize_string_remaps["bvh"] = "BVH"; capitalize_string_remaps["ca"] = "CA"; + capitalize_string_remaps["ccdik"] = "CCDIK"; capitalize_string_remaps["cd"] = "CD"; capitalize_string_remaps["cpu"] = "CPU"; capitalize_string_remaps["csg"] = "CSG"; @@ -148,6 +149,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() { capitalize_string_remaps["erp"] = "ERP"; capitalize_string_remaps["etc"] = "ETC"; capitalize_string_remaps["etc2"] = "ETC2"; + capitalize_string_remaps["fabrik"] = "FABRIK"; capitalize_string_remaps["fbx"] = "FBX"; capitalize_string_remaps["fbx2gltf"] = "FBX2glTF"; capitalize_string_remaps["fft"] = "FFT"; @@ -165,6 +167,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() { capitalize_string_remaps["glb"] = "GLB"; capitalize_string_remaps["gles2"] = "GLES2"; capitalize_string_remaps["gles3"] = "GLES3"; + capitalize_string_remaps["gltf"] = "glTF"; capitalize_string_remaps["gpu"] = "GPU"; capitalize_string_remaps["gui"] = "GUI"; capitalize_string_remaps["guid"] = "GUID"; @@ -196,6 +199,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() { capitalize_string_remaps["lcd"] = "LCD"; capitalize_string_remaps["ldr"] = "LDR"; capitalize_string_remaps["lod"] = "LOD"; + capitalize_string_remaps["lods"] = "LODs"; capitalize_string_remaps["lowpass"] = "Low-pass"; capitalize_string_remaps["macos"] = "macOS"; capitalize_string_remaps["mb"] = "(MB)"; // Unit. diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 8eb2551843..23e32dcbd8 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -384,9 +384,6 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { if (score > 0 && score >= best_score) { best = locale; best_score = score; - if (score == 10) { - break; // Exact match, skip the rest. - } } } if (best_score == 0) { @@ -586,9 +583,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Help _initial_set("text_editor/help/show_help_index", true); - EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_font_size", 15, "8,48,1") - EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_source_font_size", 14, "8,48,1") - EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_title_font_size", 23, "8,48,1") + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_font_size", 16, "8,48,1") + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_source_font_size", 15, "8,48,1") + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "text_editor/help/help_title_font_size", 23, "8,64,1") EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "text_editor/help/class_reference_examples", 0, "GDScript,C#,GDScript and C#") /* Editors */ diff --git a/editor/event_listener_line_edit.cpp b/editor/event_listener_line_edit.cpp index ea4a7133bf..ee401810ad 100644 --- a/editor/event_listener_line_edit.cpp +++ b/editor/event_listener_line_edit.cpp @@ -105,7 +105,8 @@ String EventListenerLineEdit::get_event_text(const Ref<InputEvent> &p_event, boo desc = RTR(_joy_axis_descriptions[2 * (size_t)jp_motion->get_axis() + (jp_motion->get_axis_value() < 0 ? 0 : 1)]); } - text = vformat("Joypad Axis %s %s (%s)", itos((int64_t)jp_motion->get_axis()), jp_motion->get_axis_value() < 0 ? "-" : "+", desc); + // TRANSLATORS: %d is the axis number, the first %s is either "-" or "+", and the second %s is the description of the axis. + text = vformat(TTR("Joypad Axis %d %s (%s)"), (int64_t)jp_motion->get_axis(), jp_motion->get_axis_value() < 0 ? "-" : "+", desc); } if (p_include_device && (mouse.is_valid() || jp_button.is_valid() || jp_motion.is_valid())) { String device_string = get_device_string(p_event->get_device()); diff --git a/editor/export/editor_export_platform.cpp b/editor/export/editor_export_platform.cpp index a46484bb0e..96a8cc8b91 100644 --- a/editor/export/editor_export_platform.cpp +++ b/editor/export/editor_export_platform.cpp @@ -1513,7 +1513,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, b f = FileAccess::open(p_path, FileAccess::WRITE); if (f.is_null()) { DirAccess::remove_file_or_error(tmppath); - add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file to read from path \"%s\"."), tmppath)); + add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file for writing at path \"%s\"."), p_path)); return ERR_CANT_CREATE; } } else { @@ -1521,7 +1521,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, b f = FileAccess::open(p_path, FileAccess::READ_WRITE); if (f.is_null()) { DirAccess::remove_file_or_error(tmppath); - add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open executable file from path \"%s\"."), tmppath)); + add_message(EXPORT_MESSAGE_ERROR, TTR("Save PCK"), vformat(TTR("Can't open file for reading-writing at path \"%s\"."), p_path)); return ERR_FILE_CANT_OPEN; } diff --git a/editor/export/editor_export_platform_pc.cpp b/editor/export/editor_export_platform_pc.cpp index bbfd73be5e..7f934bc45b 100644 --- a/editor/export/editor_export_platform_pc.cpp +++ b/editor/export/editor_export_platform_pc.cpp @@ -33,6 +33,9 @@ #include "core/config/project_settings.h" void EditorExportPlatformPC::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const { + if (p_preset->get("texture_format/bptc")) { + r_features->push_back("bptc"); + } if (p_preset->get("texture_format/s3tc")) { r_features->push_back("s3tc"); } diff --git a/editor/icons/ParallaxBackground.svg b/editor/icons/ParallaxBackground.svg index 71a586eff4..6f25954df3 100644 --- a/editor/icons/ParallaxBackground.svg +++ b/editor/icons/ParallaxBackground.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m2 2a1 1 0 0 0 -1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-10a1 1 0 0 0 -1-1zm0 1h12v10h-12zm5 2-3 3 3 3zm2 0v6l3-3z" fill="#e0e0e0" transform="translate(0 1036.4)"/></g></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v10c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-10c.0000096-.55228.44772-.99999 1-1zm4 3-3 3 3 3zm2 0v6l3-3z" fill="#e0e0e0"/></svg> diff --git a/editor/icons/ParallaxLayer.svg b/editor/icons/ParallaxLayer.svg index 6945798e9c..df177bd7a2 100644 --- a/editor/icons/ParallaxLayer.svg +++ b/editor/icons/ParallaxLayer.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm0 1h10c.55228.0000096.99999.44772 1 1v10c-.00001.55228-.44772.99999-1 1h-10c-.55228-.00001-.99999-.44772-1-1v-10c.0000096-.55228.44772-.99999 1-1zm4 3-3 3 3 3zm2 0v6l3-3z" fill="#8da5f3" fill-rule="evenodd" transform="translate(0 1036.4)"/></g></svg> +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1079989 0-2 .8920011-2 2v10c0 1.107999.8920011 2 2 2h10c1.107999 0 2-.892001 2-2v-10c0-1.1079989-.892001-2-2-2zm4 4v6l-3-3zm2 0 3 3-3 3z" fill="#8da5f3" fill-rule="evenodd"/></svg> diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index 6e74c42b2c..b34656c481 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -36,7 +36,9 @@ #include "editor/editor_inspector.h" #include "editor/editor_locale_dialog.h" #include "editor/editor_node.h" +#include "editor/editor_property_name_processor.h" #include "editor/editor_scale.h" +#include "editor/editor_settings.h" /*************************************************************************/ /* Settings data */ @@ -926,6 +928,15 @@ void DynamicFontImportSettings::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { add_var->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) { + EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style(); + inspector_general->set_property_name_style(style); + inspector_vars->set_property_name_style(style); + inspector_text->set_property_name_style(style); + } + } break; } } @@ -1334,6 +1345,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { inspector_general->set_v_size_flags(Control::SIZE_EXPAND_FILL); inspector_general->set_custom_minimum_size(Size2(300 * EDSCALE, 250 * EDSCALE)); inspector_general->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_main_prop_changed)); + inspector_general->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); page1_hb->add_child(inspector_general); // Page 2 layout: Configurations @@ -1386,6 +1398,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { inspector_vars = memnew(EditorInspector); inspector_vars->set_v_size_flags(Control::SIZE_EXPAND_FILL); inspector_vars->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_variation_changed)); + inspector_vars->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); page2_side_vb->add_child(inspector_vars); VBoxContainer *preload_pages_vb = memnew(VBoxContainer); @@ -1461,6 +1474,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { inspector_text->set_v_size_flags(Control::SIZE_EXPAND_FILL); inspector_text->set_custom_minimum_size(Size2(300 * EDSCALE, 250 * EDSCALE)); inspector_text->connect("property_edited", callable_mp(this, &DynamicFontImportSettings::_change_text_opts)); + inspector_text->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); page2_1_hb->add_child(inspector_text); text_edit = memnew(TextEdit); diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp index 8d26feebf4..6eebb84216 100644 --- a/editor/import/scene_import_settings.cpp +++ b/editor/import/scene_import_settings.cpp @@ -64,6 +64,11 @@ class SceneImportSettingsData : public Object { current[p_name] = p_value; + // SceneImportSettings must decide if a new collider should be generated or not + if (category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MESH_3D_NODE) { + SceneImportSettings::get_singleton()->request_generate_collider(); + } + if (SceneImportSettings::get_singleton()->is_editing_animation()) { if (category == ResourceImporterScene::INTERNAL_IMPORT_CATEGORY_MAX) { if (ResourceImporterScene::get_animation_singleton()->get_option_visibility(path, p_name, current)) { @@ -420,9 +425,9 @@ void SceneImportSettings::_update_view_gizmos() { return; } for (const KeyValue<String, NodeData> &e : node_map) { - bool generate_collider = false; + bool show_collider_view = false; if (e.value.settings.has(SNAME("generate/physics"))) { - generate_collider = e.value.settings[SNAME("generate/physics")]; + show_collider_view = e.value.settings[SNAME("generate/physics")]; } MeshInstance3D *mesh_node = Object::cast_to<MeshInstance3D>(e.value.node); @@ -436,7 +441,7 @@ void SceneImportSettings::_update_view_gizmos() { CRASH_COND_MSG(descendants.is_empty(), "This is unreachable, since the collider view is always created even when the collision is not used! If this is triggered there is a bug on the function `_fill_scene`."); MeshInstance3D *collider_view = static_cast<MeshInstance3D *>(descendants[0].operator Object *()); - collider_view->set_visible(generate_collider); + collider_view->set_visible(show_collider_view); if (generate_collider) { // This collider_view doesn't have a mesh so we need to generate a new one. @@ -466,6 +471,8 @@ void SceneImportSettings::_update_view_gizmos() { collider_view->set_transform(transform); } } + + generate_collider = false; } void SceneImportSettings::_update_camera() { @@ -530,6 +537,10 @@ void SceneImportSettings::_load_default_subresource_settings(HashMap<StringName, } } +void SceneImportSettings::request_generate_collider() { + generate_collider = true; +} + void SceneImportSettings::update_view() { update_view_timer->start(); } diff --git a/editor/import/scene_import_settings.h b/editor/import/scene_import_settings.h index 6481221ad6..69bf58b627 100644 --- a/editor/import/scene_import_settings.h +++ b/editor/import/scene_import_settings.h @@ -191,6 +191,7 @@ class SceneImportSettings : public ConfirmationDialog { void _load_default_subresource_settings(HashMap<StringName, Variant> &settings, const String &p_type, const String &p_import_id, ResourceImporterScene::InternalImportCategory p_category); bool editing_animation = false; + bool generate_collider = false; Timer *update_view_timer = nullptr; @@ -199,6 +200,7 @@ protected: public: bool is_editing_animation() const { return editing_animation; } + void request_generate_collider(); void update_view(); void open_settings(const String &p_path, bool p_for_animation = false); static SceneImportSettings *get_singleton(); diff --git a/editor/input_event_configuration_dialog.cpp b/editor/input_event_configuration_dialog.cpp index fb450a41d3..c620858439 100644 --- a/editor/input_event_configuration_dialog.cpp +++ b/editor/input_event_configuration_dialog.cpp @@ -538,6 +538,8 @@ void InputEventConfigurationDialog::_notification(int p_what) { icon_cache.joypad_button = get_theme_icon(SNAME("JoyButton"), SNAME("EditorIcons")); icon_cache.joypad_axis = get_theme_icon(SNAME("JoyAxis"), SNAME("EditorIcons")); + event_as_text->add_theme_font_override("font", get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + _update_input_list(); } break; } @@ -591,7 +593,6 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { event_as_text = memnew(Label); event_as_text->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART); event_as_text->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); - event_as_text->add_theme_font_override("font", get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); event_as_text->add_theme_font_size_override("font_size", 18 * EDSCALE); main_vbox->add_child(event_as_text); diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index 2981862291..cf8555d07d 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -232,8 +232,8 @@ void MeshLibraryEditor::_menu_cbk(int p_option) { } break; case MENU_OPTION_REMOVE_ITEM: { String p = InspectorDock::get_inspector_singleton()->get_selected_path(); - if (p.begins_with("/MeshLibrary/item") && p.get_slice_count("/") >= 3) { - to_erase = p.get_slice("/", 3).to_int(); + if (p.begins_with("item") && p.get_slice_count("/") >= 2) { + to_erase = p.get_slice("/", 1).to_int(); cd_remove->set_text(vformat(TTR("Remove item %d?"), to_erase)); cd_remove->popup_centered(Size2(300, 60)); } diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index b001b4f766..fc1d8936d5 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -3392,7 +3392,6 @@ void Node3DEditorViewport::_menu_option(int p_option) { VIEW_DISPLAY_SHADELESS, VIEW_DISPLAY_LIGHTING, VIEW_DISPLAY_NORMAL_BUFFER, - VIEW_DISPLAY_WIREFRAME, VIEW_DISPLAY_DEBUG_SHADOW_ATLAS, VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS, VIEW_DISPLAY_DEBUG_VOXEL_GI_ALBEDO, @@ -3422,7 +3421,6 @@ void Node3DEditorViewport::_menu_option(int p_option) { Viewport::DEBUG_DRAW_UNSHADED, Viewport::DEBUG_DRAW_LIGHTING, Viewport::DEBUG_DRAW_NORMAL_BUFFER, - Viewport::DEBUG_DRAW_WIREFRAME, Viewport::DEBUG_DRAW_SHADOW_ATLAS, Viewport::DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS, Viewport::DEBUG_DRAW_VOXEL_GI_ALBEDO, @@ -3445,9 +3443,7 @@ void Node3DEditorViewport::_menu_option(int p_option) { Viewport::DEBUG_DRAW_MOTION_VECTORS, }; - int idx = 0; - - while (display_options[idx] != VIEW_MAX) { + for (int idx = 0; display_options[idx] != VIEW_MAX; idx++) { int id = display_options[idx]; int item_idx = view_menu->get_popup()->get_item_index(id); if (item_idx != -1) { @@ -3461,7 +3457,6 @@ void Node3DEditorViewport::_menu_option(int p_option) { if (id == p_option) { viewport->set_debug_draw(debug_draw_modes[idx]); } - idx++; } } break; } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index e515b46b1e..ccbc7c3d74 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -33,6 +33,7 @@ #include "core/config/project_settings.h" #include "core/input/input.h" #include "core/io/file_access.h" +#include "core/io/json.h" #include "core/io/resource_loader.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -209,6 +210,27 @@ Ref<EditorSyntaxHighlighter> EditorPlainTextSyntaxHighlighter::_create() const { return syntax_highlighter; } +//// + +void EditorJSONSyntaxHighlighter::_update_cache() { + highlighter->set_text_edit(text_edit); + highlighter->clear_keyword_colors(); + highlighter->clear_member_keyword_colors(); + highlighter->clear_color_regions(); + + highlighter->set_symbol_color(EDITOR_GET("text_editor/theme/highlighting/symbol_color")); + highlighter->set_number_color(EDITOR_GET("text_editor/theme/highlighting/number_color")); + + const Color string_color = EDITOR_GET("text_editor/theme/highlighting/string_color"); + highlighter->add_color_region("\"", "\"", string_color); +} + +Ref<EditorSyntaxHighlighter> EditorJSONSyntaxHighlighter::_create() const { + Ref<EditorJSONSyntaxHighlighter> syntax_highlighter; + syntax_highlighter.instantiate(); + return syntax_highlighter; +} + //////////////////////////////////////////////////////////////////////////////// /*** SCRIPT EDITOR ****/ @@ -702,9 +724,10 @@ void ScriptEditor::_open_recent_script(int p_idx) { if (FileAccess::exists(path)) { List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); + ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions); if (extensions.find(path.get_extension())) { - Ref<Script> scr = ResourceLoader::load(path); + Ref<Resource> scr = ResourceLoader::load(path); if (scr.is_valid()) { edit(scr, true); return; @@ -1182,6 +1205,7 @@ void ScriptEditor::_menu_option(int p_option) { List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); + ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions); bool built_in = !path.is_resource_file(); if (extensions.find(path.get_extension()) || built_in) { @@ -1196,7 +1220,7 @@ void ScriptEditor::_menu_option(int p_option) { } } - Ref<Script> scr = ResourceLoader::load(path); + Ref<Resource> scr = ResourceLoader::load(path); if (!scr.is_valid()) { EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + path, TTR("Error!")); file_dialog_option = -1; @@ -2319,12 +2343,23 @@ bool ScriptEditor::edit(const Ref<Resource> &p_resource, int p_line, int p_col, } se->add_syntax_highlighter(highlighter); - if (scr != nullptr && !highlighter_set) { - PackedStringArray languages = highlighter->_get_supported_languages(); + if (highlighter_set) { + continue; + } + + PackedStringArray languages = highlighter->_get_supported_languages(); + // If script try language, else use extension. + if (scr != nullptr) { if (languages.has(scr->get_language()->get_name())) { se->set_syntax_highlighter(highlighter); highlighter_set = true; } + continue; + } + + if (languages.has(p_resource->get_path().get_extension())) { + se->set_syntax_highlighter(highlighter); + highlighter_set = true; } } @@ -2483,7 +2518,7 @@ void ScriptEditor::save_all_scripts() { } else { // For built-in scripts, save their scenes instead. const String scene_path = edited_res->get_path().get_slice("::", 0); - if (!scenes_to_save.has(scene_path)) { + if (!scene_path.is_empty() && !scenes_to_save.has(scene_path)) { scenes_to_save.push_back(scene_path); } } @@ -2528,7 +2563,7 @@ void ScriptEditor::reload_scripts(bool p_refresh_only) { } Ref<Script> scr = edited_res; - if (scr != nullptr) { + if (scr.is_valid()) { Ref<Script> rel_scr = ResourceLoader::load(scr->get_path(), scr->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); ERR_CONTINUE(!rel_scr.is_valid()); scr->set_source_code(rel_scr->get_source_code()); @@ -2536,13 +2571,17 @@ void ScriptEditor::reload_scripts(bool p_refresh_only) { scr->reload(true); } + Ref<JSON> json = edited_res; + if (json != nullptr) { + Ref<JSON> rel_json = ResourceLoader::load(json->get_path(), json->get_class(), ResourceFormatLoader::CACHE_MODE_IGNORE); + ERR_CONTINUE(!rel_json.is_valid()); + json->parse(rel_json->get_parsed_text(), true); + json->set_last_modified_time(rel_json->get_last_modified_time()); + } + Ref<TextFile> text_file = edited_res; - if (text_file != nullptr) { - Error err; - Ref<TextFile> rel_text_file = _load_text_file(text_file->get_path(), &err); - ERR_CONTINUE(!rel_text_file.is_valid()); - text_file->set_text(rel_text_file->get_text()); - text_file->set_last_modified_time(rel_text_file->get_last_modified_time()); + if (text_file.is_valid()) { + text_file->reload_from_file(); } } @@ -2568,8 +2607,9 @@ void ScriptEditor::open_text_file_create_dialog(const String &p_base_path, const Ref<Resource> ScriptEditor::open_file(const String &p_file) { List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); + ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions); if (extensions.find(p_file.get_extension())) { - Ref<Script> scr = ResourceLoader::load(p_file); + Ref<Resource> scr = ResourceLoader::load(p_file); if (!scr.is_valid()) { EditorNode::get_singleton()->show_warning(TTR("Could not load file at:") + "\n\n" + p_file, TTR("Error!")); return Ref<Resource>(); @@ -2870,8 +2910,8 @@ bool ScriptEditor::can_drop_data_fw(const Point2 &p_point, const Variant &p_data if (file.is_empty() || !FileAccess::exists(file)) { continue; } - if (ResourceLoader::exists(file, "Script")) { - Ref<Script> scr = ResourceLoader::load(file); + if (ResourceLoader::exists(file, "Script") || ResourceLoader::exists(file, "JSON")) { + Ref<Resource> scr = ResourceLoader::load(file); if (scr.is_valid()) { return true; } @@ -2951,7 +2991,7 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co continue; } - if (!ResourceLoader::exists(file, "Script") && !textfile_extensions.has(file.get_extension())) { + if (!ResourceLoader::exists(file, "Script") && !ResourceLoader::exists(file, "JSON") && !textfile_extensions.has(file.get_extension())) { continue; } @@ -3109,6 +3149,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) { HashSet<String> loaded_scripts; List<String> extensions; ResourceLoader::get_recognized_extensions_for_type("Script", &extensions); + ResourceLoader::get_recognized_extensions_for_type("JSON", &extensions); for (int i = 0; i < scripts.size(); i++) { String path = scripts[i]; @@ -3127,7 +3168,7 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) { loaded_scripts.insert(path); if (extensions.find(path.get_extension())) { - Ref<Script> scr = ResourceLoader::load(path); + Ref<Resource> scr = ResourceLoader::load(path); if (!scr.is_valid()) { continue; } @@ -3481,6 +3522,12 @@ void ScriptEditor::_open_script_request(const String &p_path) { return; } + Ref<JSON> json = ResourceLoader::load(p_path); + if (json.is_valid()) { + script_editor->edit(json, false); + return; + } + Error err; Ref<TextFile> text_file = script_editor->_load_text_file(p_path, &err); if (text_file.is_valid()) { @@ -3543,7 +3590,8 @@ void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_numb return; } else { Ref<Script> scr = res; - if (scr.is_valid()) { + Ref<JSON> json = res; + if (scr.is_valid() || json.is_valid()) { edit(scr); ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(_get_current_editor()); @@ -3946,6 +3994,10 @@ ScriptEditor::ScriptEditor() { add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); tab_container->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); + + Ref<EditorJSONSyntaxHighlighter> json_syntax_highlighter; + json_syntax_highlighter.instantiate(); + register_syntax_highlighter(json_syntax_highlighter); } ScriptEditor::~ScriptEditor() { @@ -3967,6 +4019,8 @@ void ScriptEditorPlugin::edit(Object *p_object) { } } script_editor->edit(p_script); + } else if (Object::cast_to<JSON>(p_object)) { + script_editor->edit(Object::cast_to<JSON>(p_object)); } else if (Object::cast_to<TextFile>(p_object)) { script_editor->edit(Object::cast_to<TextFile>(p_object)); } @@ -3981,6 +4035,10 @@ bool ScriptEditorPlugin::handles(Object *p_object) const { return true; } + if (Object::cast_to<JSON>(p_object)) { + return true; + } + return p_object->is_class("Script"); } diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 988d07621c..f8e684ae34 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -96,6 +96,24 @@ public: virtual Ref<EditorSyntaxHighlighter> _create() const override; }; +class EditorJSONSyntaxHighlighter : public EditorSyntaxHighlighter { + GDCLASS(EditorJSONSyntaxHighlighter, EditorSyntaxHighlighter) + +private: + Ref<CodeHighlighter> highlighter; + +public: + virtual void _update_cache() override; + virtual Dictionary _get_line_syntax_highlighting_impl(int p_line) override { return highlighter->get_line_syntax_highlighting(p_line); } + + virtual PackedStringArray _get_supported_languages() const override { return PackedStringArray{ "json" }; } + virtual String _get_name() const override { return TTR("JSON"); } + + virtual Ref<EditorSyntaxHighlighter> _create() const override; + + EditorJSONSyntaxHighlighter() { highlighter.instantiate(); } +}; + /////////////////////////////////////////////////////////////////////////////// class ScriptEditorQuickOpen : public ConfirmationDialog { diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 6b4e7184d9..9fe1d8af99 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1362,11 +1362,36 @@ void ScriptTextEditor::_edit_option(int p_op) { code_editor->remove_all_bookmarks(); } break; case DEBUG_TOGGLE_BREAKPOINT: { - for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) { - int line = tx->get_caret_line(caret_idx); - bool dobreak = !tx->is_line_breakpointed(line); - tx->set_line_as_breakpoint(line, dobreak); - EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak); + Vector<int> caret_edit_order = tx->get_caret_index_edit_order(); + caret_edit_order.reverse(); + int last_line = -1; + for (const int &c : caret_edit_order) { + int from = tx->has_selection(c) ? tx->get_selection_from_line(c) : tx->get_caret_line(c); + from += from == last_line ? 1 : 0; + int to = tx->has_selection(c) ? tx->get_selection_to_line(c) : tx->get_caret_line(c); + if (to < from) { + continue; + } + // Check first if there's any lines with breakpoints in the selection. + bool selection_has_breakpoints = false; + for (int line = from; line <= to; line++) { + if (tx->is_line_breakpointed(line)) { + selection_has_breakpoints = true; + break; + } + } + + // Set breakpoint on caret or remove all bookmarks from the selection. + if (!selection_has_breakpoints) { + if (tx->get_caret_line(c) != last_line) { + tx->set_line_as_breakpoint(tx->get_caret_line(c), true); + } + } else { + for (int line = from; line <= to; line++) { + tx->set_line_as_breakpoint(line, false); + } + } + last_line = to; } } break; case DEBUG_REMOVE_ALL_BREAKPOINTS: { @@ -1820,30 +1845,72 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { color_position.x = row; color_position.y = col; - int begin = 0; - int end = 0; - bool valid = false; + int begin = -1; + int end = -1; + enum EXPRESSION_PATTERNS { + NOT_PARSED, + RGBA_PARAMETER, // Color(float,float,float) or Color(float,float,float,float) + COLOR_NAME, // Color.COLOR_NAME + } expression_pattern = NOT_PARSED; + for (int i = col; i < line.length(); i++) { if (line[i] == '(') { + if (expression_pattern == NOT_PARSED) { + begin = i; + expression_pattern = RGBA_PARAMETER; + } else { + // Method call or '(' appearing twice. + expression_pattern = NOT_PARSED; + + break; + } + } else if (expression_pattern == RGBA_PARAMETER && line[i] == ')' && end < 0) { + end = i + 1; + + break; + } else if (expression_pattern == NOT_PARSED && line[i] == '.') { begin = i; + expression_pattern = COLOR_NAME; + } else if (expression_pattern == COLOR_NAME && end < 0 && (line[i] == ' ' || line[i] == '\t')) { + // Including '.' and spaces. continue; - } else if (line[i] == ')') { - end = i + 1; - valid = true; + } else if (expression_pattern == COLOR_NAME && !(line[i] == '_' || ('A' <= line[i] && line[i] <= 'Z'))) { + end = i; + break; } } - if (valid) { - color_args = line.substr(begin, end - begin); - String stripped = color_args.replace(" ", "").replace("(", "").replace(")", ""); - PackedFloat64Array color = stripped.split_floats(","); - if (color.size() > 2) { - float alpha = color.size() > 3 ? color[3] : 1.0f; - color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha)); - } + + switch (expression_pattern) { + case RGBA_PARAMETER: { + color_args = line.substr(begin, end - begin); + String stripped = color_args.replace(" ", "").replace("\t", "").replace("(", "").replace(")", ""); + PackedFloat64Array color = stripped.split_floats(","); + if (color.size() > 2) { + float alpha = color.size() > 3 ? color[3] : 1.0f; + color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha)); + } + } break; + case COLOR_NAME: { + if (end < 0) { + end = line.length(); + } + color_args = line.substr(begin, end - begin); + const String color_name = color_args.replace(" ", "").replace("\t", "").replace(".", ""); + const int color_index = Color::find_named_color(color_name); + if (0 <= color_index) { + const Color color_constant = Color::get_named_color(color_index); + color_picker->set_pick_color(color_constant); + } else { + has_color = false; + } + } break; + default: + has_color = false; + break; + } + if (has_color) { color_panel->set_position(get_screen_position() + local_pos); - } else { - has_color = false; } } _make_context_menu(tx->has_selection(), has_color, foldable, open_docs, goto_definition, local_pos); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 7f43de3240..120cfbdefb 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -1276,8 +1276,6 @@ int Skeleton3DGizmoPlugin::subgizmos_intersect_ray(const EditorNode3DGizmo *p_gi } if (closest_idx >= 0) { - WARN_PRINT("ray:"); - WARN_PRINT(itos(closest_idx)); se->select_bone(closest_idx); return closest_idx; } diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index a376699e54..ceb170d7d8 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -30,6 +30,7 @@ #include "text_editor.h" +#include "core/io/json.h" #include "core/os/keyboard.h" #include "editor/editor_node.h" #include "editor/editor_settings.h" @@ -67,12 +68,12 @@ void TextEditor::_load_theme_settings() { String TextEditor::get_name() { String name; - name = text_file->get_path().get_file(); + name = edited_res->get_path().get_file(); if (name.is_empty()) { // This appears for newly created built-in text_files before saving the scene. name = TTR("[unsaved]"); - } else if (text_file->is_built_in()) { - const String &text_file_name = text_file->get_name(); + } else if (edited_res->is_built_in()) { + const String &text_file_name = edited_res->get_name(); if (!text_file_name.is_empty()) { // If the built-in text_file has a custom resource name defined, // display the built-in text_file name as follows: `ResourceName (scene_file.tscn)` @@ -88,20 +89,29 @@ String TextEditor::get_name() { } Ref<Texture2D> TextEditor::get_theme_icon() { - return EditorNode::get_singleton()->get_object_icon(text_file.ptr(), ""); + return EditorNode::get_singleton()->get_object_icon(edited_res.ptr(), "TextFile"); } Ref<Resource> TextEditor::get_edited_resource() const { - return text_file; + return edited_res; } void TextEditor::set_edited_resource(const Ref<Resource> &p_res) { - ERR_FAIL_COND(text_file.is_valid()); + ERR_FAIL_COND(edited_res.is_valid()); ERR_FAIL_COND(p_res.is_null()); - text_file = p_res; + edited_res = p_res; + + Ref<TextFile> text_file = edited_res; + if (text_file != nullptr) { + code_editor->get_text_editor()->set_text(text_file->get_text()); + } + + Ref<JSON> json_file = edited_res; + if (json_file != nullptr) { + code_editor->get_text_editor()->set_text(json_file->get_parsed_text()); + } - code_editor->get_text_editor()->set_text(text_file->get_text()); code_editor->get_text_editor()->clear_undo_history(); code_editor->get_text_editor()->tag_saved_version(); @@ -118,6 +128,8 @@ void TextEditor::enable_editor(Control *p_shortcut_context) { _load_theme_settings(); + _validate_script(); + if (p_shortcut_context) { for (int i = 0; i < edit_hb->get_child_count(); ++i) { Control *c = cast_to<Control>(edit_hb->get_child(i)); @@ -143,7 +155,7 @@ PackedInt32Array TextEditor::get_breakpoints() { } void TextEditor::reload_text() { - ERR_FAIL_COND(text_file.is_null()); + ERR_FAIL_COND(edited_res.is_null()); CodeEdit *te = code_editor->get_text_editor(); int column = te->get_caret_column(); @@ -151,7 +163,16 @@ void TextEditor::reload_text() { int h = te->get_h_scroll(); int v = te->get_v_scroll(); - te->set_text(text_file->get_text()); + Ref<TextFile> text_file = edited_res; + if (text_file != nullptr) { + te->set_text(text_file->get_text()); + } + + Ref<JSON> json_file = edited_res; + if (json_file != nullptr) { + te->set_text(json_file->get_parsed_text()); + } + te->set_caret_line(row); te->set_caret_column(column); te->set_h_scroll(h); @@ -166,6 +187,20 @@ void TextEditor::reload_text() { void TextEditor::_validate_script() { emit_signal(SNAME("name_changed")); emit_signal(SNAME("edited_script_changed")); + + Ref<JSON> json_file = edited_res; + if (json_file != nullptr) { + CodeEdit *te = code_editor->get_text_editor(); + + te->set_line_background_color(code_editor->get_error_pos().x, Color(0, 0, 0, 0)); + code_editor->set_error(""); + + if (json_file->parse(te->get_text(), true) != OK) { + code_editor->set_error(json_file->get_error_message()); + code_editor->set_error_pos(json_file->get_error_line(), 0); + te->set_line_background_color(code_editor->get_error_pos().x, EDITOR_GET("text_editor/theme/highlighting/mark_color")); + } + } } void TextEditor::_update_bookmark_list() { @@ -204,13 +239,22 @@ void TextEditor::_bookmark_item_pressed(int p_idx) { } void TextEditor::apply_code() { - text_file->set_text(code_editor->get_text_editor()->get_text()); + Ref<TextFile> text_file = edited_res; + if (text_file != nullptr) { + text_file->set_text(code_editor->get_text_editor()->get_text()); + } + + Ref<JSON> json_file = edited_res; + if (json_file != nullptr) { + json_file->parse(code_editor->get_text_editor()->get_text(), true); + } + code_editor->get_text_editor()->get_syntax_highlighter()->update_cache(); } bool TextEditor::is_unsaved() { const bool unsaved = code_editor->get_text_editor()->get_version() != code_editor->get_text_editor()->get_saved_version() || - text_file->get_path().is_empty(); // In memory. + edited_res->get_path().is_empty(); // In memory. return unsaved; } @@ -431,7 +475,7 @@ void TextEditor::_convert_case(CodeTextEditor::CaseStyle p_case) { } static ScriptEditorBase *create_editor(const Ref<Resource> &p_resource) { - if (Object::cast_to<TextFile>(*p_resource)) { + if (Object::cast_to<TextFile>(*p_resource) || Object::cast_to<JSON>(*p_resource)) { return memnew(TextEditor); } return nullptr; @@ -656,4 +700,5 @@ TextEditor::~TextEditor() { } void TextEditor::validate() { + this->code_editor->validate_script(); } diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 6db81508b3..85e0fee627 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -41,7 +41,7 @@ class TextEditor : public ScriptEditorBase { private: CodeTextEditor *code_editor = nullptr; - Ref<TextFile> text_file; + Ref<Resource> edited_res; bool editor_enabled = false; HBoxContainer *edit_hb = nullptr; diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 14ff59b442..073adb467a 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -3705,82 +3705,13 @@ ThemeEditor::ThemeEditor() { void ThemeEditorPlugin::edit(Object *p_node) { if (Object::cast_to<Theme>(p_node)) { theme_editor->edit(Object::cast_to<Theme>(p_node)); - } else if (Object::cast_to<Font>(p_node) || Object::cast_to<StyleBox>(p_node) || Object::cast_to<Texture2D>(p_node)) { - // Do nothing, keep editing the existing theme. } else { theme_editor->edit(Ref<Theme>()); } } bool ThemeEditorPlugin::handles(Object *p_node) const { - if (Object::cast_to<Theme>(p_node)) { - return true; - } - - Ref<Theme> edited_theme = theme_editor->get_edited_theme(); - if (edited_theme.is_null()) { - return false; - } - - // If we are editing a theme already and this particular resource happens to belong to it, - // then we just keep editing it, despite not being able to directly handle it. - // This only goes one layer deep, but if required this can be extended to support, say, Font inside of Font. - bool belongs_to_theme = false; - - if (Object::cast_to<Font>(p_node)) { - Ref<Font> font_item = Object::cast_to<Font>(p_node); - List<StringName> types; - List<StringName> names; - - edited_theme->get_font_type_list(&types); - for (const StringName &E : types) { - names.clear(); - edited_theme->get_font_list(E, &names); - - for (const StringName &F : names) { - if (font_item == edited_theme->get_font(F, E)) { - belongs_to_theme = true; - break; - } - } - } - } else if (Object::cast_to<StyleBox>(p_node)) { - Ref<StyleBox> stylebox_item = Object::cast_to<StyleBox>(p_node); - List<StringName> types; - List<StringName> names; - - edited_theme->get_stylebox_type_list(&types); - for (const StringName &E : types) { - names.clear(); - edited_theme->get_stylebox_list(E, &names); - - for (const StringName &F : names) { - if (stylebox_item == edited_theme->get_stylebox(F, E)) { - belongs_to_theme = true; - break; - } - } - } - } else if (Object::cast_to<Texture2D>(p_node)) { - Ref<Texture2D> icon_item = Object::cast_to<Texture2D>(p_node); - List<StringName> types; - List<StringName> names; - - edited_theme->get_icon_type_list(&types); - for (const StringName &E : types) { - names.clear(); - edited_theme->get_icon_list(E, &names); - - for (const StringName &F : names) { - if (icon_item == edited_theme->get_icon(F, E)) { - belongs_to_theme = true; - break; - } - } - } - } - - return belongs_to_theme; + return Object::cast_to<Theme>(p_node) != nullptr; } void ThemeEditorPlugin::make_visible(bool p_visible) { diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index fd651dd507..43c6d1a48b 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -404,13 +404,16 @@ void TileAtlasView::_draw_background_right() { } void TileAtlasView::set_atlas_source(TileSet *p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id) { - ERR_FAIL_COND(!p_tile_set); - ERR_FAIL_COND(!p_tile_set_atlas_source); + tile_set = p_tile_set; + tile_set_atlas_source = p_tile_set_atlas_source; + + if (!tile_set) { + return; + } + ERR_FAIL_COND(p_source_id < 0); ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source); - tile_set = p_tile_set; - tile_set_atlas_source = p_tile_set_atlas_source; source_id = p_source_id; // Show or hide the view. diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index f0a02a3768..4d9e2db682 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -571,14 +571,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p case DRAG_TYPE_PAINT: { HashMap<Vector2i, TileMapCell> to_draw = _draw_line(drag_start_mouse_pos, drag_last_mouse_pos, mpos, drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { - continue; - } Vector2i coords = E.key; if (!drag_modified.has(coords)) { drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords)); + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } - tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } _fix_invalid_tiles_in_tile_map_selection(); } break; @@ -588,14 +588,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p if (!drag_modified.has(line[i])) { HashMap<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { - continue; - } Vector2i coords = E.key; if (!drag_modified.has(coords)) { drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords)); + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } - tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } } } @@ -684,14 +684,14 @@ bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p if (!drag_modified.has(line[i])) { HashMap<Vector2i, TileMapCell> to_draw = _draw_bucket_fill(line[i], bucket_contiguous_checkbox->is_pressed(), drag_erasing); for (const KeyValue<Vector2i, TileMapCell> &E : to_draw) { - if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { - continue; - } Vector2i coords = E.key; if (!drag_modified.has(coords)) { drag_modified.insert(coords, tile_map->get_cell(tile_map_layer, coords)); + if (!drag_erasing && E.value.source_id == TileSet::INVALID_SOURCE) { + continue; + } + tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } - tile_map->set_cell(tile_map_layer, coords, E.value.source_id, E.value.get_atlas_coords(), E.value.alternative_tile); } } } @@ -1277,7 +1277,7 @@ void TileMapEditorTilesPlugin::_stop_dragging() { tile_map->set_cell(tile_map_layer, kv.key, kv.value.source_id, kv.value.get_atlas_coords(), kv.value.alternative_tile); } - if (EditorNode::get_singleton()->is_resource_read_only(tile_set)) { + if (!EditorNode::get_singleton()->is_resource_read_only(tile_set)) { // Creating a pattern in the pattern list. select_last_pattern = true; int new_pattern_index = tile_set->get_patterns_count(); @@ -2055,7 +2055,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { select_tool_button->set_flat(true); select_tool_button->set_toggle_mode(true); select_tool_button->set_button_group(tool_buttons_group); - select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", "Selection", Key::S)); + select_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/selection_tool", TTR("Selection"), Key::S)); select_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(select_tool_button); @@ -2063,7 +2063,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { paint_tool_button->set_flat(true); paint_tool_button->set_toggle_mode(true); paint_tool_button->set_button_group(tool_buttons_group); - paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D)); + paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", TTR("Paint"), Key::D)); paint_tool_button->set_tooltip_text(TTR("Shift: Draw line.") + "\n" + TTR("Shift+Ctrl: Draw rectangle.")); paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(paint_tool_button); @@ -2072,7 +2072,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { line_tool_button->set_flat(true); line_tool_button->set_toggle_mode(true); line_tool_button->set_button_group(tool_buttons_group); - line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L)); + // TRANSLATORS: This refers to the line tool in the tilemap editor. + line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", TTR("Line", "Tool"), Key::L)); line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(line_tool_button); @@ -2080,7 +2081,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { rect_tool_button->set_flat(true); rect_tool_button->set_toggle_mode(true); rect_tool_button->set_button_group(tool_buttons_group); - rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R)); + rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", TTR("Rect"), Key::R)); rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(rect_tool_button); @@ -2088,7 +2089,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { bucket_tool_button->set_flat(true); bucket_tool_button->set_toggle_mode(true); bucket_tool_button->set_button_group(tool_buttons_group); - bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B)); + bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", TTR("Bucket"), Key::B)); bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTilesPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(bucket_tool_button); toolbar->add_child(tilemap_tiles_tools_buttons); @@ -2104,7 +2105,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P)); picker_button->set_tooltip_text(TTR("Alternatively hold Ctrl with other tools to pick tile.")); picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(picker_button); @@ -2113,7 +2114,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { erase_button = memnew(Button); erase_button->set_flat(true); erase_button->set_toggle_mode(true); - erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E)); + erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", TTR("Eraser"), Key::E)); erase_button->set_tooltip_text(TTR("Alternatively use RMB to erase tiles.")); erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(erase_button); @@ -2141,7 +2142,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { scatter_controls_container = memnew(HBoxContainer); scatter_label = memnew(Label); - scatter_label->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile.")); + scatter_label->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile.")); scatter_label->set_text(TTR("Scattering:")); scatter_controls_container->add_child(scatter_label); @@ -2149,7 +2150,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { scatter_spinbox->set_min(0.0); scatter_spinbox->set_max(1000); scatter_spinbox->set_step(0.001); - scatter_spinbox->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile.")); + scatter_spinbox->set_tooltip_text(TTR("Modifies the chance of painting nothing instead of a randomly selected tile.")); scatter_spinbox->get_line_edit()->add_theme_constant_override("minimum_character_width", 4); scatter_spinbox->connect("value_changed", callable_mp(this, &TileMapEditorTilesPlugin::_on_scattering_spinbox_changed)); scatter_controls_container->add_child(scatter_spinbox); @@ -3180,7 +3181,7 @@ void TileMapEditorTerrainsPlugin::_update_terrains_tree() { terrain_set_tree_item->set_icon(0, main_vbox_container->get_theme_icon(SNAME("TerrainMatchSides"), SNAME("EditorIcons"))); matches = String(TTR("Matches Sides Only")); } - terrain_set_tree_item->set_text(0, vformat("Terrain Set %d (%s)", terrain_set_index, matches)); + terrain_set_tree_item->set_text(0, vformat(TTR("Terrain Set %d (%s)"), terrain_set_index, matches)); terrain_set_tree_item->set_selectable(0, false); for (int terrain_index = 0; terrain_index < tile_set->get_terrains_count(terrain_set_index); terrain_index++) { @@ -3329,7 +3330,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { main_vbox_container = memnew(VBoxContainer); main_vbox_container->connect("tree_entered", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); main_vbox_container->connect("theme_changed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_theme)); - main_vbox_container->set_name("Terrains"); + main_vbox_container->set_name(TTR("Terrains")); HSplitContainer *tilemap_tab_terrains = memnew(HSplitContainer); tilemap_tab_terrains->set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -3365,7 +3366,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { paint_tool_button->set_toggle_mode(true); paint_tool_button->set_button_group(tool_buttons_group); paint_tool_button->set_pressed(true); - paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", "Paint", Key::D)); + paint_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/paint_tool", TTR("Paint"), Key::D)); paint_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(paint_tool_button); @@ -3373,7 +3374,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { line_tool_button->set_flat(true); line_tool_button->set_toggle_mode(true); line_tool_button->set_button_group(tool_buttons_group); - line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", "Line", Key::L)); + line_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/line_tool", TTR("Line"), Key::L)); line_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(line_tool_button); @@ -3381,7 +3382,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { rect_tool_button->set_flat(true); rect_tool_button->set_toggle_mode(true); rect_tool_button->set_button_group(tool_buttons_group); - rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", "Rect", Key::R)); + rect_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/rect_tool", TTR("Rect"), Key::R)); rect_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(rect_tool_button); @@ -3389,7 +3390,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { bucket_tool_button->set_flat(true); bucket_tool_button->set_toggle_mode(true); bucket_tool_button->set_button_group(tool_buttons_group); - bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", "Bucket", Key::B)); + bucket_tool_button->set_shortcut(ED_SHORTCUT("tiles_editor/bucket_tool", TTR("Bucket"), Key::B)); bucket_tool_button->connect("pressed", callable_mp(this, &TileMapEditorTerrainsPlugin::_update_toolbar)); tilemap_tiles_tools_buttons->add_child(bucket_tool_button); @@ -3406,7 +3407,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); - picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", "Picker", Key::P)); + picker_button->set_shortcut(ED_SHORTCUT("tiles_editor/picker", TTR("Picker"), Key::P)); picker_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(picker_button); @@ -3414,7 +3415,7 @@ TileMapEditorTerrainsPlugin::TileMapEditorTerrainsPlugin() { erase_button = memnew(Button); erase_button->set_flat(true); erase_button->set_toggle_mode(true); - erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", "Eraser", Key::E)); + erase_button->set_shortcut(ED_SHORTCUT("tiles_editor/eraser", TTR("Eraser"), Key::E)); erase_button->connect("pressed", callable_mp(CanvasItemEditor::get_singleton(), &CanvasItemEditor::update_viewport)); tools_settings->add_child(erase_button); diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 912fdb03a9..fcefbb7d06 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -34,6 +34,7 @@ #include "editor/editor_inspector.h" #include "editor/editor_node.h" +#include "editor/editor_property_name_processor.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/editor_undo_redo_manager.h" @@ -106,13 +107,13 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::NIL, TTR("Atlas"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); - p_list->push_back(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1")); - p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "suffix:px")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "separation", PROPERTY_HINT_NONE)); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "texture_region_size", PROPERTY_HINT_NONE, "suffix:px")); - p_list->push_back(PropertyInfo(Variant::BOOL, "use_texture_padding", PROPERTY_HINT_NONE, "")); + p_list->push_back(PropertyInfo(Variant::INT, PNAME("id"), PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1")); + p_list->push_back(PropertyInfo(Variant::STRING, PNAME("name"))); + p_list->push_back(PropertyInfo(Variant::OBJECT, PNAME("texture"), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("margins"), PROPERTY_HINT_NONE, "suffix:px")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("separation"))); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("texture_region_size"), PROPERTY_HINT_NONE, "suffix:px")); + p_list->push_back(PropertyInfo(Variant::BOOL, PNAME("use_texture_padding"))); } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() { @@ -120,10 +121,9 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() { } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id) { - ERR_FAIL_COND(!p_tile_set.is_valid()); ERR_FAIL_COND(!p_tile_set_atlas_source); ERR_FAIL_COND(p_source_id < 0); - ERR_FAIL_COND(p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source); + ERR_FAIL_COND(p_tile_set.is_valid() && p_tile_set->get_source(p_source_id) != p_tile_set_atlas_source); if (p_tile_set == tile_set && p_tile_set_atlas_source == tile_set_atlas_source && p_source_id == source_id) { return; @@ -393,11 +393,11 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro if (tiles.size() == 1) { if (tiles.front()->get().alternative == 0) { p_list->push_back(PropertyInfo(Variant::NIL, TTR("Base Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("atlas_coords"))); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("size_in_atlas"))); } else { p_list->push_back(PropertyInfo(Variant::NIL, TTR("Alternative Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); - p_list->push_back(PropertyInfo(Variant::INT, "alternative_id")); + p_list->push_back(PropertyInfo(Variant::INT, PNAME("alternative_id"))); } } else { p_list->push_back(PropertyInfo(Variant::NIL, TTR("Tiles"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); @@ -414,17 +414,17 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro } if (all_alternatve_id_zero) { - p_list->push_back(PropertyInfo(Variant::NIL, "Animation", PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP)); - p_list->push_back(PropertyInfo(Variant::INT, "animation_columns", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "animation_separation", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_speed", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::INT, "animation_frames_count", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_")); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Animation", "animation_"), PROPERTY_HINT_NONE, "animation_", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::INT, PNAME("animation_columns"))); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, PNAME("animation_separation"))); + p_list->push_back(PropertyInfo(Variant::FLOAT, PNAME("animation_speed"))); + p_list->push_back(PropertyInfo(Variant::INT, PNAME("animation_frames_count"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, "Frames,animation_frame_")); // Not optimal, but returns value for the first tile. This is similar to what MultiNodeEdit does. if (tile_set_atlas_source->get_tile_animation_frames_count(tiles.front()->get().tile) == 1) { p_list->push_back(PropertyInfo(Variant::FLOAT, "animation_frame_0/duration", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY)); } else { for (int i = 0; i < tile_set_atlas_source->get_tile_animation_frames_count(tiles.front()->get().tile); i++) { - p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("animation_frame_%d/duration", i), PROPERTY_HINT_NONE, "suffix:s")); + p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("animation_frame_%d/%s", i, PNAME("duration")), PROPERTY_HINT_NONE, "suffix:s")); } } } @@ -611,6 +611,10 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { tile_data_editors_tree->clear(); + if (tile_set.is_null()) { + return; + } + TreeItem *root = tile_data_editors_tree->create_item(); TreeItem *group; @@ -638,9 +642,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { // List of editors. // --- Rendering --- - ADD_TILE_DATA_EDITOR_GROUP("Rendering"); + ADD_TILE_DATA_EDITOR_GROUP(TTR("Rendering")); - ADD_TILE_DATA_EDITOR(group, "Texture Origin", "texture_origin"); + ADD_TILE_DATA_EDITOR(group, TTR("Texture Origin"), "texture_origin"); if (!tile_data_editors.has("texture_origin")) { TileDataTextureOriginEditor *tile_data_texture_origin_editor = memnew(TileDataTextureOriginEditor); tile_data_texture_origin_editor->hide(); @@ -650,7 +654,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { tile_data_editors["texture_origin"] = tile_data_texture_origin_editor; } - ADD_TILE_DATA_EDITOR(group, "Modulate", "modulate"); + ADD_TILE_DATA_EDITOR(group, TTR("Modulate"), "modulate"); if (!tile_data_editors.has("modulate")) { TileDataDefaultEditor *tile_data_modulate_editor = memnew(TileDataDefaultEditor()); tile_data_modulate_editor->hide(); @@ -660,7 +664,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { tile_data_editors["modulate"] = tile_data_modulate_editor; } - ADD_TILE_DATA_EDITOR(group, "Z Index", "z_index"); + ADD_TILE_DATA_EDITOR(group, TTR("Z Index"), "z_index"); if (!tile_data_editors.has("z_index")) { TileDataDefaultEditor *tile_data_z_index_editor = memnew(TileDataDefaultEditor()); tile_data_z_index_editor->hide(); @@ -670,7 +674,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { tile_data_editors["z_index"] = tile_data_z_index_editor; } - ADD_TILE_DATA_EDITOR(group, "Y Sort Origin", "y_sort_origin"); + ADD_TILE_DATA_EDITOR(group, TTR("Y Sort Origin"), "y_sort_origin"); if (!tile_data_editors.has("y_sort_origin")) { TileDataYSortEditor *tile_data_y_sort_editor = memnew(TileDataYSortEditor); tile_data_y_sort_editor->hide(); @@ -681,7 +685,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } for (int i = 0; i < tile_set->get_occlusion_layers_count(); i++) { - ADD_TILE_DATA_EDITOR(group, vformat("Occlusion Layer %d", i), vformat("occlusion_layer_%d", i)); + ADD_TILE_DATA_EDITOR(group, vformat(TTR("Occlusion Layer %d"), i), vformat("occlusion_layer_%d", i)); if (!tile_data_editors.has(vformat("occlusion_layer_%d", i))) { TileDataOcclusionShapeEditor *tile_data_occlusion_shape_editor = memnew(TileDataOcclusionShapeEditor()); tile_data_occlusion_shape_editor->hide(); @@ -697,7 +701,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // --- Rendering --- - ADD_TILE_DATA_EDITOR(root, "Terrains", "terrain_set"); + ADD_TILE_DATA_EDITOR(root, TTR("Terrains"), "terrain_set"); if (!tile_data_editors.has("terrain_set")) { TileDataTerrainsEditor *tile_data_terrains_editor = memnew(TileDataTerrainsEditor); tile_data_terrains_editor->hide(); @@ -707,7 +711,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // --- Miscellaneous --- - ADD_TILE_DATA_EDITOR(root, "Probability", "probability"); + ADD_TILE_DATA_EDITOR(root, TTR("Probability"), "probability"); if (!tile_data_editors.has("probability")) { TileDataDefaultEditor *tile_data_probability_editor = memnew(TileDataDefaultEditor()); tile_data_probability_editor->hide(); @@ -718,9 +722,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // --- Physics --- - ADD_TILE_DATA_EDITOR_GROUP("Physics"); + ADD_TILE_DATA_EDITOR_GROUP(TTR("Physics")); for (int i = 0; i < tile_set->get_physics_layers_count(); i++) { - ADD_TILE_DATA_EDITOR(group, vformat("Physics Layer %d", i), vformat("physics_layer_%d", i)); + ADD_TILE_DATA_EDITOR(group, vformat(TTR("Physics Layer %d"), i), vformat("physics_layer_%d", i)); if (!tile_data_editors.has(vformat("physics_layer_%d", i))) { TileDataCollisionEditor *tile_data_collision_editor = memnew(TileDataCollisionEditor()); tile_data_collision_editor->hide(); @@ -736,9 +740,9 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // --- Navigation --- - ADD_TILE_DATA_EDITOR_GROUP("Navigation"); + ADD_TILE_DATA_EDITOR_GROUP(TTR("Navigation")); for (int i = 0; i < tile_set->get_navigation_layers_count(); i++) { - ADD_TILE_DATA_EDITOR(group, vformat("Navigation Layer %d", i), vformat("navigation_layer_%d", i)); + ADD_TILE_DATA_EDITOR(group, vformat(TTR("Navigation Layer %d"), i), vformat("navigation_layer_%d", i)); if (!tile_data_editors.has(vformat("navigation_layer_%d", i))) { TileDataNavigationEditor *tile_data_navigation_editor = memnew(TileDataNavigationEditor()); tile_data_navigation_editor->hide(); @@ -754,14 +758,14 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // --- Custom Data --- - ADD_TILE_DATA_EDITOR_GROUP("Custom Data"); + ADD_TILE_DATA_EDITOR_GROUP(TTR("Custom Data")); for (int i = 0; i < tile_set->get_custom_data_layers_count(); i++) { String editor_name = vformat("custom_data_%d", i); String prop_name = tile_set->get_custom_data_layer_name(i); Variant::Type prop_type = tile_set->get_custom_data_layer_type(i); if (prop_name.is_empty()) { - ADD_TILE_DATA_EDITOR(group, vformat("Custom Data %d", i), editor_name); + ADD_TILE_DATA_EDITOR(group, vformat(TTR("Custom Data %d"), i), editor_name); } else { ADD_TILE_DATA_EDITOR(group, prop_name, editor_name); } @@ -919,6 +923,10 @@ void TileSetAtlasSourceEditor::_update_atlas_view() { alternative_tiles_control->get_child(i)->queue_free(); } + if (tile_set.is_null()) { + return; + } + Vector2i pos; Vector2 texture_region_base_size = tile_set_atlas_source->get_texture_region_size(); int texture_region_base_size_min = MIN(texture_region_base_size.x, texture_region_base_size.y); @@ -2407,6 +2415,14 @@ void TileSetAtlasSourceEditor::_notification(int p_what) { } } } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) { + EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style(); + atlas_source_inspector->set_property_name_style(style); + tile_inspector->set_property_name_style(style); + } + } break; } } @@ -2476,6 +2492,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_inspector->edit(tile_proxy_object); tile_inspector->set_use_folding(true); tile_inspector->connect("property_selected", callable_mp(this, &TileSetAtlasSourceEditor::_inspector_property_selected)); + tile_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); middle_vbox_container->add_child(tile_inspector); tile_inspector_no_tile_selected_label = memnew(Label); @@ -2527,6 +2544,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { atlas_source_inspector->set_v_size_flags(SIZE_EXPAND_FILL); atlas_source_inspector->set_show_categories(true); atlas_source_inspector->edit(atlas_source_proxy_object); + atlas_source_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); middle_vbox_container->add_child(atlas_source_inspector); // -- Right side -- diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index 39d17c718e..358cc47977 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -687,7 +687,7 @@ void TileSetEditor::_undo_redo_inspector_callback(Object *p_undo_redo, Object *p void TileSetEditor::edit(Ref<TileSet> p_tile_set) { bool new_read_only_state = false; - if (tile_set.is_valid()) { + if (p_tile_set.is_valid()) { new_read_only_state = EditorNode::get_singleton()->is_resource_read_only(p_tile_set); } diff --git a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp index cc276597fa..101ec5f66c 100644 --- a/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_scenes_collection_source_editor.cpp @@ -32,6 +32,7 @@ #include "editor/editor_file_system.h" #include "editor/editor_node.h" +#include "editor/editor_property_name_processor.h" #include "editor/editor_resource_preview.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -362,6 +363,14 @@ void TileSetScenesCollectionSourceEditor::_notification(int p_what) { _update_scenes_list(); _update_action_buttons(); } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) { + EditorPropertyNameProcessor::Style style = EditorPropertyNameProcessor::get_singleton()->get_settings_style(); + scenes_collection_source_inspector->set_property_name_style(style); + tile_inspector->set_property_name_style(style); + } + } break; } } @@ -503,6 +512,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { scenes_collection_source_inspector = memnew(EditorInspector); scenes_collection_source_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); scenes_collection_source_inspector->edit(scenes_collection_source_proxy_object); + scenes_collection_source_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); middle_vbox_container->add_child(scenes_collection_source_inspector); // Tile inspector. @@ -519,6 +529,7 @@ TileSetScenesCollectionSourceEditor::TileSetScenesCollectionSourceEditor() { tile_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); tile_inspector->edit(tile_proxy_object); tile_inspector->set_use_folding(true); + tile_inspector->set_property_name_style(EditorPropertyNameProcessor::get_singleton()->get_settings_style()); middle_vbox_container->add_child(tile_inspector); // Scenes list. diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp index fad36660d9..78522dfa73 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.cpp +++ b/editor/plugins/tiles/tiles_editor_plugin.cpp @@ -117,7 +117,7 @@ void TilesEditorPlugin::_thread() { tile_map->set_position(-(scale * encompassing_rect.get_center()) + thumbnail_size2 / 2); // Add the viewport at the last moment to avoid rendering too early. - EditorNode::get_singleton()->add_child(viewport); + EditorNode::get_singleton()->call_deferred("add_child", viewport); RS::get_singleton()->connect(SNAME("frame_pre_draw"), callable_mp(const_cast<TilesEditorPlugin *>(this), &TilesEditorPlugin::_preview_frame_started), Object::CONNECT_ONE_SHOT); diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index 706466a974..d1f3c3902a 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -32,1781 +32,19 @@ #ifndef DISABLE_DEPRECATED -const int ERROR_CODE = 77; - #include "modules/modules_enabled.gen.h" // For regex. #ifdef MODULE_REGEX_ENABLED -#include "modules/regex/regex.h" - +#include "core/error/error_macros.h" #include "core/io/dir_access.h" +#include "core/io/file_access.h" +#include "core/object/ref_counted.h" #include "core/os/time.h" #include "core/templates/hash_map.h" #include "core/templates/list.h" -#include "core/templates/local_vector.h" - -const char *ProjectConverter3To4::enum_renames[][2] = { - //// constants - { "TYPE_COLOR_ARRAY", "TYPE_PACKED_COLOR_ARRAY" }, - { "TYPE_FLOAT64_ARRAY", "TYPE_PACKED_FLOAT64_ARRAY" }, - { "TYPE_INT64_ARRAY", "TYPE_PACKED_INT64_ARRAY" }, - { "TYPE_INT_ARRAY", "TYPE_PACKED_INT32_ARRAY" }, - { "TYPE_QUAT", "TYPE_QUATERNION" }, - { "TYPE_RAW_ARRAY", "TYPE_PACKED_BYTE_ARRAY" }, - { "TYPE_REAL", "TYPE_FLOAT" }, - { "TYPE_REAL_ARRAY", "TYPE_PACKED_FLOAT32_ARRAY" }, - { "TYPE_STRING_ARRAY", "TYPE_PACKED_STRING_ARRAY" }, - { "TYPE_TRANSFORM", "TYPE_TRANSFORM3D" }, - { "TYPE_VECTOR2_ARRAY", "TYPE_PACKED_VECTOR2_ARRAY" }, - { "TYPE_VECTOR3_ARRAY", "TYPE_PACKED_VECTOR3_ARRAY" }, - - // {"FLAG_MAX", "PARTICLE_FLAG_MAX"}, // CPUParticles2D - used in more classes - { "ALIGN_BEGIN", "ALIGNMENT_BEGIN" }, //AspectRatioContainer - { "ALIGN_CENTER", "ALIGNMENT_CENTER" }, //AspectRatioContainer - { "ALIGN_END", "ALIGNMENT_END" }, //AspectRatioContainer - { "ARRAY_COMPRESS_BASE", "ARRAY_COMPRESS_FLAGS_BASE" }, // Mesh - { "ARVR_AR", "XR_AR" }, // XRInterface - { "ARVR_EXCESSIVE_MOTION", "XR_EXCESSIVE_MOTION" }, // XRInterface - { "ARVR_EXTERNAL", "XR_EXTERNAL" }, // XRInterface - { "ARVR_INSUFFICIENT_FEATURES", "XR_INSUFFICIENT_FEATURES" }, // XRInterface - { "ARVR_MONO", "XR_MONO" }, // XRInterface - { "ARVR_NONE", "XR_NONE" }, // XRInterface - { "ARVR_NORMAL_TRACKING", "XR_NORMAL_TRACKING" }, // XRInterface - { "ARVR_NOT_TRACKING", "XR_NOT_TRACKING" }, // XRInterface - { "ARVR_STEREO", "XR_STEREO" }, // XRInterface - { "ARVR_UNKNOWN_TRACKING", "XR_UNKNOWN_TRACKING" }, // XRInterface - { "BAKE_ERROR_INVALID_MESH", "BAKE_ERROR_MESHES_INVALID" }, // LightmapGI - { "BODY_MODE_CHARACTER", "BODY_MODE_RIGID_LINEAR" }, // PhysicsServer - { "BUTTON_LEFT", "MOUSE_BUTTON_LEFT" }, // Globals - { "BUTTON_MASK_LEFT", "MOUSE_BUTTON_MASK_LEFT" }, // Globals - { "BUTTON_MASK_MIDDLE", "MOUSE_BUTTON_MASK_MIDDLE" }, // Globals - { "BUTTON_MASK_RIGHT", "MOUSE_BUTTON_MASK_RIGHT" }, // Globals - { "BUTTON_MASK_XBUTTON1", "MOUSE_BUTTON_MASK_XBUTTON1" }, // Globals - { "BUTTON_MASK_XBUTTON2", "MOUSE_BUTTON_MASK_XBUTTON2" }, // Globals - { "BUTTON_MIDDLE", "MOUSE_BUTTON_MIDDLE" }, // Globals - { "BUTTON_RIGHT", "MOUSE_BUTTON_RIGHT" }, // Globals - { "BUTTON_WHEEL_DOWN", "MOUSE_BUTTON_WHEEL_DOWN" }, // Globals - { "BUTTON_WHEEL_LEFT", "MOUSE_BUTTON_WHEEL_LEFT" }, // Globals - { "BUTTON_WHEEL_RIGHT", "MOUSE_BUTTON_WHEEL_RIGHT" }, // Globals - { "BUTTON_WHEEL_UP", "MOUSE_BUTTON_WHEEL_UP" }, // Globals - { "BUTTON_XBUTTON1", "MOUSE_BUTTON_XBUTTON1" }, // Globals - { "BUTTON_XBUTTON2", "MOUSE_BUTTON_XBUTTON2" }, // Globals - { "CLEAR_MODE_ONLY_NEXT_FRAME", "CLEAR_MODE_ONCE" }, // SubViewport - { "COMPRESS_PVRTC4", "COMPRESS_PVRTC1_4" }, // Image - { "CONNECT_ONESHOT", "CONNECT_ONE_SHOT" }, // Object - { "CONTAINER_PROPERTY_EDITOR_BOTTOM", "CONTAINER_INSPECTOR_BOTTOM" }, // EditorPlugin - { "CUBEMAP_BACK", "CUBEMAP_LAYER_BACK" }, // RenderingServer - { "CUBEMAP_BOTTOM", "CUBEMAP_LAYER_BOTTOM" }, // RenderingServer - { "CUBEMAP_FRONT", "CUBEMAP_LAYER_FRONT" }, // RenderingServer - { "CUBEMAP_LEFT", "CUBEMAP_LAYER_LEFT" }, // RenderingServer - { "CUBEMAP_RIGHT", "CUBEMAP_LAYER_RIGHT" }, // RenderingServer - { "CUBEMAP_TOP", "CUBEMAP_LAYER_TOP" }, // RenderingServer - { "DAMPED_STRING_DAMPING", "DAMPED_SPRING_DAMPING" }, // PhysicsServer2D - { "DAMPED_STRING_REST_LENGTH", "DAMPED_SPRING_REST_LENGTH" }, // PhysicsServer2D - { "DAMPED_STRING_STIFFNESS", "DAMPED_SPRING_STIFFNESS" }, // PhysicsServer2D - { "FLAG_ALIGN_Y_TO_VELOCITY", "PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY" }, // CPUParticles2D - { "FLAG_DISABLE_Z", "PARTICLE_FLAG_DISABLE_Z" }, // CPUParticles2D - { "FLAG_ROTATE_Y", "PARTICLE_FLAG_ROTATE_Y" }, // CPUParticles2D - { "FLAG_USE_BAKED_LIGHT", "GI_MODE_BAKED" }, // GeometryInstance3D - { "FORMAT_PVRTC2", "FORMAT_PVRTC1_2" }, // Image - { "FORMAT_PVRTC2A", "FORMAT_PVRTC1_2A" }, // Image - { "FORMAT_PVRTC4", "FORMAT_PVRTC1_4" }, // Image - { "FORMAT_PVRTC4A", "FORMAT_PVRTC1_4A" }, // Image - { "FUNC_FRAC", "FUNC_FRACT" }, // VisualShaderNodeVectorFunc - { "INSTANCE_LIGHTMAP_CAPTURE", "INSTANCE_LIGHTMAP" }, // RenderingServer - { "JOINT_6DOF", "JOINT_TYPE_6DOF" }, // PhysicsServer3D - { "JOINT_CONE_TWIST", "JOINT_TYPE_CONE_TWIST" }, // PhysicsServer3D - { "JOINT_DAMPED_SPRING", "JOINT_TYPE_DAMPED_SPRING" }, // PhysicsServer2D - { "JOINT_GROOVE", "JOINT_TYPE_GROOVE" }, // PhysicsServer2D - { "JOINT_HINGE", "JOINT_TYPE_HINGE" }, // PhysicsServer3D - { "JOINT_PIN", "JOINT_TYPE_PIN" }, // PhysicsServer2D - { "JOINT_SLIDER", "JOINT_TYPE_SLIDER" }, // PhysicsServer3D - { "KEY_CONTROL", "KEY_CTRL" }, // Globals - { "LOOP_PING_PONG", "LOOP_PINGPONG" }, // AudioStreamWAV - { "MODE_KINEMATIC", "FREEZE_MODE_KINEMATIC" }, // RigidBody - { "MODE_OPEN_ANY", "FILE_MODE_OPEN_ANY" }, // FileDialog - { "MODE_OPEN_DIR", "FILE_MODE_OPEN_DIR" }, // FileDialog - { "MODE_OPEN_FILE", "FILE_MODE_OPEN_FILE" }, // FileDialog - { "MODE_OPEN_FILES", "FILE_MODE_OPEN_FILES" }, // FileDialog - { "MODE_SAVE_FILE", "FILE_MODE_SAVE_FILE" }, // FileDialog - { "MODE_STATIC", "FREEZE_MODE_STATIC" }, // RigidBody - { "NOTIFICATION_APP_PAUSED", "NOTIFICATION_APPLICATION_PAUSED" }, // MainLoop - { "NOTIFICATION_APP_RESUMED", "NOTIFICATION_APPLICATION_RESUMED" }, // MainLoop - { "NOTIFICATION_INSTANCED", "NOTIFICATION_SCENE_INSTANTIATED" }, // Node - { "NOTIFICATION_PATH_CHANGED", "NOTIFICATION_PATH_RENAMED" }, //Node - { "NOTIFICATION_WM_FOCUS_IN", "NOTIFICATION_APPLICATION_FOCUS_IN" }, // MainLoop - { "NOTIFICATION_WM_FOCUS_OUT", "NOTIFICATION_APPLICATION_FOCUS_OUT" }, // MainLoop - { "NOTIFICATION_WM_UNFOCUS_REQUEST", "NOTIFICATION_WM_WINDOW_FOCUS_OUT" }, //Node - { "PAUSE_MODE_INHERIT", "PROCESS_MODE_INHERIT" }, // Node - { "PAUSE_MODE_PROCESS", "PROCESS_MODE_ALWAYS" }, // Node - { "PAUSE_MODE_STOP", "PROCESS_MODE_PAUSABLE" }, // Node - { "RENDER_DRAW_CALLS_IN_FRAME", "RENDER_TOTAL_DRAW_CALLS_IN_FRAME" }, // Performance - { "RENDER_OBJECTS_IN_FRAME", "RENDER_TOTAL_OBJECTS_IN_FRAME" }, // Performance - { "SIDE_BOTTOM", "MARGIN_BOTTOM" }, // Globals - { "SIDE_LEFT", "MARGIN_LEFT" }, // Globals - { "SIDE_RIGHT", "MARGIN_RIGHT" }, // Globals - { "SIDE_TOP", "MARGIN_TOP" }, // Globals - { "TEXTURE_TYPE_2D_ARRAY", "TEXTURE_LAYERED_2D_ARRAY" }, // RenderingServer - { "TEXTURE_TYPE_CUBEMAP", "TEXTURE_LAYERED_CUBEMAP_ARRAY" }, // RenderingServer - { "TRACKER_LEFT_HAND", "TRACKER_HAND_LEFT" }, // XRPositionalTracker - { "TRACKER_RIGHT_HAND", "TRACKER_HAND_RIGHT" }, // XRPositionalTracker - { "TYPE_NORMALMAP", "TYPE_NORMAL_MAP" }, // VisualShaderNodeCubemap - - /// enums - { "AlignMode", "AlignmentMode" }, //AspectRatioContainer - { "AnimationProcessMode", "AnimationProcessCallback" }, // AnimationTree, AnimationPlayer - { "Camera2DProcessMode", "Camera2DProcessCallback" }, // Camera2D - { "CubeMapSide", "CubeMapLayer" }, // RenderingServer - { "DampedStringParam", "DampedSpringParam" }, // PhysicsServer2D - { "FFT_Size", "FFTSize" }, // AudioEffectPitchShift,AudioEffectSpectrumAnalyzer - { "PauseMode", "ProcessMode" }, // Node - { "TimerProcessMode", "TimerProcessCallback" }, // Timer - { "Tracking_status", "TrackingStatus" }, // XRInterface - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::gdscript_function_renames[][2] = { - // { "_set_name", "get_tracker_name"}, // XRPositionalTracker - CameraFeed use this - // { "_unhandled_input", "_unhandled_key_input"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer - // { "create_gizmo", "_create_gizmo"}, // EditorNode3DGizmoPlugin - may be used - // { "get_dependencies", "_get_dependencies" }, // ResourceFormatLoader broke ResourceLoader - // { "get_extents", "get_size" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume - // { "get_h_offset", "get_drag_horizontal_offset"}, // Camera2D, broke PathFollow, Camera - // { "get_mode", "get_file_mode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap - // { "get_motion", "get_travel"}, // PhysicsTestMotionResult2D broke ParalaxLayer - // { "get_name", "get_tracker_name"}, // XRPositionalTracker broke OS, Node - // { "get_network_connected_peers", "get_peers"}, // MultiplayerAPI broke SceneTree - // { "get_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree - // { "get_network_unique_id", "get_unique_id"}, // MultiplayerAPI broke SceneTree - // { "get_offset", "get_position_offset" }, // GraphNode broke Gradient - // { "get_peer_port", "get_peer" }, // ENetMultiplayerPeer broke WebSocketServer - // { "get_process_mode", "get_process_callback" }, // ClippedCamera3D broke Node, Sky - // { "get_render_info", "get_rendering_info" }, // RenderingServer broke Viewport - // { "get_type", "get_tracker_type"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight - // { "get_v_offset", "get_drag_vertical_offset"}, // Camera2D, broke PathFollow, Camera - // { "has_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree - // { "instance", "instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule - // { "is_listening", "is_bound"}, // PacketPeerUDP broke TCPServer, UDPServer - // { "is_refusing_new_network_connections", "is_refusing_new_connections"}, // MultiplayerAPI broke SceneTree - // { "is_valid", "has_valid_event" }, // Shortcut broke e.g. Callable - // { "listen", "bound"}, // PacketPeerUDP broke TCPServer, UDPServer - // { "load", "_load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D - // { "make_current", "set_current" }, // Camera2D broke Camera3D, Listener2D - // { "process", "_process" }, // AnimationNode - This word is commonly used - // { "save", "_save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D - // { "set_autowrap", "set_autowrap_mode" }, // AcceptDialog broke Label - Cyclic Rename - // { "set_color", "surface_set_color"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool - // { "set_event", "set_shortcut" }, // BaseButton - Cyclic Rename - // { "set_extents", "set_size"}, // BoxShape, RectangleShape broke ReflectionProbe - // { "set_flag", "set_particle_flag"}, // ParticleProcessMaterial broke Window, HingeJoint3D - // { "set_h_offset", "set_drag_horizontal_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D - // { "set_margin", "set_offset" }, // Control broke Shape3D, AtlasTexture - // { "set_mode", "set_mode_file_mode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap - // { "set_normal", "surface_set_normal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D - // { "set_offset", "set_progress" }, // PathFollow2D, PathFollow3D - Too common - // { "set_process_mode", "set_process_callback" }, // AnimationTree broke Node, Tween, Sky - // { "set_refuse_new_network_connections", "set_refuse_new_connections"}, // MultiplayerAPI broke SceneTree - // { "set_tooltip", "set_tooltip_text" }, // Control, breaks TreeItem, at least for now. - // { "set_uv", "surface_set_uv" }, // ImmediateMesh broke Polygon2D - // { "set_v_offset", "set_drag_vertical_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D - // {"get_points","get_points_id"},// Astar, broke Line2D, Convexpolygonshape - // {"get_v_scroll","get_v_scroll_bar"},//ItemList, broke TextView - // { "get_stylebox", "get_theme_stylebox" }, // Control - Will rename the method in Theme as well, skipping - { "_about_to_show", "_about_to_popup" }, // ColorPickerButton - { "_get_configuration_warning", "_get_configuration_warnings" }, // Node - { "_set_current", "set_current" }, // Camera2D - { "_set_editor_description", "set_editor_description" }, // Node - { "_toplevel_raise_self", "_top_level_raise_self" }, // CanvasItem - { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit - { "add_animation", "add_animation_library" }, // AnimationPlayer - { "add_cancel", "add_cancel_button" }, // AcceptDialog - { "add_central_force", "apply_central_force" }, //RigidBody2D - { "add_child_below_node", "add_sibling" }, // Node - { "add_color_override", "add_theme_color_override" }, // Control - { "add_constant_override", "add_theme_constant_override" }, // Control - { "add_font_override", "add_theme_font_override" }, // Control - { "add_force", "apply_force" }, //RigidBody2D - { "add_icon_override", "add_theme_icon_override" }, // Control - { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin - { "add_spatial_gizmo_plugin", "add_node_3d_gizmo_plugin" }, // EditorPlugin - { "add_stylebox_override", "add_theme_stylebox_override" }, // Control - { "add_torque", "apply_torque" }, //RigidBody2D - { "agent_set_neighbor_dist", "agent_set_neighbor_distance" }, // NavigationServer2D, NavigationServer3D - { "apply_changes", "_apply_changes" }, // EditorPlugin - { "body_add_force", "body_apply_force" }, // PhysicsServer2D - { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D - { "bumpmap_to_normalmap", "bump_map_to_normal_map" }, // Image - { "can_be_hidden", "_can_be_hidden" }, // EditorNode3DGizmoPlugin - { "can_drop_data", "_can_drop_data" }, // Control - { "can_generate_small_preview", "_can_generate_small_preview" }, // EditorResourcePreviewGenerator - { "can_instance", "can_instantiate" }, // PackedScene, Script - { "canvas_light_set_scale", "canvas_light_set_texture_scale" }, // RenderingServer - { "capture_get_device", "get_input_device" }, // AudioServer - { "capture_get_device_list", "get_input_device_list" }, // AudioServer - { "capture_set_device", "set_input_device" }, // AudioServer - { "center_viewport_to_cursor", "center_viewport_to_caret" }, // TextEdit - { "change_scene", "change_scene_to_file" }, // SceneTree - { "change_scene_to", "change_scene_to_packed" }, // SceneTree - { "clip_polygons_2d", "clip_polygons" }, // Geometry2D - { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D - { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo - { "convex_hull_2d", "convex_hull" }, // Geometry2D - { "create_gizmo", "_create_gizmo" }, // EditorNode3DGizmoPlugin - { "cursor_get_blink_speed", "get_caret_blink_interval" }, // TextEdit - { "cursor_get_column", "get_caret_column" }, // TextEdit - { "cursor_get_line", "get_caret_line" }, // TextEdit - { "cursor_set_blink_enabled", "set_caret_blink_enabled" }, // TextEdit - { "cursor_set_blink_speed", "set_caret_blink_interval" }, // TextEdit - { "cursor_set_column", "set_caret_column" }, // TextEdit - { "cursor_set_line", "set_caret_line" }, // TextEdit - { "damped_spring_joint_create", "joint_make_damped_spring" }, // PhysicsServer2D - { "damped_string_joint_get_param", "damped_spring_joint_get_param" }, // PhysicsServer2D - { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D - { "dectime", "move_toward" }, // GDScript, Math functions - { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit - { "deselect_items", "deselect_all" }, // FileDialog - { "disable_plugin", "_disable_plugin" }, // EditorPlugin - { "drop_data", "_drop_data" }, // Control - { "exclude_polygons_2d", "exclude_polygons" }, // Geometry2D - { "find_node", "find_child" }, // Node - { "find_scancode_from_string", "find_keycode_from_string" }, // OS - { "forward_canvas_draw_over_viewport", "_forward_canvas_draw_over_viewport" }, // EditorPlugin - { "forward_canvas_force_draw_over_viewport", "_forward_canvas_force_draw_over_viewport" }, // EditorPlugin - { "forward_canvas_gui_input", "_forward_canvas_gui_input" }, // EditorPlugin - { "forward_spatial_draw_over_viewport", "_forward_3d_draw_over_viewport" }, // EditorPlugin - { "forward_spatial_force_draw_over_viewport", "_forward_3d_force_draw_over_viewport" }, // EditorPlugin - { "forward_spatial_gui_input", "_forward_3d_gui_input" }, // EditorPlugin - { "generate_from_path", "_generate_from_path" }, // EditorResourcePreviewGenerator - { "generate_small_preview_automatically", "_generate_small_preview_automatically" }, // EditorResourcePreviewGenerator - { "get_action_list", "action_get_events" }, // InputMap - { "get_alt", "is_alt_pressed" }, // InputEventWithModifiers - { "get_animation_process_mode", "get_process_callback" }, // AnimationPlayer - { "get_applied_force", "get_constant_force" }, //RigidBody2D - { "get_applied_torque", "get_constant_torque" }, //RigidBody2D - { "get_audio_bus", "get_audio_bus_name" }, // Area3D - { "get_bound_child_nodes_to_bone", "get_bone_children" }, // Skeleton3D - { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertible to get_camera_2d, broke GLTFNode - { "get_cancel", "get_cancel_button" }, // ConfirmationDialog - { "get_caption", "_get_caption" }, // AnimationNode - { "get_cast_to", "get_target_position" }, // RayCast2D, RayCast3D - { "get_child_by_name", "_get_child_by_name" }, // AnimationNode - { "get_child_nodes", "_get_child_nodes" }, // AnimationNode - { "get_closest_point_to_segment_2d", "get_closest_point_to_segment" }, // Geometry2D - { "get_closest_point_to_segment_uncapped_2d", "get_closest_point_to_segment_uncapped" }, // Geometry2D - { "get_closest_points_between_segments_2d", "get_closest_point_to_segment" }, // Geometry2D - { "get_collision_layer_bit", "get_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap - { "get_collision_mask_bit", "get_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap - { "get_color_types", "get_color_type_list" }, // Theme - { "get_command", "is_command_or_control_pressed" }, // InputEventWithModifiers - { "get_constant_types", "get_constant_type_list" }, // Theme - { "get_control", "is_ctrl_pressed" }, // InputEventWithModifiers - { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D - { "get_cursor_position", "get_caret_column" }, // LineEdit - { "get_d", "get_distance" }, // LineShape2D - { "get_depth_bias_enable", "get_depth_bias_enabled" }, // RDPipelineRasterizationState - { "get_device", "get_output_device" }, // AudioServer - { "get_device_list", "get_output_device_list" }, // AudioServer - { "get_drag_data", "_get_drag_data" }, // Control - { "get_editor_viewport", "get_editor_main_screen" }, // EditorPlugin - { "get_enabled_focus_mode", "get_focus_mode" }, // BaseButton - { "get_endian_swap", "is_big_endian" }, // File - { "get_error_string", "get_error_message" }, // JSON - { "get_filename", "get_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places - { "get_focus_neighbour", "get_focus_neighbor" }, // Control - { "get_follow_smoothing", "get_position_smoothing_speed" }, // Camera2D - { "get_font_types", "get_font_type_list" }, // Theme - { "get_frame_color", "get_color" }, // ColorRect - { "get_global_rate_scale", "get_playback_speed_scale" }, // AudioServer - { "get_gravity_distance_scale", "get_gravity_point_unit_distance" }, // Area(2D/3D) - { "get_gravity_vector", "get_gravity_direction" }, // Area(2D/3D) - { "get_h_scrollbar", "get_h_scroll_bar" }, //ScrollContainer - { "get_hand", "get_tracker_hand" }, // XRPositionalTracker - { "get_handle_name", "_get_handle_name" }, // EditorNode3DGizmo - { "get_handle_value", "_get_handle_value" }, // EditorNode3DGizmo - { "get_icon_align", "get_icon_alignment" }, // Button - { "get_icon_types", "get_icon_type_list" }, // Theme - { "get_idle_frames", "get_process_frames" }, // Engine - { "get_import_options", "_get_import_options" }, // EditorImportPlugin - { "get_import_order", "_get_import_order" }, // EditorImportPlugin - { "get_importer_name", "_get_importer_name" }, // EditorImportPlugin - { "get_interior_ambient", "get_ambient_color" }, // ReflectionProbe - { "get_interior_ambient_energy", "get_ambient_color_energy" }, // ReflectionProbe - { "get_iterations_per_second", "get_physics_ticks_per_second" }, // Engine - { "get_last_mouse_speed", "get_last_mouse_velocity" }, // Input - { "get_layer_mask_bit", "get_layer_mask_value" }, // VisualInstance3D - { "get_len", "get_length" }, // File - { "get_max_atlas_size", "get_max_texture_size" }, // LightmapGI - { "get_metakey", "is_meta_pressed" }, // InputEventWithModifiers - { "get_mid_height", "get_height" }, // CapsuleMesh - { "get_motion_remainder", "get_remainder" }, // PhysicsTestMotionResult2D - { "get_neighbor_dist", "get_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D - { "get_network_connected_peers", "get_peers" }, // Multiplayer API - { "get_network_master", "get_multiplayer_authority" }, // Node - { "get_network_peer", "get_multiplayer_peer" }, // Multiplayer API - { "get_network_unique_id", "get_unique_id" }, // Multiplayer API - { "get_ok", "get_ok_button" }, // AcceptDialog - { "get_oneshot", "get_one_shot" }, // AnimatedTexture - { "get_option_visibility", "_get_option_visibility" }, // EditorImportPlugin - { "get_parameter_default_value", "_get_parameter_default_value" }, // AnimationNode - { "get_parameter_list", "_get_parameter_list" }, // AnimationNode - { "get_parent_spatial", "get_parent_node_3d" }, // Node3D - { "get_pause_mode", "get_process_mode" }, // Node - { "get_physical_scancode", "get_physical_keycode" }, // InputEventKey - { "get_physical_scancode_with_modifiers", "get_physical_keycode_with_modifiers" }, // InputEventKey - { "get_plugin_icon", "_get_plugin_icon" }, // EditorPlugin - { "get_plugin_name", "_get_plugin_name" }, // EditorPlugin - { "get_preset_count", "_get_preset_count" }, // EditorImportPlugin - { "get_preset_name", "_get_preset_name" }, // EditorImportPlugin - { "get_recognized_extensions", "_get_recognized_extensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver - { "get_render_info", "get_rendering_info" }, // RenderingServer - { "get_render_targetsize", "get_render_target_size" }, // XRInterface - { "get_resource_type", "_get_resource_type" }, // ResourceFormatLoader - { "get_result", "get_data" }, //JSON - { "get_reverb_bus", "set_reverb_bus_name" }, // Area3D - { "get_rpc_sender_id", "get_remote_sender_id" }, // Multiplayer API - { "get_save_extension", "_get_save_extension" }, // EditorImportPlugin - { "get_scancode", "get_keycode" }, // InputEventKey - { "get_scancode_string", "get_keycode_string" }, // OS - { "get_scancode_with_modifiers", "get_keycode_with_modifiers" }, // InputEventKey - { "get_selected_path", "get_current_directory" }, // EditorInterface - { "get_shift", "is_shift_pressed" }, // InputEventWithModifiers - { "get_size_override", "get_size_2d_override" }, // SubViewport - { "get_slide_count", "get_slide_collision_count" }, // CharacterBody2D, CharacterBody3D - { "get_slips_on_slope", "get_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D - { "get_space_override_mode", "get_gravity_space_override_mode" }, // Area2D - { "get_spatial_node", "get_node_3d" }, // EditorNode3DGizmo - { "get_speed", "get_velocity" }, // InputEventMouseMotion - { "get_stylebox_types", "get_stylebox_type_list" }, // Theme - { "get_surface_material", "get_surface_override_material" }, // MeshInstance3D broke ImporterMesh - { "get_surface_material_count", "get_surface_override_material_count" }, // MeshInstance3D - { "get_tab_disabled", "is_tab_disabled" }, // Tab - { "get_tab_hidden", "is_tab_hidden" }, // Tab - { "get_text_align", "get_text_alignment" }, // Button - { "get_theme_item_types", "get_theme_item_type_list" }, // Theme - { "get_timer_process_mode", "get_timer_process_callback" }, // Timer - { "get_translation", "get_position" }, // Node3D broke GLTFNode which is used rarely - { "get_unit_db", "get_volume_db" }, // AudioStreamPlayer3D - { "get_unit_offset", "get_progress_ratio" }, // PathFollow2D, PathFollow3D - { "get_use_in_baked_light", "is_baking_navigation" }, // GridMap - { "get_used_cells_by_id", "get_used_cells" }, // TileMap - { "get_v_scrollbar", "get_v_scroll_bar" }, //ScrollContainer - { "get_visible_name", "_get_visible_name" }, // EditorImportPlugin - { "get_window_layout", "_get_window_layout" }, // EditorPlugin - { "get_word_under_cursor", "get_word_under_caret" }, // TextEdit - { "get_world", "get_world_3d" }, // Viewport, Spatial - { "get_zfar", "get_far" }, // Camera3D broke GLTFCamera - { "get_znear", "get_near" }, // Camera3D broke GLTFCamera - { "groove_joint_create", "joint_make_groove" }, // PhysicsServer2D - { "handle_menu_selected", "_handle_menu_selected" }, // EditorResourcePicker - { "handles_type", "_handles_type" }, // ResourceFormatLoader - { "has_color", "has_theme_color" }, // Control broke Theme - { "has_color_override", "has_theme_color_override" }, // Control broke Theme - { "has_constant", "has_theme_constant" }, // Control - { "has_constant_override", "has_theme_constant_override" }, // Control - { "has_filter", "_has_filter" }, // AnimationNode - { "has_font", "has_theme_font" }, // Control broke Theme - { "has_font_override", "has_theme_font_override" }, // Control - { "has_icon", "has_theme_icon" }, // Control broke Theme - { "has_icon_override", "has_theme_icon_override" }, // Control - { "has_main_screen", "_has_main_screen" }, // EditorPlugin - { "has_network_peer", "has_multiplayer_peer" }, // Multiplayer API - { "has_stylebox", "has_theme_stylebox" }, // Control broke Theme - { "has_stylebox_override", "has_theme_stylebox_override" }, // Control - { "http_escape", "uri_encode" }, // String - { "http_unescape", "uri_decode" }, // String - { "import_scene_from_other_importer", "_import_scene" }, //EditorSceneFormatImporter - { "instance_set_surface_material", "instance_set_surface_override_material" }, // RenderingServer - { "interpolate", "sample" }, // Curve, Curve2D, Curve3D, Gradient - { "intersect_polygons_2d", "intersect_polygons" }, // Geometry2D - { "intersect_polyline_with_polygon_2d", "intersect_polyline_with_polygon" }, // Geometry2D - { "is_a_parent_of", "is_ancestor_of" }, // Node - { "is_commiting_action", "is_committing_action" }, // UndoRedo - { "is_doubleclick", "is_double_click" }, // InputEventMouseButton - { "is_draw_red", "is_draw_warning" }, // EditorProperty - { "is_follow_smoothing_enabled", "is_position_smoothing_enabled" }, // Camera2D - { "is_h_drag_enabled", "is_drag_horizontal_enabled" }, // Camera2D - { "is_handle_highlighted", "_is_handle_highlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin - { "is_inverting_faces", "get_flip_faces" }, // CSGPrimitive3D - { "is_network_master", "is_multiplayer_authority" }, // Node - { "is_network_server", "is_server" }, // Multiplayer API - { "is_normalmap", "is_normal_map" }, // NoiseTexture - { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API - { "is_region", "is_region_enabled" }, // Sprite2D - { "is_rotating", "is_ignoring_rotation" }, // Camera2D - { "is_scancode_unicode", "is_keycode_unicode" }, // OS - { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin - { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem - { "is_shortcut", "matches_event" }, // Shortcut - { "is_size_override_stretch_enabled", "is_size_2d_override_stretch_enabled" }, // SubViewport - { "is_sort_enabled", "is_y_sort_enabled" }, // Node2D - { "is_static_body", "is_able_to_sleep" }, // PhysicalBone3D - TODO - not sure - { "is_v_drag_enabled", "is_drag_vertical_enabled" }, // Camera2D - { "joint_create_cone_twist", "joint_make_cone_twist" }, // PhysicsServer3D - { "joint_create_generic_6dof", "joint_make_generic_6dof" }, // PhysicsServer3D - { "joint_create_hinge", "joint_make_hinge" }, // PhysicsServer3D - { "joint_create_pin", "joint_make_pin" }, // PhysicsServer3D - { "joint_create_slider", "joint_make_slider" }, // PhysicsServer3D - { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D - { "load_from_globals", "load_from_project_settings" }, // InputMap - { "load_interactive", "load_threaded_request" }, // ResourceLoader - load_threaded_request is alternative, but is used differently - { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D - { "make_visible", "_make_visible" }, // EditorPlugin - { "merge_polygons_2d", "merge_polygons" }, // Geometry2D - { "mesh_surface_get_format", "mesh_surface_get_format_attribute_stride" }, // RenderingServer - { "mesh_surface_update_region", "mesh_surface_update_attribute_region" }, // RenderingServer - { "move_to_bottom", "move_after" }, // Skeleton3D - { "move_to_top", "move_before" }, // Skeleton3D - { "multimesh_allocate", "multimesh_allocate_data" }, // RenderingServer - { "normalmap_to_xy", "normal_map_to_xy" }, // Image - { "offset_polygon_2d", "offset_polygon" }, // Geometry2D - { "offset_polyline_2d", "offset_polyline" }, // Geometry2D - { "percent_decode", "uri_decode" }, // String - { "percent_encode", "uri_encode" }, // String - { "pin_joint_create", "joint_make_pin" }, // PhysicsServer2D - { "popup_centered_minsize", "popup_centered_clamped" }, // Window - { "post_import", "_post_import" }, // EditorScenePostImport - { "print_stray_nodes", "print_orphan_nodes" }, // Node - { "property_list_changed_notify", "notify_property_list_changed" }, // Object - { "raise", "move_to_front" }, // CanvasItem - { "recognize", "_recognize" }, // ResourceFormatLoader - { "regen_normalmaps", "regen_normal_maps" }, // ArrayMesh - { "remove", "remove_at" }, // Array, broke Directory - { "remove_animation", "remove_animation_library" }, // AnimationPlayer - { "remove_color_override", "remove_theme_color_override" }, // Control - { "remove_constant_override", "remove_theme_constant_override" }, // Control - { "remove_font_override", "remove_theme_font_override" }, // Control - { "remove_icon_override", "remove_theme_icon_override" }, // Control - { "remove_scene_import_plugin", "remove_scene_format_importer_plugin" }, //EditorPlugin - { "remove_spatial_gizmo_plugin", "remove_node_3d_gizmo_plugin" }, // EditorPlugin - { "remove_stylebox_override", "remove_theme_stylebox_override" }, // Control - { "rename_animation", "rename_animation_library" }, // AnimationPlayer - { "rename_dependencies", "_rename_dependencies" }, // ResourceFormatLoader - { "save_external_data", "_save_external_data" }, // EditorPlugin - { "segment_intersects_segment_2d", "segment_intersects_segment" }, // Geometry2D - { "set_adjustment_enable", "set_adjustment_enabled" }, // Environment - { "set_alt", "set_alt_pressed" }, // InputEventWithModifiers - { "set_anchor_and_margin", "set_anchor_and_offset" }, // Control - { "set_anchors_and_margins_preset", "set_anchors_and_offsets_preset" }, // Control - { "set_animation_process_mode", "set_process_callback" }, // AnimationPlayer - { "set_as_bulk_array", "set_buffer" }, // MultiMesh - { "set_as_normalmap", "set_as_normal_map" }, // NoiseTexture - { "set_as_toplevel", "set_as_top_level" }, // CanvasItem - { "set_audio_bus", "set_audio_bus_name" }, // Area3D - { "set_autowrap", "set_autowrap_mode" }, // Label broke AcceptDialog - { "set_cast_to", "set_target_position" }, // RayCast2D, RayCast3D - { "set_collision_layer_bit", "set_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap - { "set_collision_mask_bit", "set_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap - { "set_column_min_width", "set_column_custom_minimum_width" }, // Tree - { "set_command", "set_meta_pressed" }, // InputEventWithModifiers - { "set_control", "set_ctrl_pressed" }, // InputEventWithModifiers - { "set_create_options", "_set_create_options" }, // EditorResourcePicker - { "set_cull_mask_bit", "set_cull_mask_value" }, // Camera3D - { "set_cursor_position", "set_caret_column" }, // LineEdit - { "set_d", "set_distance" }, // WorldMarginShape2D - { "set_depth_bias_enable", "set_depth_bias_enabled" }, // RDPipelineRasterizationState - { "set_device", "set_output_device" }, // AudioServer - { "set_doubleclick", "set_double_click" }, // InputEventMouseButton - { "set_draw_red", "set_draw_warning" }, // EditorProperty - { "set_enable_follow_smoothing", "set_position_smoothing_enabled" }, // Camera2D - { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton - { "set_endian_swap", "set_big_endian" }, // File - { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit - { "set_filename", "set_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places - { "set_focus_neighbour", "set_focus_neighbor" }, // Control - { "set_follow_smoothing", "set_position_smoothing_speed" }, // Camera2D - { "set_frame_color", "set_color" }, // ColorRect - { "set_global_rate_scale", "set_playback_speed_scale" }, // AudioServer - { "set_gravity_distance_scale", "set_gravity_point_unit_distance" }, // Area(2D/3D) - { "set_gravity_vector", "set_gravity_direction" }, // Area(2D/3D) - { "set_h_drag_enabled", "set_drag_horizontal_enabled" }, // Camera2D - { "set_icon_align", "set_icon_alignment" }, // Button - { "set_interior_ambient", "set_ambient_color" }, // ReflectionProbe - { "set_interior_ambient_energy", "set_ambient_color_energy" }, // ReflectionProbe - { "set_invert_faces", "set_flip_faces" }, // CSGPrimitive3D - { "set_is_initialized", "_is_initialized" }, // XRInterface - { "set_is_primary", "set_primary" }, // XRInterface - { "set_iterations_per_second", "set_physics_ticks_per_second" }, // Engine - { "set_layer_mask_bit", "set_layer_mask_value" }, // VisualInstance3D - { "set_margins_preset", "set_offsets_preset" }, // Control - { "set_max_atlas_size", "set_max_texture_size" }, // LightmapGI - { "set_metakey", "set_meta_pressed" }, // InputEventWithModifiers - { "set_mid_height", "set_height" }, // CapsuleMesh - { "set_neighbor_dist", "set_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D - { "set_network_master", "set_multiplayer_authority" }, // Node - { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API - { "set_oneshot", "set_one_shot" }, // AnimatedTexture - { "set_pause_mode", "set_process_mode" }, // Node - { "set_physical_scancode", "set_physical_keycode" }, // InputEventKey - { "set_proximity_fade", "set_proximity_fade_enabled" }, // Material - { "set_refuse_new_network_connections", "set_refuse_new_connections" }, // Multiplayer API - { "set_region", "set_region_enabled" }, // Sprite2D, Sprite broke AtlasTexture - { "set_region_filter_clip", "set_region_filter_clip_enabled" }, // Sprite2D - { "set_reverb_bus", "set_reverb_bus_name" }, // Area3D - { "set_rotate", "set_rotates" }, // PathFollow2D - { "set_scancode", "set_keycode" }, // InputEventKey - { "set_shift", "set_shift_pressed" }, // InputEventWithModifiers - { "set_size_override", "set_size_2d_override" }, // SubViewport broke ImageTexture - { "set_size_override_stretch", "set_size_2d_override_stretch" }, // SubViewport - { "set_slips_on_slope", "set_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D - { "set_sort_enabled", "set_y_sort_enabled" }, // Node2D - { "set_space_override_mode", "set_gravity_space_override_mode" }, // Area2D - { "set_spatial_node", "set_node_3d" }, // EditorNode3DGizmo - { "set_speed", "set_velocity" }, // InputEventMouseMotion - { "set_ssao_edge_sharpness", "set_ssao_sharpness" }, // Environment - { "set_surface_material", "set_surface_override_material" }, // MeshInstance3D broke ImporterMesh - { "set_tab_align", "set_tab_alignment" }, //TabContainer - { "set_tangent", "surface_set_tangent" }, // ImmediateGeometry broke SurfaceTool - { "set_text_align", "set_text_alignment" }, // Button - { "set_timer_process_mode", "set_timer_process_callback" }, // Timer - { "set_translation", "set_position" }, // Node3D - this broke GLTFNode which is used rarely - { "set_unit_db", "set_volume_db" }, // AudioStreamPlayer3D - { "set_unit_offset", "set_progress_ratio" }, // PathFollow2D, PathFollow3D - { "set_uv2", "surface_set_uv2" }, // ImmediateMesh broke Surffacetool - { "set_v_drag_enabled", "set_drag_vertical_enabled" }, // Camera2D - { "set_valign", "set_vertical_alignment" }, // Label - { "set_window_layout", "_set_window_layout" }, // EditorPlugin - { "set_zfar", "set_far" }, // Camera3D broke GLTFCamera - { "set_znear", "set_near" }, // Camera3D broke GLTFCamera - { "shortcut_match", "is_match" }, // InputEvent - { "skeleton_allocate", "skeleton_allocate_data" }, // RenderingServer - { "surface_update_region", "surface_update_attribute_region" }, // ArrayMesh - { "targeting_method", "tween_method" }, // Tween - { "targeting_property", "tween_property" }, // Tween - { "track_remove_key_at_position", "track_remove_key_at_time" }, // Animation - { "triangulate_delaunay_2d", "triangulate_delaunay" }, // Geometry2D - { "unselect", "deselect" }, // ItemList - { "unselect_all", "deselect_all" }, // ItemList - { "update_configuration_warning", "update_configuration_warnings" }, // Node - { "update_gizmo", "update_gizmos" }, // Node3D - { "viewport_set_use_arvr", "viewport_set_use_xr" }, // RenderingServer - { "warp_mouse_position", "warp_mouse" }, // Input - { "world_to_map", "local_to_map" }, // TileMap, GridMap - { "set_shader_param", "set_shader_parameter" }, // ShaderMaterial - { "get_shader_param", "get_shader_parameter" }, // ShaderMaterial - { "set_uniform_name", "set_parameter_name" }, // ParameterRef - { "get_uniform_name", "get_parameter_name" }, // ParameterRef - - // Builtin types - // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed - // { "empty", "is_empty" }, // Array - Used as custom rule // Be careful, this will be used everywhere - { "clamped", "clamp" }, // Vector2 // Be careful, this will be used everywhere - { "get_rotation_quat", "get_rotation_quaternion" }, // Basis - { "grow_margin", "grow_side" }, // Rect2 - { "invert", "reverse" }, // Array - TODO check // Be careful, this will be used everywhere - { "is_abs_path", "is_absolute_path" }, // String - { "is_valid_integer", "is_valid_int" }, // String - { "linear_interpolate", "lerp" }, // Color - { "find_last", "rfind" }, // Array, String - { "to_ascii", "to_ascii_buffer" }, // String - { "to_utf8", "to_utf8_buffer" }, // String - { "to_wchar", "to_utf32_buffer" }, // String // TODO - utf32 or utf16? - - // @GlobalScope - // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed - { "bytes2var", "bytes_to_var" }, - { "bytes2var_with_objects", "bytes_to_var_with_objects" }, - { "db2linear", "db_to_linear" }, - { "deg2rad", "deg_to_rad" }, - { "linear2db", "linear_to_db" }, - { "rad2deg", "rad_to_deg" }, - { "rand_range", "randf_range" }, - { "range_lerp", "remap" }, - { "stepify", "snapped" }, - { "str2var", "str_to_var" }, - { "var2str", "var_to_str" }, - { "var2bytes", "var_to_bytes" }, - { "var2bytes_with_objects", "var_to_bytes_with_objects" }, - - // @GDScript - // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed - { "dict2inst", "dict_to_inst" }, - { "inst2dict", "inst_to_dict" }, - - { nullptr, nullptr }, -}; - -// gdscript_function_renames clone with CamelCase -const char *ProjectConverter3To4::csharp_function_renames[][2] = { - // { "_SetName", "GetTrackerName"}, // XRPositionalTracker - CameraFeed use this - // { "_UnhandledInput", "_UnhandledKeyInput"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer - // { "CreateGizmo", "_CreateGizmo"}, // EditorNode3DGizmoPlugin - may be used - // { "GetDependencies", "_GetDependencies" }, // ResourceFormatLoader broke ResourceLoader - // { "GetExtents", "GetSize" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume - // { "GetHOffset", "GetDragHorizontalOffset"}, // Camera2D, broke PathFollow, Camera - // { "GetMode", "GetFileMode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap - // { "GetMotion", "GetTravel"}, // PhysicsTestMotionResult2D broke ParalaxLayer - // { "GetName", "GetTrackerName"}, // XRPositionalTracker broke OS, Node - // { "GetNetworkConnectedPeers", "GetPeers"}, // MultiplayerAPI broke SceneTree - // { "GetNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree - // { "GetNetworkUniqueId", "GetUniqueId"}, // MultiplayerAPI broke SceneTree - // { "GetOffset", "GetPositionOffset" }, // GraphNode broke Gradient - // { "GetPeerPort", "GetPeer" }, // ENetMultiplayerPeer broke WebSocketServer - // { "GetProcessMode", "GetProcessCallback" }, // ClippedCamera3D broke Node, Sky - // { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer broke Viewport - // { "GetType", "GetTrackerType"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight - // { "GetVOffset", "GetDragVerticalOffset"}, // Camera2D, broke PathFollow, Camera - // { "HasNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree - // { "Instance", "Instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule - // { "IsListening", "IsBound"}, // PacketPeerUDP broke TCPServer, UDPServer - // { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections"}, // MultiplayerAPI broke SceneTree - // { "IsValid", "HasValidEvent" }, // Shortcut broke e.g. Callable - // { "Listen", "Bound"}, // PacketPeerUDP broke TCPServer, UDPServer - // { "Load", "_Load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D - // { "MakeCurrent", "SetCurrent" }, // Camera2D broke Camera3D, Listener2D - // { "Process", "_Process" }, // AnimationNode - This word is commonly used - // { "Save", "_Save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D - // { "SetAutowrap", "SetAutowrapMode" }, // AcceptDialog broke Label - Cyclic Rename - // { "SetColor", "SurfaceSetColor"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool - // { "SetEvent", "SetShortcut" }, // BaseButton - Cyclic Rename - // { "SetExtents", "SetSize"}, // BoxShape, RectangleShape broke ReflectionProbe - // { "SetFlag", "SetParticleFlag"}, // ParticleProcessMaterial broke Window, HingeJoint3D - // { "SetHOffset", "SetDragHorizontalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D - // { "SetMargin", "SetOffset" }, // Control broke Shape3D, AtlasTexture - // { "SetMode", "SetModeFileMode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap - // { "SetNormal", "SurfaceSetNormal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D - // { "SetOffset", "SetProgress" }, // PathFollow2D, PathFollow3D - Too common - // { "SetProcessMode", "SetProcessCallback" }, // AnimationTree broke Node, Tween, Sky - // { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections"}, // MultiplayerAPI broke SceneTree - // { "SetTooltip", "SetTooltipText" }, // Control, breaks TreeItem, at least for now. - // { "SetUv", "SurfaceSetUv" }, // ImmediateMesh broke Polygon2D - // { "SetVOffset", "SetDragVerticalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D - // {"GetPoints","GetPointsId"},// Astar, broke Line2D, Convexpolygonshape - // {"GetVScroll","GetVScrollBar"},//ItemList, broke TextView - // { "GetStylebox", "GetThemeStylebox" }, // Control - Will rename the method in Theme as well, skipping - { "AddSpatialGizmoPlugin", "AddNode3dGizmoPlugin" }, // EditorPlugin - { "RenderingServer", "GetTabAlignment" }, // Tab - { "_AboutToShow", "_AboutToPopup" }, // ColorPickerButton - { "_GetConfigurationWarning", "_GetConfigurationWarnings" }, // Node - { "_SetCurrent", "SetCurrent" }, // Camera2D - { "_SetEditorDescription", "SetEditorDescription" }, // Node - { "_SetPlaying", "SetPlaying" }, // AnimatedSprite3D - { "_ToplevelRaiseSelf", "_TopLevelRaiseSelf" }, // CanvasItem - { "_UpdateWrapAt", "_UpdateWrapAtColumn" }, // TextEdit - { "AddAnimation", "AddAnimationLibrary" }, // AnimationPlayer - { "AddCancel", "AddCancelButton" }, // AcceptDialog - { "AddCentralForce", "AddConstantCentralForce" }, //RigidBody2D - { "AddChildBelowNode", "AddSibling" }, // Node - { "AddColorOverride", "AddThemeColorOverride" }, // Control - { "AddConstantOverride", "AddThemeConstantOverride" }, // Control - { "AddFontOverride", "AddThemeFontOverride" }, // Control - { "AddForce", "AddConstantForce" }, //RigidBody2D - { "AddIconOverride", "AddThemeIconOverride" }, // Control - { "AddSceneImportPlugin", "AddSceneFormatImporterPlugin" }, //EditorPlugin - { "AddStyleboxOverride", "AddThemeStyleboxOverride" }, // Control - { "AddTorque", "AddConstantTorque" }, //RigidBody2D - { "AgentSetNeighborDist", "AgentSetNeighborDistance" }, // NavigationServer2D, NavigationServer3D - { "BindChildNodeToBone", "SetBoneChildren" }, // Skeleton3D - { "BumpmapToNormalmap", "BumpMapToNormalMap" }, // Image - { "CanBeHidden", "_CanBeHidden" }, // EditorNode3DGizmoPlugin - { "CanDropData", "_CanDropData" }, // Control - { "CanDropDataFw", "_CanDropDataFw" }, // ScriptEditor - { "CanGenerateSmallPreview", "_CanGenerateSmallPreview" }, // EditorResourcePreviewGenerator - { "CanInstance", "CanInstantiate" }, // PackedScene, Script - { "CanvasLightSetScale", "CanvasLightSetTextureScale" }, // RenderingServer - { "CaptureGetDevice", "GetInputDevice" }, // AudioServer - { "CaptureGetDeviceList", "GetInputDeviceList" }, // AudioServer - { "CaptureSetDevice", "SetInputDevice" }, // AudioServer - { "CenterViewportToCursor", "CenterViewportToCaret" }, // TextEdit - { "ChangeScene", "ChangeSceneToFile" }, // SceneTree - { "ChangeSceneTo", "ChangeSceneToPacked" }, // SceneTree - { "ClipPolygons2d", "ClipPolygons" }, // Geometry2D - { "ClipPolylineWithPolygon2d", "ClipPolylineWithPolygon" }, //Geometry2D - { "CommitHandle", "_CommitHandle" }, // EditorNode3DGizmo - { "ConvexHull2d", "ConvexHull" }, // Geometry2D - { "CursorGetBlinkSpeed", "GetCaretBlinkInterval" }, // TextEdit - { "CursorGetColumn", "GetCaretColumn" }, // TextEdit - { "CursorGetLine", "GetCaretLine" }, // TextEdit - { "CursorSetBlinkEnabled", "SetCaretBlinkEnabled" }, // TextEdit - { "CursorSetBlinkSpeed", "SetCaretBlinkInterval" }, // TextEdit - { "CursorSetColumn", "SetCaretColumn" }, // TextEdit - { "CursorSetLine", "SetCaretLine" }, // TextEdit - { "DampedSpringJointCreate", "JointMakeDampedSpring" }, // PhysicsServer2D - { "DampedStringJointGetParam", "DampedSpringJointGetParam" }, // PhysicsServer2D - { "DampedStringJointSetParam", "DampedSpringJointSetParam" }, // PhysicsServer2D - { "DeleteCharAtCursor", "DeleteCharAtCaret" }, // LineEdit - { "DeselectItems", "DeselectAll" }, // FileDialog - { "DropData", "_DropData" }, // Control - { "DropDataFw", "_DropDataFw" }, // ScriptEditor - { "ExcludePolygons2d", "ExcludePolygons" }, // Geometry2D - { "FindScancodeFromString", "FindKeycodeFromString" }, // OS - { "ForwardCanvasDrawOverViewport", "_ForwardCanvasDrawOverViewport" }, // EditorPlugin - { "ForwardCanvasForceDrawOverViewport", "_ForwardCanvasForceDrawOverViewport" }, // EditorPlugin - { "ForwardCanvasGuiInput", "_ForwardCanvasGuiInput" }, // EditorPlugin - { "ForwardSpatialDrawOverViewport", "_Forward3dDrawOverViewport" }, // EditorPlugin - { "ForwardSpatialForceDrawOverViewport", "_Forward3dForceDrawOverViewport" }, // EditorPlugin - { "ForwardSpatialGuiInput", "_Forward3dGuiInput" }, // EditorPlugin - { "GenerateFromPath", "_GenerateFromPath" }, // EditorResourcePreviewGenerator - { "GenerateSmallPreviewAutomatically", "_GenerateSmallPreviewAutomatically" }, // EditorResourcePreviewGenerator - { "GetActionList", "ActionGetEvents" }, // InputMap - { "GetAlt", "IsAltPressed" }, // InputEventWithModifiers - { "GetAnimationProcessMode", "GetProcessCallback" }, // AnimationPlayer - { "GetAppliedForce", "GetConstantForce" }, //RigidBody2D - { "GetAppliedTorque", "GetConstantTorque" }, //RigidBody2D - { "GetAudioBus", "GetAudioBusName" }, // Area3D - { "GetBoundChildNodesToBone", "GetBoneChildren" }, // Skeleton3D - { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertible to getCamera2d, broke GLTFNode - { "GetCancel", "GetCancelButton" }, // ConfirmationDialog - { "GetCaption", "_GetCaption" }, // AnimationNode - { "GetCastTo", "GetTargetPosition" }, // RayCast2D, RayCast3D - { "GetChildByName", "_GetChildByName" }, // AnimationNode - { "GetChildNodes", "_GetChildNodes" }, // AnimationNode - { "GetClosestPointToSegment2d", "GetClosestPointToSegment" }, // Geometry2D - { "GetClosestPointToSegmentUncapped2d", "GetClosestPointToSegmentUncapped" }, // Geometry2D - { "GetClosestPointsBetweenSegments2d", "GetClosestPointToSegment" }, // Geometry2D - { "GetCollisionLayerBit", "GetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap - { "GetCollisionMaskBit", "GetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap - { "GetColorTypes", "GetColorTypeList" }, // Theme - { "GetCommand", "IsCommandPressed" }, // InputEventWithModifiers - { "GetConstantTypes", "GetConstantTypeList" }, // Theme - { "GetControl", "IsCtrlPressed" }, // InputEventWithModifiers - { "GetCullMaskBit", "GetCullMaskValue" }, // Camera3D - { "GetCursorPosition", "GetCaretColumn" }, // LineEdit - { "GetD", "GetDistance" }, // LineShape2D - { "GetDepthBiasEnable", "GetDepthBiasEnabled" }, // RDPipelineRasterizationState - { "GetDevice", "GetOutputDevice" }, // AudioServer - { "GetDeviceList", "GetOutputDeviceList" }, // AudioServer - { "GetDragDataFw", "_GetDragDataFw" }, // ScriptEditor - { "GetEditorViewport", "GetViewport" }, // EditorPlugin - { "GetEnabledFocusMode", "GetFocusMode" }, // BaseButton - { "GetEndianSwap", "IsBigEndian" }, // File - { "GetErrorString", "GetErrorMessage" }, // JSON - { "GetFocusNeighbour", "GetFocusNeighbor" }, // Control - { "GetFollowSmoothing", "GetFollowSmoothingSpeed" }, // Camera2D - { "GetFontTypes", "GetFontTypeList" }, // Theme - { "GetFrameColor", "GetColor" }, // ColorRect - { "GetGlobalRateScale", "GetPlaybackSpeedScale" }, // AudioServer - { "GetGravityDistanceScale", "GetGravityPointDistanceScale" }, //Area2D - { "GetGravityVector", "GetGravityDirection" }, //Area2D - { "GetHScrollbar", "GetHScrollBar" }, //ScrollContainer - { "GetHand", "GetTrackerHand" }, // XRPositionalTracker - { "GetHandleName", "_GetHandleName" }, // EditorNode3DGizmo - { "GetHandleValue", "_GetHandleValue" }, // EditorNode3DGizmo - { "GetIconAlign", "GetIconAlignment" }, // Button - { "GetIconTypes", "GetIconTypeList" }, // Theme - { "GetIdleFrames", "GetProcessFrames" }, // Engine - { "GetImportOptions", "_GetImportOptions" }, // EditorImportPlugin - { "GetImportOrder", "_GetImportOrder" }, // EditorImportPlugin - { "GetImporterName", "_GetImporterName" }, // EditorImportPlugin - { "GetInteriorAmbient", "GetAmbientColor" }, // ReflectionProbe - { "GetInteriorAmbientEnergy", "GetAmbientColorEnergy" }, // ReflectionProbe - { "GetIterationsPerSecond", "GetPhysicsTicksPerSecond" }, // Engine - { "GetLastMouseSpeed", "GetLastMouseVelocity" }, // Input - { "GetLayerMaskBit", "GetLayerMaskValue" }, // VisualInstance3D - { "GetLen", "GetLength" }, // File - { "GetMaxAtlasSize", "GetMaxTextureSize" }, // LightmapGI - { "GetMetakey", "IsMetaPressed" }, // InputEventWithModifiers - { "GetMidHeight", "GetHeight" }, // CapsuleMesh - { "GetMotionRemainder", "GetRemainder" }, // PhysicsTestMotionResult2D - { "GetNeighborDist", "GetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D - { "GetNetworkConnectedPeers", "GetPeers" }, // Multiplayer API - { "GetNetworkMaster", "GetMultiplayerAuthority" }, // Node - { "GetNetworkPeer", "GetMultiplayerPeer" }, // Multiplayer API - { "GetNetworkUniqueId", "GetUniqueId" }, // Multiplayer API - { "GetOneshot", "GetOneShot" }, // AnimatedTexture - { "GetOk", "GetOkButton" }, // AcceptDialog - { "GetOptionVisibility", "_GetOptionVisibility" }, // EditorImportPlugin - { "GetParameterDefaultValue", "_GetParameterDefaultValue" }, // AnimationNode - { "GetParameterList", "_GetParameterList" }, // AnimationNode - { "GetParentSpatial", "GetParentNode3d" }, // Node3D - { "GetPhysicalScancode", "GetPhysicalKeycode" }, // InputEventKey - { "GetPhysicalScancodeWithModifiers", "GetPhysicalKeycodeWithModifiers" }, // InputEventKey - { "GetPluginIcon", "_GetPluginIcon" }, // EditorPlugin - { "GetPluginName", "_GetPluginName" }, // EditorPlugin - { "GetPresetCount", "_GetPresetCount" }, // EditorImportPlugin - { "GetPresetName", "_GetPresetName" }, // EditorImportPlugin - { "GetRecognizedExtensions", "_GetRecognizedExtensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver - { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer - { "GetRenderTargetsize", "GetRenderTargetSize" }, // XRInterface - { "GetResourceType", "_GetResourceType" }, // ResourceFormatLoader - { "GetResult", "GetData" }, //JSON - { "GetReverbBus", "GetReverbBusName" }, // Area3D - { "GetRpcSenderId", "GetRemoteSenderId" }, // Multiplayer API - { "GetSaveExtension", "_GetSaveExtension" }, // EditorImportPlugin - { "GetScancode", "GetKeycode" }, // InputEventKey - { "GetScancodeString", "GetKeycodeString" }, // OS - { "GetScancodeWithModifiers", "GetKeycodeWithModifiers" }, // InputEventKey - { "GetShift", "IsShiftPressed" }, // InputEventWithModifiers - { "GetSizeOverride", "GetSize2dOverride" }, // SubViewport - { "GetSlipsOnSlope", "GetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D - { "GetSpaceOverrideMode", "GetGravitySpaceOverrideMode" }, // Area2D - { "GetSpatialNode", "GetNode3d" }, // EditorNode3DGizmo - { "GetSpeed", "GetVelocity" }, // InputEventMouseMotion - { "GetStyleboxTypes", "GetStyleboxTypeList" }, // Theme - { "GetSurfaceMaterial", "GetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh - { "GetSurfaceMaterialCount", "GetSurfaceOverrideMaterialCount" }, // MeshInstance3D - { "GetTabDisabled", "IsTabDisabled" }, // Tab - { "GetTabHidden", "IsTabHidden" }, // Tab - { "GetTextAlign", "GetTextAlignment" }, // Button - { "GetThemeItemTypes", "GetThemeItemTypeList" }, // Theme - { "GetTimerProcessMode", "GetTimerProcessCallback" }, // Timer - { "GetTranslation", "GetPosition" }, // Node3D broke GLTFNode which is used rarely - { "GetUnitDb", "GetVolumeDb" }, // AudioStreamPlayer3D - { "GetUnitOffset", "GetProgressRatio" }, // PathFollow2D, PathFollow3D - { "GetUseInBakedLight", "IsBakingNavigation" }, // GridMap - { "GetUsedCellsById", "GetUsedCells" }, // TileMap - { "GetVScrollbar", "GetVScrollBar" }, //ScrollContainer - { "GetVisibleName", "_GetVisibleName" }, // EditorImportPlugin - { "GetWindowLayout", "_GetWindowLayout" }, // EditorPlugin - { "GetWordUnderCursor", "GetWordUnderCaret" }, // TextEdit - { "GetWorld", "GetWorld3d" }, // Viewport, Spatial - { "GetZfar", "GetFar" }, // Camera3D broke GLTFCamera - { "GetZnear", "GetNear" }, // Camera3D broke GLTFCamera - { "GrooveJointCreate", "JointMakeGroove" }, // PhysicsServer2D - { "HandleMenuSelected", "_HandleMenuSelected" }, // EditorResourcePicker - { "HandlesType", "_HandlesType" }, // ResourceFormatLoader - { "HasColor", "HasThemeColor" }, // Control broke Theme - { "HasColorOverride", "HasThemeColorOverride" }, // Control broke Theme - { "HasConstant", "HasThemeConstant" }, // Control - { "HasConstantOverride", "HasThemeConstantOverride" }, // Control - { "HasFilter", "_HasFilter" }, // AnimationNode - { "HasFont", "HasThemeFont" }, // Control broke Theme - { "HasFontOverride", "HasThemeFontOverride" }, // Control - { "HasIcon", "HasThemeIcon" }, // Control broke Theme - { "HasIconOverride", "HasThemeIconOverride" }, // Control - { "HasMainScreen", "_HasMainScreen" }, // EditorPlugin - { "HasNetworkPeer", "HasMultiplayerPeer" }, // Multiplayer API - { "HasStylebox", "HasThemeStylebox" }, // Control broke Theme - { "HasStyleboxOverride", "HasThemeStyleboxOverride" }, // Control - { "HttpEscape", "UriEncode" }, // String - { "HttpUnescape", "UriDecode" }, // String - { "ImportAnimationFromOtherImporter", "_ImportAnimation" }, //EditorSceneFormatImporter - { "ImportSceneFromOtherImporter", "_ImportScene" }, //EditorSceneFormatImporter - { "InstanceSetSurfaceMaterial", "InstanceSetSurfaceOverrideMaterial" }, // RenderingServer - { "IntersectPolygons2d", "IntersectPolygons" }, // Geometry2D - { "IntersectPolylineWithPolygon2d", "IntersectPolylineWithPolygon" }, // Geometry2D - { "IsAParentOf", "IsAncestorOf" }, // Node - { "IsCommitingAction", "IsCommittingAction" }, // UndoRedo - { "IsDoubleclick", "IsDoubleClick" }, // InputEventMouseButton - { "IsFollowSmoothingEnabled", "IsPositionSmoothingEnabled" }, // Camera2D - { "IsHDragEnabled", "IsDragHorizontalEnabled" }, // Camera2D - { "IsHandleHighlighted", "_IsHandleHighlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin - { "IsNetworkMaster", "IsMultiplayerAuthority" }, // Node - { "IsNetworkServer", "IsServer" }, // Multiplayer API - { "IsNormalmap", "IsNormalMap" }, // NoiseTexture - { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API - { "IsRegion", "IsRegionEnabled" }, // Sprite2D - { "IsRotating", "IsIgnoringRotation" }, // Camera2D - { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS - { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin - { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem - { "IsShortcut", "MatchesEvent" }, // Shortcut - { "IsSizeOverrideStretchEnabled", "IsSize2dOverrideStretchEnabled" }, // SubViewport - { "IsSortEnabled", "IsYSortEnabled" }, // Node2D - { "IsStaticBody", "IsAbleToSleep" }, // PhysicalBone3D - TODO - not sure - { "IsVDragEnabled", "IsDragVerticalEnabled" }, // Camera2D - { "JointCreateConeTwist", "JointMakeConeTwist" }, // PhysicsServer3D - { "JointCreateGeneric6dof", "JointMakeGeneric6dof" }, // PhysicsServer3D - { "JointCreateHinge", "JointMakeHinge" }, // PhysicsServer3D - { "JointCreatePin", "JointMakePin" }, // PhysicsServer3D - { "JointCreateSlider", "JointMakeSlider" }, // PhysicsServer3D - { "LineIntersectsLine2d", "LineIntersectsLine" }, // Geometry2D - { "LoadFromGlobals", "LoadFromProjectSettings" }, // InputMap - { "MakeConvexFromBrothers", "MakeConvexFromSiblings" }, // CollisionShape3D - { "MergePolygons2d", "MergePolygons" }, // Geometry2D - { "MeshSurfaceGetFormat", "MeshSurfaceGetFormatAttributeStride" }, // RenderingServer - { "MeshSurfaceUpdateRegion", "MeshSurfaceUpdateAttributeRegion" }, // RenderingServer - { "MoveToBottom", "MoveAfter" }, // Skeleton3D - { "MoveToTop", "MoveBefore" }, // Skeleton3D - { "MultimeshAllocate", "MultimeshAllocateData" }, // RenderingServer - { "NormalmapToXy", "NormalMapToXy" }, // Image - { "OffsetPolygon2d", "OffsetPolygon" }, // Geometry2D - { "OffsetPolyline2d", "OffsetPolyline" }, // Geometry2D - { "PercentDecode", "UriDecode" }, // String - { "PercentEncode", "UriEncode" }, // String - { "PinJointCreate", "JointMakePin" }, // PhysicsServer2D - { "PopupCenteredMinsize", "PopupCenteredClamped" }, // Window - { "PostImport", "_PostImport" }, // EditorScenePostImport - { "PrintStrayNodes", "PrintOrphanNodes" }, // Node - { "PropertyListChangedNotify", "NotifyPropertyListChanged" }, // Object - { "Recognize", "_Recognize" }, // ResourceFormatLoader - { "RegenNormalmaps", "RegenNormalMaps" }, // ArrayMesh - { "Remove", "RemoveAt" }, // Array, broke Directory - { "RemoveAnimation", "RemoveAnimationLibrary" }, // AnimationPlayer - { "RemoveColorOverride", "RemoveThemeColorOverride" }, // Control - { "RemoveConstantOverride", "RemoveThemeConstantOverride" }, // Control - { "RemoveFontOverride", "RemoveThemeFontOverride" }, // Control - { "RemoveSceneImportPlugin", "RemoveSceneFormatImporterPlugin" }, //EditorPlugin - { "RemoveSpatialGizmoPlugin", "RemoveNode3dGizmoPlugin" }, // EditorPlugin - { "RemoveStyleboxOverride", "RemoveThemeStyleboxOverride" }, // Control - { "RenameAnimation", "RenameAnimationLibrary" }, // AnimationPlayer - { "RenameDependencies", "_RenameDependencies" }, // ResourceFormatLoader - { "SaveExternalData", "_SaveExternalData" }, // EditorPlugin - { "SegmentIntersectsSegment2d", "SegmentIntersectsSegment" }, // Geometry2D - { "SetAdjustmentEnable", "SetAdjustmentEnabled" }, // Environment - { "SetAlt", "SetAltPressed" }, // InputEventWithModifiers - { "SetAnchorAndMargin", "SetAnchorAndOffset" }, // Control - { "SetAnchorsAndMarginsPreset", "SetAnchorsAndOffsetsPreset" }, // Control - { "SetAnimationProcessMode", "SetProcessCallback" }, // AnimationPlayer - { "SetAsBulkArray", "SetBuffer" }, // MultiMesh - { "SetAsNormalmap", "SetAsNormalMap" }, // NoiseTexture - { "SetAsToplevel", "SetAsTopLevel" }, // CanvasItem - { "SetAudioBus", "SetAudioBusName" }, // Area3D - { "SetAutowrap", "SetAutowrapMode" }, // Label broke AcceptDialog - { "SetCastTo", "SetTargetPosition" }, // RayCast2D, RayCast3D - { "SetCollisionLayerBit", "SetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap - { "SetCollisionMaskBit", "SetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap - { "SetColumnMinWidth", "SetColumnCustomMinimumWidth" }, // Tree - { "SetCommand", "SetCommandPressed" }, // InputEventWithModifiers - { "SetControl", "SetCtrlPressed" }, // InputEventWithModifiers - { "SetCreateOptions", "_SetCreateOptions" }, // EditorResourcePicker - { "SetCullMaskBit", "SetCullMaskValue" }, // Camera3D - { "SetCursorPosition", "SetCaretColumn" }, // LineEdit - { "SetD", "SetDistance" }, // WorldMarginShape2D - { "SetDepthBiasEnable", "SetDepthBiasEnabled" }, // RDPipelineRasterizationState - { "SetDevice", "SetOutputDevice" }, // AudioServer - { "SetDoubleclick", "SetDoubleClick" }, // InputEventMouseButton - { "SetEnableFollowSmoothing", "SetFollowSmoothingEnabled" }, // Camera2D - { "SetEnabledFocusMode", "SetFocusMode" }, // BaseButton - { "SetEndianSwap", "SetBigEndian" }, // File - { "SetExpandToTextLength", "SetExpandToTextLengthEnabled" }, // LineEdit - { "SetFocusNeighbour", "SetFocusNeighbor" }, // Control - { "SetFollowSmoothing", "SetFollowSmoothingSpeed" }, // Camera2D - { "SetFrameColor", "SetColor" }, // ColorRect - { "SetGlobalRateScale", "SetPlaybackSpeedScale" }, // AudioServer - { "SetGravityDistanceScale", "SetGravityPointDistanceScale" }, // Area2D - { "SetGravityVector", "SetGravityDirection" }, // Area2D - { "SetHDragEnabled", "SetDragHorizontalEnabled" }, // Camera2D - { "SetIconAlign", "SetIconAlignment" }, // Button - { "SetInteriorAmbient", "SetAmbientColor" }, // ReflectionProbe - { "SetInteriorAmbientEnergy", "SetAmbientColorEnergy" }, // ReflectionProbe - { "SetIsInitialized", "_IsInitialized" }, // XRInterface - { "SetIsPrimary", "SetPrimary" }, // XRInterface - { "SetIterationsPerSecond", "SetPhysicsTicksPerSecond" }, // Engine - { "SetLayerMaskBit", "SetLayerMaskValue" }, // VisualInstance3D - { "SetMarginsPreset", "SetOffsetsPreset" }, // Control - { "SetMaxAtlasSize", "SetMaxTextureSize" }, // LightmapGI - { "SetMetakey", "SetMetaPressed" }, // InputEventWithModifiers - { "SetMidHeight", "SetHeight" }, // CapsuleMesh - { "SetNeighborDist", "SetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D - { "SetNetworkMaster", "SetMultiplayerAuthority" }, // Node - { "SetNetworkPeer", "SetMultiplayerPeer" }, // Multiplayer API - { "SetOneshot", "SetOneShot" }, // AnimatedTexture - { "SetPhysicalScancode", "SetPhysicalKeycode" }, // InputEventKey - { "SetProximityFade", "SetProximityFadeEnabled" }, // Material - { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections" }, // Multiplayer API - { "SetRegion", "SetRegionEnabled" }, // Sprite2D, Sprite broke AtlasTexture - { "SetRegionFilterClip", "SetRegionFilterClipEnabled" }, // Sprite2D - { "SetReverbBus", "SetReverbBusName" }, // Area3D - { "SetRotate", "SetRotates" }, // PathFollow2D - { "SetScancode", "SetKeycode" }, // InputEventKey - { "SetShift", "SetShiftPressed" }, // InputEventWithModifiers - { "SetSizeOverride", "SetSize2dOverride" }, // SubViewport broke ImageTexture - { "SetSizeOverrideStretch", "SetSize2dOverrideStretch" }, // SubViewport - { "SetSlipsOnSlope", "SetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D - { "SetSortEnabled", "SetYSortEnabled" }, // Node2D - { "SetSpaceOverrideMode", "SetGravitySpaceOverrideMode" }, // Area2D - { "SetSpatialNode", "SetNode3d" }, // EditorNode3DGizmo - { "SetSpeed", "SetVelocity" }, // InputEventMouseMotion - { "SetSsaoEdgeSharpness", "SetSsaoSharpness" }, // Environment - { "SetSurfaceMaterial", "SetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh - { "SetTabAlign", "SetTabAlignment" }, //TabContainer - { "SetTangent", "SurfaceSetTangent" }, // ImmediateGeometry broke SurfaceTool - { "SetTextAlign", "SetTextAlignment" }, // Button - { "SetTimerProcessMode", "SetTimerProcessCallback" }, // Timer - { "SetTonemapAutoExposure", "SetTonemapAutoExposureEnabled" }, // Environment - { "SetTranslation", "SetPosition" }, // Node3D - this broke GLTFNode which is used rarely - { "SetUnitDb", "SetVolumeDb" }, // AudioStreamPlayer3D - { "SetUnitOffset", "SetProgressRatio" }, // PathFollow2D, PathFollow3D - { "SetUv2", "SurfaceSetUv2" }, // ImmediateMesh broke Surffacetool - { "SetVDragEnabled", "SetDragVerticalEnabled" }, // Camera2D - { "SetValign", "SetVerticalAlignment" }, // Label - { "SetWindowLayout", "_SetWindowLayout" }, // EditorPlugin - { "SetZfar", "SetFar" }, // Camera3D broke GLTFCamera - { "SetZnear", "SetNear" }, // Camera3D broke GLTFCamera - { "ShortcutMatch", "IsMatch" }, // InputEvent - { "SkeletonAllocate", "SkeletonAllocateData" }, // RenderingServer - { "SurfaceUpdateRegion", "SurfaceUpdateAttributeRegion" }, // ArrayMesh - { "TargetingMethod", "TweenMethod" }, // Tween - { "TargetingProperty", "TweenProperty" }, // Tween - { "TrackRemoveKeyAtPosition", "TrackRemoveKeyAtTime" }, // Animation - { "TriangulateDelaunay2d", "TriangulateDelaunay" }, // Geometry2D - { "UnbindChildNodeFromBone", "RemoveBoneChild" }, // Skeleton3D - { "Unselect", "Deselect" }, // ItemList - { "UnselectAll", "DeselectAll" }, // ItemList - { "UpdateConfigurationWarning", "UpdateConfigurationWarnings" }, // Node - { "UpdateGizmo", "UpdateGizmos" }, // Node3D - { "ViewportSetUseArvr", "ViewportSetUseXr" }, // RenderingServer - { "WarpMousePosition", "WarpMouse" }, // Input - { "WorldToMap", "LocalToMap" }, // TileMap, GridMap - { "SetShaderParam", "SetShaderParameter" }, // ShaderMaterial - { "GetShaderParam", "GetShaderParameter" }, // ShaderMaterial - { "SetUniformName", "SetParameterName" }, // ParameterRef - { "GetUniformName", "GetParameterName" }, // ParameterRef - - // Builtin types - // { "Empty", "IsEmpty" }, // Array - Used as custom rule // Be careful, this will be used everywhere - { "Clamped", "Clamp" }, // Vector2 // Be careful, this will be used everywhere - { "GetRotationQuat", "GetRotationQuaternion" }, // Basis - { "GrowMargin", "GrowSide" }, // Rect2 - { "Invert", "Reverse" }, // Array - TODO check // Be careful, this will be used everywhere - { "IsAbsPath", "IsAbsolutePath" }, // String - { "IsValidInteger", "IsValidInt" }, // String - { "LinearInterpolate", "Lerp" }, // Color - { "ToAscii", "ToAsciiBuffer" }, // String - { "ToUtf8", "ToUtf8Buffer" }, // String - { "ToWchar", "ToUtf32Buffer" }, // String // TODO - utf32 or utf16? - - // @GlobalScope - { "Bytes2Var", "BytesToVar" }, - { "Bytes2VarWithObjects", "BytesToVarWithObjects" }, - { "Db2Linear", "DbToLinear" }, - { "Deg2Rad", "DegToRad" }, - { "Linear2Db", "LinearToDb" }, - { "Rad2Deg", "RadToDeg" }, - { "RandRange", "RandfRange" }, - { "RangeLerp", "Remap" }, - { "Stepify", "Snapped" }, - { "Str2Var", "StrToVar" }, - { "Var2Str", "VarToStr" }, - { "Var2Bytes", "VarToBytes" }, - { "Var2BytesWithObjects", "VarToBytesWithObjects" }, - - // @GDScript - { "Dict2Inst", "DictToInst" }, - { "Inst2Dict", "InstToDict" }, - - { nullptr, nullptr }, -}; - -// Some needs to be disabled, because users can use this names as variables -const char *ProjectConverter3To4::gdscript_properties_renames[][2] = { - // // { "d", "distance" }, //WorldMarginShape2D - TODO, looks that polish letters Ä… Ä™ are treaten as space, not as letter, so `bÄ™dÄ…` are renamed to `bÄ™distanceÄ…` - // // {"alt","alt_pressed"}, // This may broke a lot of comments and user variables - // // {"command","command_pressed"},// This may broke a lot of comments and user variables - // // {"control","ctrl_pressed"},// This may broke a lot of comments and user variables - // // {"extends","size"}, // BoxShape3D, LightmapGI broke ReflectionProbe - // // {"meta","meta_pressed"},// This may broke a lot of comments and user variables - // // {"pause_mode","process_mode"}, // Node - Cyclic rename, look for others - // // {"rotate","rotates"}, // PathFollow2D - probably function exists with same name - // // {"offset","progress"}, // PathFollow2D, PathFollow3D - Name is way too vague - // // {"shift","shift_pressed"},// This may broke a lot of comments and user variables - // { "autowrap", "autowrap_mode" }, // Label - // { "cast_to", "target_position" }, // RayCast2D, RayCast3D - // { "device", "output_device"}, // AudioServer - Too vague, most likely breaks comments & variables - // { "doubleclick", "double_click" }, // InputEventMouseButton - // { "group", "button_group" }, // BaseButton - // { "process_mode", "process_callback" }, // AnimationTree, Camera2D - // { "scancode", "keycode" }, // InputEventKey - // { "toplevel", "top_level" }, // Node - // { "window_title", "title" }, // Window - // { "wrap_enabled", "wrap_mode" }, // TextEdit - // { "zfar", "far" }, // Camera3D - // { "znear", "near" }, // Camera3D - // { "filename", "scene_file_path" }, // Node - // { "pressed", "button_pressed" }, // BaseButton - Will also rename the signal, skipping for now - { "as_normalmap", "as_normal_map" }, // NoiseTexture - { "bbcode_text", "text" }, // RichTextLabel - { "bg", "panel" }, // Theme - { "bg_focus", "focus" }, // Theme - { "capture_device", "input_device" }, // AudioServer - { "caret_blink_speed", "caret_blink_interval" }, // TextEdit, LineEdit - { "caret_moving_by_right_click", "caret_move_on_right_click" }, // TextEdit - { "caret_position", "caret_column" }, // LineEdit - { "check_vadjust", "check_v_offset" }, // Theme - { "close_h_ofs", "close_h_offset" }, // Theme - { "close_v_ofs", "close_v_offset" }, // Theme - { "commentfocus", "comment_focus" }, // Theme - { "contacts_reported", "max_contacts_reported" }, // RigidBody - { "depth_bias_enable", "depth_bias_enabled" }, // RDPipelineRasterizationState - { "drag_margin_bottom", "drag_bottom_margin" }, // Camera2D - { "drag_margin_h_enabled", "drag_horizontal_enabled" }, // Camera2D - { "drag_margin_left", "drag_left_margin" }, // Camera2D - { "drag_margin_right", "drag_right_margin" }, // Camera2D - { "drag_margin_top", "drag_top_margin" }, // Camera2D - { "drag_margin_v_enabled", "drag_vertical_enabled" }, // Camera2D - { "enabled_focus_mode", "focus_mode" }, // BaseButton - Removed - { "extra_spacing_bottom", "spacing_bottom" }, // Font - { "extra_spacing_top", "spacing_top" }, // Font - { "focus_neighbour_bottom", "focus_neighbor_bottom" }, // Control - { "focus_neighbour_left", "focus_neighbor_left" }, // Control - { "focus_neighbour_right", "focus_neighbor_right" }, // Control - { "focus_neighbour_top", "focus_neighbor_top" }, // Control - { "follow_viewport_enable", "follow_viewport_enabled" }, // CanvasItem - { "file_icon_modulate", "file_icon_color" }, // Theme - { "files_disabled", "file_disabled_color" }, // Theme - { "folder_icon_modulate", "folder_icon_color" }, // Theme - { "global_rate_scale", "playback_speed_scale" }, // AudioServer - { "gravity_distance_scale", "gravity_point_unit_distance" }, // Area(2D/3D) - { "gravity_vec", "gravity_direction" }, // Area(2D/3D) - { "hint_tooltip", "tooltip_text" }, // Control - { "hseparation", "h_separation" }, // Theme - { "icon_align", "icon_alignment" }, // Button - { "iterations_per_second", "physics_ticks_per_second" }, // Engine - { "invert_enable", "invert_enabled" }, // Polygon2D - { "margin_bottom", "offset_bottom" }, // Control broke NinePatchRect, StyleBox - { "margin_left", "offset_left" }, // Control broke NinePatchRect, StyleBox - { "margin_right", "offset_right" }, // Control broke NinePatchRect, StyleBox - { "margin_top", "offset_top" }, // Control broke NinePatchRect, StyleBox - { "mid_height", "height" }, // CapsuleMesh - { "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D - { "offset_h", "drag_horizontal_offset" }, // Camera2D - { "offset_v", "drag_vertical_offset" }, // Camera2D - { "off", "unchecked" }, // Theme - { "off_disabled", "unchecked_disabled" }, // Theme - { "ofs", "offset" }, // Theme - { "on", "checked" }, // Theme - { "on_disabled", "checked_disabled" }, // Theme - { "oneshot", "one_shot" }, // AnimatedTexture - { "out_of_range_mode", "max_polyphony" }, // AudioStreamPlayer3D - { "pause_mode", "process_mode" }, // Node - { "physical_scancode", "physical_keycode" }, // InputEventKey - { "popup_exclusive", "exclusive" }, // Window - { "proximity_fade_enable", "proximity_fade_enabled" }, // Material - { "rect_position", "position" }, // Control - { "rect_global_position", "global_position" }, // Control - { "rect_size", "size" }, // Control - { "rect_min_size", "custom_minimum_size" }, // Control - { "rect_rotation", "rotation" }, // Control - { "rect_scale", "scale" }, // Control - { "rect_pivot_offset", "pivot_offset" }, // Control - { "rect_clip_content", "clip_contents" }, // Control - { "refuse_new_network_connections", "refuse_new_connections" }, // MultiplayerAPI - { "region_filter_clip", "region_filter_clip_enabled" }, // Sprite2D - { "reverb_bus_enable", "reverb_bus_enabled" }, // Area3D - { "selectedframe", "selected_frame" }, // Theme - { "size_override_stretch", "size_2d_override_stretch" }, // SubViewport - { "slips_on_slope", "slide_on_slope" }, // SeparationRayShape2D - { "smoothing_enabled", "follow_smoothing_enabled" }, // Camera2D - { "smoothing_speed", "position_smoothing_speed" }, // Camera2D - { "ss_reflections_depth_tolerance", "ssr_depth_tolerance" }, // Environment - { "ss_reflections_enabled", "ssr_enabled" }, // Environment - { "ss_reflections_fade_in", "ssr_fade_in" }, // Environment - { "ss_reflections_fade_out", "ssr_fade_out" }, // Environment - { "ss_reflections_max_steps", "ssr_max_steps" }, // Environment - { "state_machine_selectedframe", "state_machine_selected_frame" }, // Theme - { "syntax_highlighting", "syntax_highlighter" }, // TextEdit - { "tab_align", "tab_alignment" }, // TabContainer - { "table_hseparation", "table_h_separation" }, // Theme - { "table_vseparation", "table_v_separation" }, // Theme - { "translation", "position" }, // Node3D - broke GLTFNode - { "unit_db", "volume_db" }, // AudioStreamPlayer3D - { "unit_offset", "progress_ratio" }, // PathFollow2D, PathFollow3D - { "vseparation", "v_separation" }, // Theme - { "frames", "sprite_frames" }, // AnimatedSprite2D, AnimatedSprite3D - - { nullptr, nullptr }, -}; - -// Some needs to be disabled, because users can use this names as variables -const char *ProjectConverter3To4::csharp_properties_renames[][2] = { - // // { "D", "Distance" }, //WorldMarginShape2D - TODO, looks that polish letters Ä… Ä™ are treaten as space, not as letter, so `bÄ™dÄ…` are renamed to `bÄ™distanceÄ…` - // // {"Alt","AltPressed"}, // This may broke a lot of comments and user variables - // // {"Command","CommandPressed"},// This may broke a lot of comments and user variables - // // {"Control","CtrlPressed"},// This may broke a lot of comments and user variables - // // {"Extends","Size"}, // BoxShape3D, LightmapGI broke ReflectionProbe - // // {"Meta","MetaPressed"},// This may broke a lot of comments and user variables - // // {"PauseMode","ProcessMode"}, // Node - Cyclic rename, look for others - // // {"Rotate","Rotates"}, // PathFollow2D - probably function exists with same name - // // {"Offset","Progress"}, // PathFollow2D, PathFollow3D - Name is way too vague - // // {"Shift","ShiftPressed"},// This may broke a lot of comments and user variables - // { "Autowrap", "AutowrapMode" }, // Label - // { "CastTo", "TargetPosition" }, // RayCast2D, RayCast3D - // { "Doubleclick", "DoubleClick" }, // InputEventMouseButton - // { "Group", "ButtonGroup" }, // BaseButton - // { "PercentVisible, "ShowPercentage}, // ProgressBar, conflicts with Label and RichTextLabel, but may be a worth it. - // { "ProcessMode", "ProcessCallback" }, // AnimationTree, Camera2D - // { "Scancode", "Keycode" }, // InputEventKey - // { "Toplevel", "TopLevel" }, // Node - // { "WindowTitle", "Title" }, // Window - // { "WrapEnabled", "WrapMode" }, // TextEdit - // { "Zfar", "Far" }, // Camera3D - // { "Znear", "Near" }, // Camera3D - // { "Pressed", "ButtonPressed" }, // BaseButton - Will also rename the signal, skipping for now - { "AsNormalmap", "AsNormalMap" }, // NoiseTexture - { "BbcodeText", "Text" }, // RichTextLabel - { "CaretBlinkSpeed", "CaretBlinkInterval" }, // TextEdit, LineEdit - { "CaretMovingByRightClick", "CaretMoveOnRightClick" }, // TextEdit - { "CaretPosition", "CaretColumn" }, // LineEdit - { "CheckVadjust", "CheckVAdjust" }, // Theme - { "CloseHOfs", "CloseHOffset" }, // Theme - { "CloseVOfs", "CloseVOffset" }, // Theme - { "Commentfocus", "CommentFocus" }, // Theme - { "DepthBiasEnable", "DepthBiasEnabled" }, // RDPipelineRasterizationState - { "DragMarginBottom", "DragBottomMargin" }, // Camera2D - { "DragMarginHEnabled", "DragHorizontalEnabled" }, // Camera2D - { "DragMarginLeft", "DragLeftMargin" }, // Camera2D - { "DragMarginRight", "DragRightMargin" }, // Camera2D - { "DragMarginTop", "DragTopMargin" }, // Camera2D - { "DragMarginVEnabled", "DragVerticalEnabled" }, // Camera2D - { "EnabledFocusMode", "FocusMode" }, // BaseButton - Removed - { "ExtraSpacingBottom", "SpacingBottom" }, // Font - { "ExtraSpacingTop", "SpacingTop" }, // Font - { "FocusNeighbourBottom", "FocusNeighborBottom" }, // Control - { "FocusNeighbourLeft", "FocusNeighborLeft" }, // Control - { "FocusNeighbourRight", "FocusNeighborRight" }, // Control - { "FocusNeighbourTop", "FocusNeighborTop" }, // Control - { "FollowViewportEnable", "FollowViewportEnabled" }, // CanvasItem - { "GlobalRateScale", "PlaybackSpeedScale" }, // AudioServer - { "GravityDistanceScale", "GravityPointDistanceScale" }, // Area2D - { "GravityVec", "GravityDirection" }, // Area2D - { "HintTooltip", "TooltipText" }, // Control - { "Hseparation", "HSeparation" }, // Theme - { "IconAlign", "IconAlignment" }, // Button - { "IterationsPerSecond", "PhysicsTicksPerSecond" }, // Engine - { "InvertEnable", "InvertEnabled" }, // Polygon2D - { "MarginBottom", "OffsetBottom" }, // Control broke NinePatchRect, StyleBox - { "MarginLeft", "OffsetLeft" }, // Control broke NinePatchRect, StyleBox - { "MarginRight", "OffsetRight" }, // Control broke NinePatchRect, StyleBox - { "MarginTop", "OffsetTop" }, // Control broke NinePatchRect, StyleBox - { "MidHeight", "Height" }, // CapsuleMesh - { "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D - { "OffsetH", "DragHorizontalOffset" }, // Camera2D - { "OffsetV", "DragVerticalOffset" }, // Camera2D - { "Ofs", "Offset" }, // Theme - { "Oneshot", "OneShot" }, // AnimatedTexture - { "OutOfRangeMode", "MaxPolyphony" }, // AudioStreamPlayer3D - { "PauseMode", "ProcessMode" }, // Node - { "PhysicalScancode", "PhysicalKeycode" }, // InputEventKey - { "PopupExclusive", "Exclusive" }, // Window - { "ProximityFadeEnable", "ProximityFadeEnabled" }, // Material - { "RectPosition", "Position" }, // Control - { "RectGlobalPosition", "GlobalPosition" }, // Control - { "RectSize", "Size" }, // Control - { "RectMinSize", "CustomMinimumSize" }, // Control - { "RectRotation", "Rotation" }, // Control - { "RectScale", "Scale" }, // Control - { "RectPivotOffset", "PivotOffset" }, // Control - { "RectClipContent", "ClipContents" }, // Control - { "RefuseNewNetworkConnections", "RefuseNewConnections" }, // MultiplayerAPI - { "RegionFilterClip", "RegionFilterClipEnabled" }, // Sprite2D - { "ReverbBusEnable", "ReverbBusEnabled" }, // Area3D - { "Selectedframe", "SelectedFrame" }, // Theme - { "SizeOverrideStretch", "Size2dOverrideStretch" }, // SubViewport - { "SlipsOnSlope", "SlideOnSlope" }, // SeparationRayShape2D - { "SmoothingEnabled", "FollowSmoothingEnabled" }, // Camera2D - { "SmoothingSpeed", "FollowSmoothingSpeed" }, // Camera2D - { "SsReflectionsDepthTolerance", "SsrDepthTolerance" }, // Environment - { "SsReflectionsEnabled", "SsrEnabled" }, // Environment - { "SsReflectionsFadeIn", "SsrFadeIn" }, // Environment - { "SsReflectionsFadeOut", "SsrFadeOut" }, // Environment - { "SsReflectionsMaxSteps", "SsrMaxSteps" }, // Environment - { "StateMachineSelectedframe", "StateMachineSelectedFrame" }, // Theme - { "SyntaxHighlighting", "SyntaxHighlighter" }, // TextEdit - { "TabAlign", "TabAlignment" }, // TabContainer - { "TableHseparation", "TableHSeparation" }, // Theme - { "TableVseparation", "TableVSeparation" }, // Theme - { "Translation", "Position" }, // Node3D - broke GLTFNode - { "UnitDb", "VolumeDb" }, // AudioStreamPlayer3D - { "UnitOffset", "ProgressRatio" }, // PathFollow2D, PathFollow3D - { "Vseparation", "VSeparation" }, // Theme - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::gdscript_signals_renames[][2] = { - // {"instantiate","instance"}, // FileSystemDock - // { "hide", "hidden" }, // CanvasItem - function with same name exists - // { "tween_all_completed","loop_finished"}, // Tween - TODO, not sure - // {"changed","settings_changed"}, // EditorSettings - { "about_to_show", "about_to_popup" }, // Popup - { "button_release", "button_released" }, // XRController3D - { "cancelled", "canceled" }, // AcceptDialog - { "item_double_clicked", "item_icon_double_clicked" }, // Tree - { "network_peer_connected", "peer_connected" }, // MultiplayerAPI - { "network_peer_disconnected", "peer_disconnected" }, // MultiplayerAPI - { "network_peer_packet", "peer_packet" }, // MultiplayerAPI - { "node_unselected", "node_deselected" }, // GraphEdit - { "offset_changed", "position_offset_changed" }, // GraphNode - { "settings_changed", "changed" }, // TileMap broke EditorSettings - { "skeleton_updated", "pose_updated" }, // - { "tab_close", "tab_closed" }, // TextEdit - { "tab_hover", "tab_hovered" }, // TextEdit - { "text_entered", "text_submitted" }, // LineEdit - { "tween_completed", "finished" }, // Tween - { "tween_step", "step_finished" }, // Tween - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::csharp_signals_renames[][2] = { - // {"Instantiate","Instance"}, // FileSystemDock - // { "Hide", "Hidden" }, // CanvasItem - function with same name exists - // { "TweenAllCompleted","LoopFinished"}, // Tween - TODO, not sure - // {"Changed","SettingsChanged"}, // EditorSettings - { "AboutToShow", "AboutToPopup" }, // Popup - { "ButtonRelease", "ButtonReleased" }, // XRController3D - { "NetworkPeerConnected", "PeerConnected" }, // MultiplayerAPI - { "NetworkPeerDisconnected", "PeerDisconnected" }, // MultiplayerAPI - { "NetworkPeerPacket", "PeerPacket" }, // MultiplayerAPI - { "NodeUnselected", "NodeDeselected" }, // GraphEdit - { "OffsetChanged", "PositionOffsetChanged" }, // GraphNode - { "SettingsChanged", "Changed" }, // TileMap broke EditorSettings - { "SkeletonUpdated", "PoseUpdated" }, // - { "TabClose", "TabClosed" }, // TextEdit - { "TabHover", "TabHovered" }, // TextEdit - { "TextEntered", "TextSubmitted" }, // LineEdit - { "TweenCompleted", "Finished" }, // Tween - { "TweenStep", "StepFinished" }, // Tween - - { nullptr, nullptr }, - -}; - -const char *ProjectConverter3To4::project_settings_renames[][2] = { - { "audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db" }, - { "audio/channel_disable_time", "audio/buses/channel_disable_time" }, - { "audio/default_bus_layout", "audio/buses/default_bus_layout" }, - { "audio/driver", "audio/driver/driver" }, - { "audio/enable_audio_input", "audio/driver/enable_input" }, - { "audio/mix_rate", "audio/driver/mix_rate" }, - { "audio/output_latency", "audio/driver/output_latency" }, - { "audio/output_latency.web", "audio/driver/output_latency.web" }, - { "audio/video_delay_compensation_ms", "audio/video/video_delay_compensation_ms" }, - { "display/window/vsync/use_vsync", "display/window/vsync/vsync_mode" }, - { "editor/main_run_args", "editor/run/main_run_args" }, - { "gui/common/swap_ok_cancel", "gui/common/swap_cancel_ok" }, - { "network/limits/debugger_stdout/max_chars_per_second", "network/limits/debugger/max_chars_per_second" }, - { "network/limits/debugger_stdout/max_errors_per_second", "network/limits/debugger/max_errors_per_second" }, - { "network/limits/debugger_stdout/max_messages_per_frame", "network/limits/debugger/max_queued_messages" }, - { "network/limits/debugger_stdout/max_warnings_per_second", "network/limits/debugger/max_warnings_per_second" }, - { "network/ssl/certificates", "network/tls/certificate_bundle_override" }, - { "physics/2d/thread_model", "physics/2d/run_on_thread" }, // TODO not sure - { "rendering/environment/default_clear_color", "rendering/environment/defaults/default_clear_color" }, - { "rendering/environment/default_environment", "rendering/environment/defaults/default_environment" }, - { "rendering/quality/depth_prepass/disable_for_vendors", "rendering/driver/depth_prepass/disable_for_vendors" }, - { "rendering/quality/depth_prepass/enable", "rendering/driver/depth_prepass/enable" }, - { "rendering/quality/shading/force_blinn_over_ggx", "rendering/shading/overrides/force_blinn_over_ggx" }, - { "rendering/quality/shading/force_blinn_over_ggx.mobile", "rendering/shading/overrides/force_blinn_over_ggx.mobile" }, - { "rendering/quality/shading/force_lambert_over_burley", "rendering/shading/overrides/force_lambert_over_burley" }, - { "rendering/quality/shading/force_lambert_over_burley.mobile", "rendering/shading/overrides/force_lambert_over_burley.mobile" }, - { "rendering/quality/shading/force_vertex_shading", "rendering/shading/overrides/force_vertex_shading" }, - { "rendering/quality/shading/force_vertex_shading.mobile", "rendering/shading/overrides/force_vertex_shading.mobile" }, - { "rendering/quality/shadow_atlas/quadrant_0_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_0_subdiv" }, - { "rendering/quality/shadow_atlas/quadrant_1_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_1_subdiv" }, - { "rendering/quality/shadow_atlas/quadrant_2_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_2_subdiv" }, - { "rendering/quality/shadow_atlas/quadrant_3_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_3_subdiv" }, - { "rendering/quality/shadow_atlas/size", "rendering/lights_and_shadows/shadow_atlas/size" }, - { "rendering/quality/shadow_atlas/size.mobile", "rendering/lights_and_shadows/shadow_atlas/size.mobile" }, - { "rendering/vram_compression/import_etc2", "rendering/textures/vram_compression/import_etc2_astc" }, - { "rendering/vram_compression/import_s3tc", "rendering/textures/vram_compression/import_s3tc_bptc" }, - { "window/size/width", "window/size/viewport_width" }, - { "window/size/height", "window/size/viewport_height" }, - { "window/size/test_width", "window/size/window_width_override" }, - { "window/size/test_height", "window/size/window_height_override" }, - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::input_map_renames[][2] = { - { ",\"alt\":", ",\"alt_pressed\":" }, - { ",\"shift\":", ",\"shift_pressed\":" }, - { ",\"control\":", ",\"ctrl_pressed\":" }, - { ",\"meta\":", ",\"meta_pressed\":" }, - { ",\"scancode\":", ",\"keycode\":" }, - { ",\"physical_scancode\":", ",\"physical_keycode\":" }, - { ",\"doubleclick\":", ",\"double_click\":" }, - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::builtin_types_renames[][2] = { - { "PoolByteArray", "PackedByteArray" }, - { "PoolColorArray", "PackedColorArray" }, - { "PoolIntArray", "PackedInt32Array" }, - { "PoolRealArray", "PackedFloat32Array" }, - { "PoolStringArray", "PackedStringArray" }, - { "PoolVector2Array", "PackedVector2Array" }, - { "PoolVector3Array", "PackedVector3Array" }, - { "Quat", "Quaternion" }, - { "Transform", "Transform3D" }, - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::shaders_renames[][2] = { - { "ALPHA_SCISSOR", "ALPHA_SCISSOR_THRESHOLD" }, - { "CAMERA_MATRIX", "INV_VIEW_MATRIX" }, - { "INV_CAMERA_MATRIX", "VIEW_MATRIX" }, - { "NORMALMAP", "NORMAL_MAP" }, - { "NORMALMAP_DEPTH", "NORMAL_MAP_DEPTH" }, - { "TRANSMISSION", "BACKLIGHT" }, - { "WORLD_MATRIX", "MODEL_MATRIX" }, - { "depth_draw_alpha_prepass", "depth_draw_opaque" }, - { "hint_albedo", "source_color" }, - { "hint_aniso", "hint_anisotropy" }, - { "hint_black", "hint_default_black" }, - { "hint_black_albedo", "hint_default_black" }, - { "hint_color", "source_color" }, - { "hint_white", "hint_default_white" }, - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::class_renames[][2] = { - // { "BulletPhysicsDirectBodyState", "BulletPhysicsDirectBodyState3D" }, // Class is not visible in ClassDB - // { "BulletPhysicsServer", "BulletPhysicsServer3D" }, // Class is not visible in ClassDB - // { "GDScriptFunctionState", "Node3D" }, // TODO - not sure to which should be changed - // { "GDScriptNativeClass", "Node3D" }, // TODO - not sure to which should be changed - // { "InputDefault",""}, // TODO ? - // { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB - // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB - // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB - // { "NativeScript","GDExtension"}, ?? - { "ARVRAnchor", "XRAnchor3D" }, - { "ARVRCamera", "XRCamera3D" }, - { "ARVRController", "XRController3D" }, - { "ARVRInterface", "XRInterface" }, - { "ARVRInterfaceGDNative", "Node3D" }, - { "ARVROrigin", "XROrigin3D" }, - { "ARVRPositionalTracker", "XRPositionalTracker" }, - { "ARVRServer", "XRServer" }, - { "AStar", "AStar3D" }, - { "AnimatedSprite", "AnimatedSprite2D" }, - { "AnimationTreePlayer", "AnimationTree" }, - { "Area", "Area3D" }, // Be careful, this will be used everywhere - { "AudioStreamOGGVorbis", "AudioStreamOggVorbis" }, - { "AudioStreamRandomPitch", "AudioStreamRandomizer" }, - { "AudioStreamSample", "AudioStreamWAV" }, - { "BakedLightmap", "LightmapGI" }, - { "BakedLightmapData", "LightmapGIData" }, - { "BitmapFont", "FontFile" }, - { "BoneAttachment", "BoneAttachment3D" }, - { "BoxShape", "BoxShape3D" }, - { "CPUParticles", "CPUParticles3D" }, - { "CSGBox", "CSGBox3D" }, - { "CSGCombiner", "CSGCombiner3D" }, - { "CSGCylinder", "CSGCylinder3D" }, - { "CSGMesh", "CSGMesh3D" }, - { "CSGPolygon", "CSGPolygon3D" }, - { "CSGPrimitive", "CSGPrimitive3D" }, - { "CSGShape", "CSGShape3D" }, - { "CSGSphere", "CSGSphere3D" }, - { "CSGTorus", "CSGTorus3D" }, - { "Camera", "Camera3D" }, // Be careful, this will be used everywhere - { "CapsuleShape", "CapsuleShape3D" }, - { "ClippedCamera", "Camera3D" }, - { "CollisionObject", "CollisionObject3D" }, - { "CollisionPolygon", "CollisionPolygon3D" }, - { "CollisionShape", "CollisionShape3D" }, - { "ConcavePolygonShape", "ConcavePolygonShape3D" }, - { "ConeTwistJoint", "ConeTwistJoint3D" }, - { "ConvexPolygonShape", "ConvexPolygonShape3D" }, - { "CubeMap", "Cubemap" }, - { "CubeMesh", "BoxMesh" }, - { "CylinderShape", "CylinderShape3D" }, - { "DirectionalLight", "DirectionalLight3D" }, - { "DynamicFont", "FontFile" }, - { "DynamicFontData", "FontFile" }, - { "EditorNavigationMeshGenerator", "NavigationMeshGenerator" }, - { "EditorSceneImporter", "EditorSceneFormatImporter" }, - { "EditorSceneImporterFBX", "EditorSceneFormatImporterFBX" }, - { "EditorSceneImporterGLTF", "EditorSceneFormatImporterGLTF" }, - { "EditorSpatialGizmo", "EditorNode3DGizmo" }, - { "EditorSpatialGizmoPlugin", "EditorNode3DGizmoPlugin" }, - { "ExternalTexture", "ImageTexture" }, - { "FuncRef", "Callable" }, - { "GIProbe", "VoxelGI" }, - { "GIProbeData", "VoxelGIData" }, - { "Generic6DOFJoint", "Generic6DOFJoint3D" }, - { "Geometry", "Geometry2D" }, // Geometry class is split between Geometry2D and Geometry3D so we need to choose one - { "GeometryInstance", "GeometryInstance3D" }, - { "GradientTexture", "GradientTexture2D" }, - { "HeightMapShape", "HeightMapShape3D" }, - { "HingeJoint", "HingeJoint3D" }, - { "IP_Unix", "IPUnix" }, - { "ImmediateGeometry", "ImmediateMesh" }, - { "ImmediateGeometry3D", "ImmediateMesh" }, - { "InterpolatedCamera", "Camera3D" }, - { "InterpolatedCamera3D", "Camera3D" }, - { "JSONParseResult", "JSON" }, - { "Joint", "Joint3D" }, - { "KinematicBody", "CharacterBody3D" }, - { "KinematicBody2D", "CharacterBody2D" }, - { "KinematicCollision", "KinematicCollision3D" }, - { "LargeTexture", "ImageTexture" }, - { "Light", "Light3D" }, - { "Light2D", "PointLight2D" }, - { "LineShape2D", "WorldBoundaryShape2D" }, - { "Listener", "AudioListener3D" }, - { "Listener2D", "AudioListener2D" }, - { "MeshInstance", "MeshInstance3D" }, - { "MultiMeshInstance", "MultiMeshInstance3D" }, - { "MultiplayerPeerGDNative", "MultiplayerPeerExtension" }, - { "Navigation", "Node3D" }, - { "Navigation2D", "Node2D" }, - { "Navigation2DServer", "NavigationServer2D" }, - { "Navigation3D", "Node3D" }, - { "NavigationAgent", "NavigationAgent3D" }, - { "NavigationMeshInstance", "NavigationRegion3D" }, - { "NavigationObstacle", "NavigationObstacle3D" }, - { "NavigationPolygonInstance", "NavigationRegion2D" }, - { "NavigationRegion", "NavigationRegion3D" }, - { "NavigationServer", "NavigationServer3D" }, - { "NetworkedMultiplayerENet", "ENetMultiplayerPeer" }, - { "NetworkedMultiplayerPeer", "MultiplayerPeer" }, - { "Occluder", "OccluderInstance3D" }, - { "OmniLight", "OmniLight3D" }, - { "PHashTranslation", "OptimizedTranslation" }, - { "PacketPeerGDNative", "PacketPeerExtension" }, - { "PanoramaSky", "Sky" }, - { "Particles", "GPUParticles3D" }, // Be careful, this will be used everywhere - { "Particles2D", "GPUParticles2D" }, - { "ParticlesMaterial", "ParticleProcessMaterial" }, - { "Path", "Path3D" }, // Be careful, this will be used everywhere - { "PathFollow", "PathFollow3D" }, - { "PhysicalBone", "PhysicalBone3D" }, - { "Physics2DDirectBodyState", "PhysicsDirectBodyState2D" }, - { "Physics2DDirectSpaceState", "PhysicsDirectSpaceState2D" }, - { "Physics2DServer", "PhysicsServer2D" }, - { "Physics2DServerSW", "GodotPhysicsServer2D" }, - { "Physics2DShapeQueryParameters", "PhysicsShapeQueryParameters2D" }, - { "Physics2DTestMotionResult", "PhysicsTestMotionResult2D" }, - { "PhysicsBody", "PhysicsBody3D" }, - { "PhysicsDirectBodyState", "PhysicsDirectBodyState3D" }, - { "PhysicsDirectSpaceState", "PhysicsDirectSpaceState3D" }, - { "PhysicsServer", "PhysicsServer3D" }, - { "PhysicsShapeQueryParameters", "PhysicsShapeQueryParameters3D" }, - { "PhysicsTestMotionResult", "PhysicsTestMotionResult3D" }, - { "PinJoint", "PinJoint3D" }, - { "PlaneShape", "WorldBoundaryShape3D" }, - { "PopupDialog", "Popup" }, - { "Position2D", "Marker2D" }, - { "Position3D", "Marker3D" }, - { "ProceduralSky", "Sky" }, - { "RayCast", "RayCast3D" }, - { "RayShape", "SeparationRayShape3D" }, - { "RayShape2D", "SeparationRayShape2D" }, - { "Reference", "RefCounted" }, // Be careful, this will be used everywhere - { "RemoteTransform", "RemoteTransform3D" }, - { "ResourceInteractiveLoader", "ResourceLoader" }, - { "RigidBody", "RigidBody3D" }, - { "SceneTreeTween", "Tween" }, - { "Shape", "Shape3D" }, // Be careful, this will be used everywhere - { "ShortCut", "Shortcut" }, - { "Skeleton", "Skeleton3D" }, - { "SkeletonIK", "SkeletonIK3D" }, - { "SliderJoint", "SliderJoint3D" }, - { "SoftBody", "SoftBody3D" }, - { "Spatial", "Node3D" }, - { "SpatialGizmo", "Node3DGizmo" }, - { "SpatialMaterial", "StandardMaterial3D" }, - { "SphereShape", "SphereShape3D" }, - { "SpotLight", "SpotLight3D" }, - { "SpringArm", "SpringArm3D" }, - { "Sprite", "Sprite2D" }, - { "StaticBody", "StaticBody3D" }, - { "StreamCubemap", "CompressedCubemap" }, - { "StreamCubemapArray", "CompressedCubemapArray" }, - { "StreamPeerGDNative", "StreamPeerExtension" }, - { "StreamPeerSSL", "StreamPeerTLS" }, - { "StreamTexture", "CompressedTexture2D" }, - { "StreamTexture2D", "CompressedTexture2D" }, - { "StreamTexture2DArray", "CompressedTexture2DArray" }, - { "StreamTextureLayered", "CompressedTextureLayered" }, - { "TCP_Server", "TCPServer" }, - { "Tabs", "TabBar" }, // Be careful, this will be used everywhere - { "TextFile", "Node3D" }, - { "Texture", "Texture2D" }, // May broke TextureRect - { "TextureArray", "Texture2DArray" }, - { "TextureProgress", "TextureProgressBar" }, - { "ToolButton", "Button" }, - { "VehicleBody", "VehicleBody3D" }, - { "VehicleWheel", "VehicleWheel3D" }, - { "VideoPlayer", "VideoStreamPlayer" }, - { "Viewport", "SubViewport" }, - { "ViewportContainer", "SubViewportContainer" }, - { "VisibilityEnabler", "VisibleOnScreenEnabler3D" }, - { "VisibilityEnabler2D", "VisibleOnScreenEnabler2D" }, - { "VisibilityNotifier", "VisibleOnScreenNotifier3D" }, - { "VisibilityNotifier2D", "VisibleOnScreenNotifier2D" }, - { "VisibilityNotifier3D", "VisibleOnScreenNotifier3D" }, - { "VisualInstance", "VisualInstance3D" }, - { "VisualServer", "RenderingServer" }, - { "VisualShaderNodeCubeMap", "VisualShaderNodeCubemap" }, - { "VisualShaderNodeScalarClamp", "VisualShaderNodeClamp" }, - { "VisualShaderNodeScalarConstant", "VisualShaderNodeFloatConstant" }, - { "VisualShaderNodeScalarFunc", "VisualShaderNodeFloatFunc" }, - { "VisualShaderNodeScalarInterp", "VisualShaderNodeMix" }, - { "VisualShaderNodeScalarOp", "VisualShaderNodeFloatOp" }, - { "VisualShaderNodeScalarSmoothStep", "VisualShaderNodeSmoothStep" }, - { "VisualShaderNodeScalarSwitch", "VisualShaderNodeSwitch" }, - { "VisualShaderNodeScalarTransformMult", "VisualShaderNodeTransformOp" }, - { "VisualShaderNodeTransformMult", "VisualShaderNode" }, - { "VisualShaderNodeVectorClamp", "VisualShaderNodeClamp" }, - { "VisualShaderNodeVectorInterp", "VisualShaderNodeMix" }, - { "VisualShaderNodeVectorScalarMix", "VisualShaderNodeMix" }, - { "VisualShaderNodeVectorScalarSmoothStep", "VisualShaderNodeSmoothStep" }, - { "VisualShaderNodeVectorScalarStep", "VisualShaderNodeStep" }, - { "VisualShaderNodeVectorSmoothStep", "VisualShaderNodeSmoothStep" }, - { "VisualShaderNodeBooleanUniform", "VisualShaderNodeBooleanParameter" }, - { "VisualShaderNodeColorUniform", "VisualShaderNodeColorParameter" }, - { "VisualShaderNodeScalarUniform", "VisualShaderNodeFloatParameter" }, - { "VisualShaderNodeCubemapUniform", "VisualShaderNodeCubemapParameter" }, - { "VisualShaderNodeTextureUniform", "VisualShaderNodeTexture2DParameter" }, - { "VisualShaderNodeTextureUniformTriplanar", "VisualShaderNodeTextureParameterTriplanar" }, - { "VisualShaderNodeTransformUniform", "VisualShaderNodeTransformParameter" }, - { "VisualShaderNodeVec3Uniform", "VisualShaderNodeVec3Parameter" }, - { "VisualShaderNodeUniform", "VisualShaderNodeParameter" }, - { "VisualShaderNodeUniformRef", "VisualShaderNodeParameterRef" }, - { "WebRTCDataChannelGDNative", "WebRTCDataChannelExtension" }, - { "WebRTCMultiplayer", "WebRTCMultiplayerPeer" }, - { "WebRTCPeerConnectionGDNative", "WebRTCPeerConnectionExtension" }, - { "WindowDialog", "Window" }, - { "World", "World3D" }, // Be careful, this will be used everywhere - { "XRAnchor", "XRAnchor3D" }, - { "XRController", "XRController3D" }, - { "XROrigin", "XROrigin3D" }, - { "YSort", "Node2D" }, - - { "CullInstance", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x - { "RoomGroup", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x - { "Room", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x - { "RoomManager", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x - { "Portal", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x - - { nullptr, nullptr }, -}; - -const char *ProjectConverter3To4::ProjectConverter3To4::color_renames[][2] = { - { "aliceblue", "ALICE_BLUE" }, - { "antiquewhite", "ANTIQUE_WHITE" }, - { "aqua", "AQUA" }, - { "aquamarine", "AQUAMARINE" }, - { "azure", "AZURE" }, - { "beige", "BEIGE" }, - { "bisque", "BISQUE" }, - { "black", "BLACK" }, - { "blanchedalmond", "BLANCHED_ALMOND" }, - { "blue", "BLUE" }, - { "blueviolet", "BLUE_VIOLET" }, - { "brown", "BROWN" }, - { "burlywood", "BURLYWOOD" }, - { "cadetblue", "CADET_BLUE" }, - { "chartreuse", "CHARTREUSE" }, - { "chocolate", "CHOCOLATE" }, - { "coral", "CORAL" }, - { "cornflowerblue", "CORNFLOWER_BLUE" }, - { "cornsilk", "CORNSILK" }, - { "crimson", "CRIMSON" }, - { "cyan", "CYAN" }, - { "darkblue", "DARK_BLUE" }, - { "darkcyan", "DARK_CYAN" }, - { "darkgoldenrod", "DARK_GOLDENROD" }, - { "darkgray", "DARK_GRAY" }, - { "darkgreen", "DARK_GREEN" }, - { "darkkhaki", "DARK_KHAKI" }, - { "darkmagenta", "DARK_MAGENTA" }, - { "darkolivegreen", "DARK_OLIVE_GREEN" }, - { "darkorange", "DARK_ORANGE" }, - { "darkorchid", "DARK_ORCHID" }, - { "darkred", "DARK_RED" }, - { "darksalmon", "DARK_SALMON" }, - { "darkseagreen", "DARK_SEA_GREEN" }, - { "darkslateblue", "DARK_SLATE_BLUE" }, - { "darkslategray", "DARK_SLATE_GRAY" }, - { "darkturquoise", "DARK_TURQUOISE" }, - { "darkviolet", "DARK_VIOLET" }, - { "deeppink", "DEEP_PINK" }, - { "deepskyblue", "DEEP_SKY_BLUE" }, - { "dimgray", "DIM_GRAY" }, - { "dodgerblue", "DODGER_BLUE" }, - { "firebrick", "FIREBRICK" }, - { "floralwhite", "FLORAL_WHITE" }, - { "forestgreen", "FOREST_GREEN" }, - { "fuchsia", "FUCHSIA" }, - { "gainsboro", "GAINSBORO" }, - { "ghostwhite", "GHOST_WHITE" }, - { "gold", "GOLD" }, - { "goldenrod", "GOLDENROD" }, - { "gray", "GRAY" }, - { "green", "GREEN" }, - { "greenyellow", "GREEN_YELLOW" }, - { "honeydew", "HONEYDEW" }, - { "hotpink", "HOT_PINK" }, - { "indianred", "INDIAN_RED" }, - { "indigo", "INDIGO" }, - { "ivory", "IVORY" }, - { "khaki", "KHAKI" }, - { "lavender", "LAVENDER" }, - { "lavenderblush", "LAVENDER_BLUSH" }, - { "lawngreen", "LAWN_GREEN" }, - { "lemonchiffon", "LEMON_CHIFFON" }, - { "lightblue", "LIGHT_BLUE" }, - { "lightcoral", "LIGHT_CORAL" }, - { "lightcyan", "LIGHT_CYAN" }, - { "lightgoldenrod", "LIGHT_GOLDENROD" }, - { "lightgray", "LIGHT_GRAY" }, - { "lightgreen", "LIGHT_GREEN" }, - { "lightpink", "LIGHT_PINK" }, - { "lightsalmon", "LIGHT_SALMON" }, - { "lightseagreen", "LIGHT_SEA_GREEN" }, - { "lightskyblue", "LIGHT_SKY_BLUE" }, - { "lightslategray", "LIGHT_SLATE_GRAY" }, - { "lightsteelblue", "LIGHT_STEEL_BLUE" }, - { "lightyellow", "LIGHT_YELLOW" }, - { "lime", "LIME" }, - { "limegreen", "LIME_GREEN" }, - { "linen", "LINEN" }, - { "magenta", "MAGENTA" }, - { "maroon", "MAROON" }, - { "mediumaquamarine", "MEDIUM_AQUAMARINE" }, - { "mediumblue", "MEDIUM_BLUE" }, - { "mediumorchid", "MEDIUM_ORCHID" }, - { "mediumpurple", "MEDIUM_PURPLE" }, - { "mediumseagreen", "MEDIUM_SEA_GREEN" }, - { "mediumslateblue", "MEDIUM_SLATE_BLUE" }, - { "mediumspringgreen", "MEDIUM_SPRING_GREEN" }, - { "mediumturquoise", "MEDIUM_TURQUOISE" }, - { "mediumvioletred", "MEDIUM_VIOLET_RED" }, - { "midnightblue", "MIDNIGHT_BLUE" }, - { "mintcream", "MINT_CREAM" }, - { "mistyrose", "MISTY_ROSE" }, - { "moccasin", "MOCCASIN" }, - { "navajowhite", "NAVAJO_WHITE" }, - { "navyblue", "NAVY_BLUE" }, - { "oldlace", "OLD_LACE" }, - { "olive", "OLIVE" }, - { "olivedrab", "OLIVE_DRAB" }, - { "orange", "ORANGE" }, - { "orangered", "ORANGE_RED" }, - { "orchid", "ORCHID" }, - { "palegoldenrod", "PALE_GOLDENROD" }, - { "palegreen", "PALE_GREEN" }, - { "paleturquoise", "PALE_TURQUOISE" }, - { "palevioletred", "PALE_VIOLET_RED" }, - { "papayawhip", "PAPAYA_WHIP" }, - { "peachpuff", "PEACH_PUFF" }, - { "peru", "PERU" }, - { "pink", "PINK" }, - { "plum", "PLUM" }, - { "powderblue", "POWDER_BLUE" }, - { "purple", "PURPLE" }, - { "rebeccapurple", "REBECCA_PURPLE" }, - { "red", "RED" }, - { "rosybrown", "ROSY_BROWN" }, - { "royalblue", "ROYAL_BLUE" }, - { "saddlebrown", "SADDLE_BROWN" }, - { "salmon", "SALMON" }, - { "sandybrown", "SANDY_BROWN" }, - { "seagreen", "SEA_GREEN" }, - { "seashell", "SEASHELL" }, - { "sienna", "SIENNA" }, - { "silver", "SILVER" }, - { "skyblue", "SKY_BLUE" }, - { "slateblue", "SLATE_BLUE" }, - { "slategray", "SLATE_GRAY" }, - { "snow", "SNOW" }, - { "springgreen", "SPRING_GREEN" }, - { "steelblue", "STEEL_BLUE" }, - { "tan", "TAN" }, - { "teal", "TEAL" }, - { "thistle", "THISTLE" }, - { "tomato", "TOMATO" }, - { "transparent", "TRANSPARENT" }, - { "turquoise", "TURQUOISE" }, - { "violet", "VIOLET" }, - { "webgray", "WEB_GRAY" }, - { "webgreen", "WEB_GREEN" }, - { "webmaroon", "WEB_MAROON" }, - { "webpurple", "WEB_PURPLE" }, - { "wheat", "WHEAT" }, - { "white", "WHITE" }, - { "whitesmoke", "WHITE_SMOKE" }, - { "yellow", "YELLOW" }, - { "yellowgreen", "YELLOW_GREEN" }, - - { nullptr, nullptr }, -}; +#include "editor/renames_map_3_to_4.h" +#include "modules/regex/regex.h" // Find "OS.set_property(x)", capturing x into $1. static String make_regex_gds_os_property_set(String name_set) { @@ -1928,70 +166,71 @@ public: // Common. { // Enum. - for (unsigned int current_index = 0; enum_renames[current_index][0]; current_index++) { - enum_regexes.push_back(memnew(RegEx(String("\\b") + enum_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::enum_renames[current_index][0]; current_index++) { + enum_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::enum_renames[current_index][0] + "\\b"))); } // GDScript functions. - for (unsigned int current_index = 0; gdscript_function_renames[current_index][0]; current_index++) { - gdscript_function_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_function_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::gdscript_function_renames[current_index][0]; current_index++) { + gdscript_function_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_function_renames[current_index][0] + "\\b"))); } // Project Settings. - for (unsigned int current_index = 0; project_settings_renames[current_index][0]; current_index++) { - project_settings_regexes.push_back(memnew(RegEx(String("\\b") + project_settings_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::project_settings_renames[current_index][0]; current_index++) { + project_settings_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::project_settings_renames[current_index][0] + "\\b"))); } // Input Map. - for (unsigned int current_index = 0; input_map_renames[current_index][0]; current_index++) { - input_map_regexes.push_back(memnew(RegEx(String("\\b") + input_map_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::input_map_renames[current_index][0]; current_index++) { + input_map_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::input_map_renames[current_index][0] + "\\b"))); } // GDScript properties. - for (unsigned int current_index = 0; gdscript_properties_renames[current_index][0]; current_index++) { - gdscript_properties_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_properties_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::gdscript_properties_renames[current_index][0]; current_index++) { + gdscript_properties_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_properties_renames[current_index][0] + "\\b"))); } // GDScript Signals. - for (unsigned int current_index = 0; gdscript_signals_renames[current_index][0]; current_index++) { - gdscript_signals_regexes.push_back(memnew(RegEx(String("\\b") + gdscript_signals_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::gdscript_signals_renames[current_index][0]; current_index++) { + gdscript_signals_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::gdscript_signals_renames[current_index][0] + "\\b"))); } // Shaders. - for (unsigned int current_index = 0; shaders_renames[current_index][0]; current_index++) { - shaders_regexes.push_back(memnew(RegEx(String("\\b") + shaders_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::shaders_renames[current_index][0]; current_index++) { + shaders_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::shaders_renames[current_index][0] + "\\b"))); } // Builtin types. - for (unsigned int current_index = 0; builtin_types_renames[current_index][0]; current_index++) { - builtin_types_regexes.push_back(memnew(RegEx(String("\\b") + builtin_types_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::builtin_types_renames[current_index][0]; current_index++) { + builtin_types_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::builtin_types_renames[current_index][0] + "\\b"))); } // CSharp function renames. - for (unsigned int current_index = 0; csharp_function_renames[current_index][0]; current_index++) { - csharp_function_regexes.push_back(memnew(RegEx(String("\\b") + csharp_function_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::csharp_function_renames[current_index][0]; current_index++) { + csharp_function_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_function_renames[current_index][0] + "\\b"))); } // CSharp properties renames. - for (unsigned int current_index = 0; csharp_properties_renames[current_index][0]; current_index++) { - csharp_properties_regexes.push_back(memnew(RegEx(String("\\b") + csharp_properties_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::csharp_properties_renames[current_index][0]; current_index++) { + csharp_properties_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_properties_renames[current_index][0] + "\\b"))); } // CSharp signals renames. - for (unsigned int current_index = 0; csharp_signals_renames[current_index][0]; current_index++) { - csharp_signal_regexes.push_back(memnew(RegEx(String("\\b") + csharp_signals_renames[current_index][0] + "\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::csharp_signals_renames[current_index][0]; current_index++) { + csharp_signal_regexes.push_back(memnew(RegEx(String("\\b") + RenamesMap3To4::csharp_signals_renames[current_index][0] + "\\b"))); } } // Colors. { - for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) { - color_regexes.push_back(memnew(RegEx(String("\\bColor.") + color_renames[current_index][0] + "\\b"))); - color_renamed.push_back(String("Color.") + color_renames[current_index][1]); + for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) { + color_regexes.push_back(memnew(RegEx(String("\\bColor.") + RenamesMap3To4::color_renames[current_index][0] + "\\b"))); + color_renamed.push_back(String("Color.") + RenamesMap3To4::color_renames[current_index][1]); } } // Classes. { - for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { - class_tscn_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".tscn\\b"))); - class_gd_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".gd\\b"))); - class_shader_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + ".shader\\b"))); + for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) { + const String class_name = RenamesMap3To4::class_renames[current_index][0]; + class_tscn_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".tscn\\b"))); + class_gd_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".gd\\b"))); + class_shader_regexes.push_back(memnew(RegEx(String("\\b") + class_name + ".shader\\b"))); - class_regexes.push_back(memnew(RegEx(String("\\b") + class_renames[current_index][0] + "\\b"))); + class_regexes.push_back(memnew(RegEx(String("\\b") + class_name + "\\b"))); - class_temp_tscn_renames.push_back(String(class_renames[current_index][0]) + ".tscn"); - class_temp_gd_renames.push_back(String(class_renames[current_index][0]) + ".gd"); - class_temp_shader_renames.push_back(String(class_renames[current_index][0]) + ".shader"); + class_temp_tscn_renames.push_back(class_name + ".tscn"); + class_temp_gd_renames.push_back(class_name + ".gd"); + class_temp_shader_renames.push_back(class_name + ".shader"); } } } @@ -2047,7 +286,7 @@ ProjectConverter3To4::ProjectConverter3To4(int p_maximum_file_size_kb, int p_max } // Function responsible for converting project. -int ProjectConverter3To4::convert() { +bool ProjectConverter3To4::convert() { print_line("Starting conversion."); uint64_t conversion_start_time = Time::get_singleton()->get_ticks_msec(); @@ -2056,8 +295,8 @@ int ProjectConverter3To4::convert() { int cached_maximum_line_length = maximum_line_length; maximum_line_length = 10000; // Use only for tests bigger value, to not break them. - ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); - ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); + ERR_FAIL_COND_V_MSG(!test_array_names(), false, "Cannot start converting due to problems with data in arrays."); + ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), false, "Cannot start converting due to problems with converting arrays."); maximum_line_length = cached_maximum_line_length; @@ -2066,16 +305,16 @@ int ProjectConverter3To4::convert() { { String converter_text = "; Project was converted by built-in tool to Godot 4.0"; - ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current working directory doesn't contain a \"project.godot\" file for a Godot 3 project."); + ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), false, "Current working directory doesn't contain a \"project.godot\" file for a Godot 3 project."); Error err = OK; String project_godot_content = FileAccess::get_file_as_string("project.godot", &err); - ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Unable to read \"project.godot\"."); - ERR_FAIL_COND_V_MSG(project_godot_content.contains(converter_text), ERROR_CODE, "Project was already converted with this tool."); + ERR_FAIL_COND_V_MSG(err != OK, false, "Unable to read \"project.godot\"."); + ERR_FAIL_COND_V_MSG(project_godot_content.contains(converter_text), false, "Project was already converted with this tool."); Ref<FileAccess> file = FileAccess::open("project.godot", FileAccess::WRITE); - ERR_FAIL_COND_V_MSG(file.is_null(), ERROR_CODE, "Unable to open \"project.godot\"."); + ERR_FAIL_COND_V_MSG(file.is_null(), false, "Unable to open \"project.godot\"."); file->store_string(converter_text + "\n" + project_godot_content); } @@ -2116,59 +355,59 @@ int ProjectConverter3To4::convert() { if (file_name.ends_with(".gd")) { rename_classes(lines, reg_container); // Using only specialized function. - rename_common(enum_renames, reg_container.enum_regexes, lines); + rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines); rename_colors(lines, reg_container); // Require to additional rename. - rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines); + rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines); rename_gdscript_functions(lines, reg_container, false); // Require to additional rename. - rename_common(project_settings_renames, reg_container.project_settings_regexes, lines); + rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines); rename_gdscript_keywords(lines, reg_container); - rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines); - rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines); - rename_common(shaders_renames, reg_container.shaders_regexes, lines); - rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); + rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines); + rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines); + rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines); + rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines); custom_rename(lines, "\\.shader", ".gdshader"); } else if (file_name.ends_with(".tscn")) { rename_classes(lines, reg_container); // Using only specialized function. - rename_common(enum_renames, reg_container.enum_regexes, lines); + rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines); rename_colors(lines, reg_container); // Require to do additional renames. - rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines); + rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines); rename_gdscript_functions(lines, reg_container, true); // Require to do additional renames. - rename_common(project_settings_renames, reg_container.project_settings_regexes, lines); + rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines); rename_gdscript_keywords(lines, reg_container); - rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines); - rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines); - rename_common(shaders_renames, reg_container.shaders_regexes, lines); - rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); + rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines); + rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines); + rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines); + rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines); custom_rename(lines, "\\.shader", ".gdshader"); } else if (file_name.ends_with(".cs")) { // TODO, C# should use different methods. rename_classes(lines, reg_container); // Using only specialized function. - rename_common(csharp_function_renames, reg_container.csharp_function_regexes, lines); - rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); - rename_common(csharp_properties_renames, reg_container.csharp_properties_regexes, lines); - rename_common(csharp_signals_renames, reg_container.csharp_signal_regexes, lines); + rename_common(RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, lines); + rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines); + rename_common(RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, lines); + rename_common(RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, lines); rename_csharp_functions(lines, reg_container); rename_csharp_attributes(lines, reg_container); custom_rename(lines, "public class ", "public partial class "); } else if (file_name.ends_with(".gdshader") || file_name.ends_with(".shader")) { - rename_common(shaders_renames, reg_container.shaders_regexes, lines); + rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines); } else if (file_name.ends_with("tres")) { rename_classes(lines, reg_container); // Using only specialized function. - rename_common(shaders_renames, reg_container.shaders_regexes, lines); - rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); + rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines); + rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines); custom_rename(lines, "\\.shader", ".gdshader"); } else if (file_name.ends_with("project.godot")) { - rename_common(project_settings_renames, reg_container.project_settings_regexes, lines); - rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines); - rename_common(input_map_renames, reg_container.input_map_regexes, lines); + rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines); + rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines); + rename_common(RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, lines); } else if (file_name.ends_with(".csproj")) { // TODO } else { @@ -2216,11 +455,11 @@ int ProjectConverter3To4::convert() { print_line(vformat("Conversion ended - all files(%d), converted files: (%d), not converted files: (%d).", collected_files.size(), converted_files, collected_files.size() - converted_files)); uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec(); print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0)); - return 0; -}; + return true; +} // Function responsible for validating project conversion. -int ProjectConverter3To4::validate_conversion() { +bool ProjectConverter3To4::validate_conversion() { print_line("Starting checking if project conversion can be done."); uint64_t conversion_start_time = Time::get_singleton()->get_ticks_msec(); @@ -2229,8 +468,8 @@ int ProjectConverter3To4::validate_conversion() { int cached_maximum_line_length = maximum_line_length; maximum_line_length = 10000; // To avoid breaking the tests, only use this for the their larger value. - ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); - ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); + ERR_FAIL_COND_V_MSG(!test_array_names(), false, "Cannot start converting due to problems with data in arrays."); + ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), false, "Cannot start converting due to problems with converting arrays."); maximum_line_length = cached_maximum_line_length; @@ -2239,13 +478,13 @@ int ProjectConverter3To4::validate_conversion() { { String conventer_text = "; Project was converted by built-in tool to Godot 4.0"; - ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), ERROR_CODE, "Current directory doesn't contains any Godot 3 project"); + ERR_FAIL_COND_V_MSG(!FileAccess::exists("project.godot"), false, "Current directory doesn't contains any Godot 3 project"); Error err = OK; String project_godot_content = FileAccess::get_file_as_string("project.godot", &err); - ERR_FAIL_COND_V_MSG(err != OK, ERROR_CODE, "Failed to read content of \"project.godot\" file."); - ERR_FAIL_COND_V_MSG(project_godot_content.contains(conventer_text), ERROR_CODE, "Project already was converted with this tool."); + ERR_FAIL_COND_V_MSG(err != OK, false, "Failed to read content of \"project.godot\" file."); + ERR_FAIL_COND_V_MSG(project_godot_content.contains(conventer_text), false, "Project already was converted with this tool."); } Vector<String> collected_files = check_for_files(); @@ -2282,59 +521,59 @@ int ProjectConverter3To4::validate_conversion() { if (file_name.ends_with(".gd")) { changed_elements.append_array(check_for_rename_classes(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(enum_renames, reg_container.enum_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines)); changed_elements.append_array(check_for_rename_colors(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines)); changed_elements.append_array(check_for_rename_gdscript_functions(lines, reg_container, false)); - changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines)); changed_elements.append_array(check_for_rename_gdscript_keywords(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines)); - changed_elements.append_array(check_for_rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines)); - changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines)); - changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines)); changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader")); } else if (file_name.ends_with(".tscn")) { changed_elements.append_array(check_for_rename_classes(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(enum_renames, reg_container.enum_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::enum_renames, reg_container.enum_regexes, lines)); changed_elements.append_array(check_for_rename_colors(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(gdscript_function_renames, reg_container.gdscript_function_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, lines)); changed_elements.append_array(check_for_rename_gdscript_functions(lines, reg_container, true)); - changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines)); changed_elements.append_array(check_for_rename_gdscript_keywords(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines)); - changed_elements.append_array(check_for_rename_common(gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines)); - changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines)); - changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines)); changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader")); } else if (file_name.ends_with(".cs")) { changed_elements.append_array(check_for_rename_classes(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(csharp_function_renames, reg_container.csharp_function_regexes, lines)); - changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines)); - changed_elements.append_array(check_for_rename_common(csharp_properties_renames, reg_container.csharp_properties_regexes, lines)); - changed_elements.append_array(check_for_rename_common(csharp_signals_renames, reg_container.csharp_signal_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, lines)); changed_elements.append_array(check_for_rename_csharp_functions(lines, reg_container)); changed_elements.append_array(check_for_rename_csharp_attributes(lines, reg_container)); changed_elements.append_array(check_for_custom_rename(lines, "public class ", "public partial class ")); } else if (file_name.ends_with(".gdshader") || file_name.ends_with(".shader")) { - changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines)); } else if (file_name.ends_with("tres")) { changed_elements.append_array(check_for_rename_classes(lines, reg_container)); - changed_elements.append_array(check_for_rename_common(shaders_renames, reg_container.shaders_regexes, lines)); - changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines)); changed_elements.append_array(check_for_custom_rename(lines, "\\.shader", ".gdshader")); } else if (file_name.ends_with("project.godot")) { - changed_elements.append_array(check_for_rename_common(project_settings_renames, reg_container.project_settings_regexes, lines)); - changed_elements.append_array(check_for_rename_common(builtin_types_renames, reg_container.builtin_types_regexes, lines)); - changed_elements.append_array(check_for_rename_common(input_map_renames, reg_container.input_map_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, lines)); + changed_elements.append_array(check_for_rename_common(RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, lines)); } else if (file_name.ends_with(".csproj")) { // TODO } else { @@ -2375,7 +614,7 @@ int ProjectConverter3To4::validate_conversion() { print_line(vformat("Checking for valid conversion ended - all files(%d), files which would be converted(%d), files which would not be converted(%d).", collected_files.size(), converted_files, collected_files.size() - converted_files)); uint64_t conversion_end_time = Time::get_singleton()->get_ticks_msec(); print_line(vformat("Conversion of all files took %10.3f seconds.", (conversion_end_time - conversion_start_time) / 1000.0)); - return 0; + return true; } // Collect files which will be checked, excluding ".txt", ".mp4", ".wav" etc. files. @@ -2453,27 +692,27 @@ bool ProjectConverter3To4::test_conversion_basic(String name, String expected, c bool ProjectConverter3To4::test_conversion(RegExContainer ®_container) { bool valid = true; - valid = valid && test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", enum_renames, reg_container.enum_regexes, "enum"); + valid = valid && test_conversion_basic("TYPE_REAL", "TYPE_FLOAT", RenamesMap3To4::enum_renames, reg_container.enum_regexes, "enum"); - valid = valid && test_conversion_basic("can_instance", "can_instantiate", gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function"); + valid = valid && test_conversion_basic("can_instance", "can_instantiate", RenamesMap3To4::gdscript_function_renames, reg_container.gdscript_function_regexes, "gdscript function"); - valid = valid && test_conversion_basic("CanInstance", "CanInstantiate", csharp_function_renames, reg_container.csharp_function_regexes, "csharp function"); + valid = valid && test_conversion_basic("CanInstance", "CanInstantiate", RenamesMap3To4::csharp_function_renames, reg_container.csharp_function_regexes, "csharp function"); - valid = valid && test_conversion_basic("translation", "position", gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property"); + valid = valid && test_conversion_basic("translation", "position", RenamesMap3To4::gdscript_properties_renames, reg_container.gdscript_properties_regexes, "gdscript property"); - valid = valid && test_conversion_basic("Translation", "Position", csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property"); + valid = valid && test_conversion_basic("Translation", "Position", RenamesMap3To4::csharp_properties_renames, reg_container.csharp_properties_regexes, "csharp property"); - valid = valid && test_conversion_basic("NORMALMAP", "NORMAL_MAP", shaders_renames, reg_container.shaders_regexes, "shader"); + valid = valid && test_conversion_basic("NORMALMAP", "NORMAL_MAP", RenamesMap3To4::shaders_renames, reg_container.shaders_regexes, "shader"); - valid = valid && test_conversion_basic("text_entered", "text_submitted", gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal"); + valid = valid && test_conversion_basic("text_entered", "text_submitted", RenamesMap3To4::gdscript_signals_renames, reg_container.gdscript_signals_regexes, "gdscript signal"); - valid = valid && test_conversion_basic("TextEntered", "TextSubmitted", csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal"); + valid = valid && test_conversion_basic("TextEntered", "TextSubmitted", RenamesMap3To4::csharp_signals_renames, reg_container.csharp_signal_regexes, "csharp signal"); - valid = valid && test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", project_settings_renames, reg_container.project_settings_regexes, "project setting"); + valid = valid && test_conversion_basic("audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db", RenamesMap3To4::project_settings_renames, reg_container.project_settings_regexes, "project setting"); - valid = valid && test_conversion_basic("\"device\":-1,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"doubleclick\":false,\"scancode\":0,\"physical_scancode\":16777254,\"script\":null", "\"device\":-1,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"double_click\":false,\"keycode\":0,\"physical_keycode\":16777254,\"script\":null", input_map_renames, reg_container.input_map_regexes, "input map"); + valid = valid && test_conversion_basic("\"device\":-1,\"alt\":false,\"shift\":false,\"control\":false,\"meta\":false,\"doubleclick\":false,\"scancode\":0,\"physical_scancode\":16777254,\"script\":null", "\"device\":-1,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"double_click\":false,\"keycode\":0,\"physical_keycode\":16777254,\"script\":null", RenamesMap3To4::input_map_renames, reg_container.input_map_regexes, "input map"); - valid = valid && test_conversion_basic("Transform", "Transform3D", builtin_types_renames, reg_container.builtin_types_regexes, "builtin type"); + valid = valid && test_conversion_basic("Transform", "Transform3D", RenamesMap3To4::builtin_types_renames, reg_container.builtin_types_regexes, "builtin type"); // Custom Renames. @@ -2787,9 +1026,9 @@ bool ProjectConverter3To4::test_array_names() { // Validate if all classes are valid. { - for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { - const String old_class = class_renames[current_index][0]; - const String new_class = class_renames[current_index][1]; + for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) { + const String old_class = RenamesMap3To4::class_renames[current_index][0]; + const String new_class = RenamesMap3To4::class_renames[current_index][1]; // Light2D, Texture, Viewport are special classes(probably virtual ones). if (ClassDB::class_exists(StringName(old_class)) && old_class != "Light2D" && old_class != "Texture" && old_class != "Viewport") { @@ -2838,10 +1077,10 @@ bool ProjectConverter3To4::test_array_names() { } int current_element = 0; - while (gdscript_function_renames[current_element][0] != nullptr) { - String name_3_x = gdscript_function_renames[current_element][0]; - String name_4_0 = gdscript_function_renames[current_element][1]; - if (!all_functions.has(gdscript_function_renames[current_element][1])) { + while (RenamesMap3To4::gdscript_function_renames[current_element][0] != nullptr) { + String name_3_x = RenamesMap3To4::gdscript_function_renames[current_element][0]; + String name_4_0 = RenamesMap3To4::gdscript_function_renames[current_element][1]; + if (!all_functions.has(name_4_0)) { ERR_PRINT(vformat("Missing GDScript function in pair (%s - ===> %s <===)", name_3_x, name_4_0)); valid = false; } @@ -2852,18 +1091,18 @@ bool ProjectConverter3To4::test_array_names() { ERR_PRINT("Found function which is used in the converter, but it cannot be found in Godot 4. Rename this element or remove its entry if it's obsolete."); } - valid = valid && test_single_array(enum_renames); - valid = valid && test_single_array(class_renames, true); - valid = valid && test_single_array(gdscript_function_renames, true); - valid = valid && test_single_array(csharp_function_renames, true); - valid = valid && test_single_array(gdscript_properties_renames, true); - valid = valid && test_single_array(csharp_properties_renames, true); - valid = valid && test_single_array(shaders_renames, true); - valid = valid && test_single_array(gdscript_signals_renames); - valid = valid && test_single_array(project_settings_renames); - valid = valid && test_single_array(input_map_renames); - valid = valid && test_single_array(builtin_types_renames); - valid = valid && test_single_array(color_renames); + valid = valid && test_single_array(RenamesMap3To4::enum_renames); + valid = valid && test_single_array(RenamesMap3To4::class_renames, true); + valid = valid && test_single_array(RenamesMap3To4::gdscript_function_renames, true); + valid = valid && test_single_array(RenamesMap3To4::csharp_function_renames, true); + valid = valid && test_single_array(RenamesMap3To4::gdscript_properties_renames, true); + valid = valid && test_single_array(RenamesMap3To4::csharp_properties_renames, true); + valid = valid && test_single_array(RenamesMap3To4::shaders_renames, true); + valid = valid && test_single_array(RenamesMap3To4::gdscript_signals_renames); + valid = valid && test_single_array(RenamesMap3To4::project_settings_renames); + valid = valid && test_single_array(RenamesMap3To4::input_map_renames); + valid = valid && test_single_array(RenamesMap3To4::builtin_types_renames); + valid = valid && test_single_array(RenamesMap3To4::color_renames); return valid; } @@ -3092,7 +1331,7 @@ void ProjectConverter3To4::rename_colors(Vector<String> &lines, const RegExConta for (String &line : lines) { if (uint64_t(line.length()) <= maximum_line_length) { if (line.contains("Color.")) { - for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) { + for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) { line = reg_container.color_regexes[current_index]->sub(line, reg_container.color_renamed[current_index], true); } } @@ -3107,10 +1346,10 @@ Vector<String> ProjectConverter3To4::check_for_rename_colors(Vector<String> &lin for (String &line : lines) { if (uint64_t(line.length()) <= maximum_line_length) { if (line.contains("Color.")) { - for (unsigned int current_index = 0; color_renames[current_index][0]; current_index++) { + for (unsigned int current_index = 0; RenamesMap3To4::color_renames[current_index][0]; current_index++) { TypedArray<RegExMatch> reg_match = reg_container.color_regexes[current_index]->search_all(line); if (reg_match.size() > 0) { - found_renames.append(line_formatter(current_line, color_renames[current_index][0], color_renames[current_index][1], line)); + found_renames.append(line_formatter(current_line, RenamesMap3To4::color_renames[current_index][0], RenamesMap3To4::color_renames[current_index][1], line)); } } } @@ -3124,11 +1363,11 @@ Vector<String> ProjectConverter3To4::check_for_rename_colors(Vector<String> &lin void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExContainer ®_container) { for (String &line : lines) { if (uint64_t(line.length()) <= maximum_line_length) { - for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { - if (line.contains(class_renames[current_index][0])) { + for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) { + if (line.contains(RenamesMap3To4::class_renames[current_index][0])) { bool found_ignored_items = false; // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn. - if (line.contains(String(class_renames[current_index][0]) + ".")) { + if (line.contains(String(RenamesMap3To4::class_renames[current_index][0]) + ".")) { found_ignored_items = true; line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true); line = reg_container.class_gd_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.gd", true); @@ -3136,7 +1375,7 @@ void ProjectConverter3To4::rename_classes(Vector<String> &lines, const RegExCont } // Causal renaming Spatial -> Node3D. - line = reg_container.class_regexes[current_index]->sub(line, class_renames[current_index][1], true); + line = reg_container.class_regexes[current_index]->sub(line, RenamesMap3To4::class_renames[current_index][1], true); // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn. if (found_ignored_items) { @@ -3157,12 +1396,12 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li for (String &line : lines) { if (uint64_t(line.length()) <= maximum_line_length) { - for (unsigned int current_index = 0; class_renames[current_index][0]; current_index++) { - if (line.contains(class_renames[current_index][0])) { + for (unsigned int current_index = 0; RenamesMap3To4::class_renames[current_index][0]; current_index++) { + if (line.contains(RenamesMap3To4::class_renames[current_index][0])) { String old_line = line; bool found_ignored_items = false; // Renaming Spatial.tscn to TEMP_RENAMED_CLASS.tscn. - if (line.contains(String(class_renames[current_index][0]) + ".")) { + if (line.contains(String(RenamesMap3To4::class_renames[current_index][0]) + ".")) { found_ignored_items = true; line = reg_container.class_tscn_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.tscn", true); line = reg_container.class_gd_regexes[current_index]->sub(line, "TEMP_RENAMED_CLASS.gd", true); @@ -3172,7 +1411,7 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &li // Causal renaming Spatial -> Node3D. TypedArray<RegExMatch> reg_match = reg_container.class_regexes[current_index]->search_all(line); if (reg_match.size() > 0) { - found_renames.append(line_formatter(current_line, class_renames[current_index][0], class_renames[current_index][1], old_line)); + found_renames.append(line_formatter(current_line, RenamesMap3To4::class_renames[current_index][0], RenamesMap3To4::class_renames[current_index][1], old_line)); } // Restore Spatial.tscn from TEMP_RENAMED_CLASS.tscn. @@ -4353,17 +2592,6 @@ String ProjectConverter3To4::collect_string_from_vector(Vector<String> &vector) return string; } -#else // No RegEx. - -ProjectConverter3To4::ProjectConverter3To4(int _p_maximum_file_size_kb, int _p_maximum_line_length) {} - -int ProjectConverter3To4::convert() { - ERR_FAIL_V_MSG(ERROR_CODE, "Can't run converter for Godot 3.x projects, because RegEx module is disabled."); -} - -int ProjectConverter3To4::validate_conversion() { - ERR_FAIL_V_MSG(ERROR_CODE, "Can't validate conversion for Godot 3.x projects, because RegEx module is disabled."); -} - #endif // MODULE_REGEX_ENABLED + #endif // DISABLE_DEPRECATED diff --git a/editor/project_converter_3_to_4.h b/editor/project_converter_3_to_4.h index 641bc467ac..420dd79d72 100644 --- a/editor/project_converter_3_to_4.h +++ b/editor/project_converter_3_to_4.h @@ -33,31 +33,36 @@ #ifndef DISABLE_DEPRECATED -#include "core/io/file_access.h" -#include "core/object/ref_counted.h" +#include "modules/modules_enabled.gen.h" // For regex. + +#ifndef MODULE_REGEX_ENABLED + +#include "core/error/error_macros.h" + +class ProjectConverter3To4 { +public: + ProjectConverter3To4(int, int) {} + + bool validate_conversion() { + ERR_FAIL_V_MSG(false, "Can't validate conversion for Godot 3.x projects, because RegEx module is disabled."); + } + + bool convert() { + ERR_FAIL_V_MSG(false, "Can't run converter for Godot 3.x projects, because RegEx module is disabled."); + } +}; + +#else // Has regex. + #include "core/string/ustring.h" #include "core/templates/local_vector.h" +#include "core/templates/vector.h" class RegEx; class ProjectConverter3To4 { -public: class RegExContainer; - static const char *enum_renames[][2]; - static const char *gdscript_function_renames[][2]; - static const char *csharp_function_renames[][2]; - static const char *gdscript_properties_renames[][2]; - static const char *csharp_properties_renames[][2]; - static const char *gdscript_signals_renames[][2]; - static const char *csharp_signals_renames[][2]; - static const char *project_settings_renames[][2]; - static const char *input_map_renames[][2]; - static const char *builtin_types_renames[][2]; - static const char *shaders_renames[][2]; - static const char *class_renames[][2]; - static const char *color_renames[][2]; - -private: + uint64_t maximum_file_size; uint64_t maximum_line_length; @@ -108,10 +113,12 @@ private: public: ProjectConverter3To4(int, int); - int validate_conversion(); - int convert(); + bool validate_conversion(); + bool convert(); }; +#endif // MODULE_REGEX_ENABLED + #endif // DISABLE_DEPRECATED #endif // PROJECT_CONVERTER_3_TO_4_H diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 105e3a5d47..dc019d8e7c 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -510,6 +510,8 @@ private: ProjectSettings::CustomMap initial_settings; // Be sure to change this code if/when renderers are changed. + // Default values are "forward_plus" for the main setting, "mobile" for the mobile override, + // and "gl_compatibility" for the web override. String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method")); initial_settings["rendering/renderer/rendering_method"] = renderer_type; @@ -522,6 +524,8 @@ private: project_features.push_back("Mobile"); } else if (renderer_type == "gl_compatibility") { project_features.push_back("GL Compatibility"); + // Also change the default rendering method for the mobile override. + initial_settings["rendering/renderer/rendering_method.mobile"] = "gl_compatibility"; } else { WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); } @@ -961,8 +965,8 @@ public: default_files_container->add_child(l); vcs_metadata_selection = memnew(OptionButton); vcs_metadata_selection->set_custom_minimum_size(Size2(100, 20)); - vcs_metadata_selection->add_item("None", (int)EditorVCSInterface::VCSMetadata::NONE); - vcs_metadata_selection->add_item("Git", (int)EditorVCSInterface::VCSMetadata::GIT); + vcs_metadata_selection->add_item(TTR("None"), (int)EditorVCSInterface::VCSMetadata::NONE); + vcs_metadata_selection->add_item(TTR("Git"), (int)EditorVCSInterface::VCSMetadata::GIT); vcs_metadata_selection->select((int)EditorVCSInterface::VCSMetadata::GIT); default_files_container->add_child(vcs_metadata_selection); Control *spacer = memnew(Control); @@ -1355,6 +1359,8 @@ void ProjectList::load_projects() { create_project_item_control(i); } + sort_projects(); + set_v_scroll(0); update_icons_async(); diff --git a/editor/renames_map_3_to_4.cpp b/editor/renames_map_3_to_4.cpp new file mode 100644 index 0000000000..4c47eac6a5 --- /dev/null +++ b/editor/renames_map_3_to_4.cpp @@ -0,0 +1,1797 @@ +/**************************************************************************/ +/* renames_map_3_to_4.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "renames_map_3_to_4.h" + +#ifndef DISABLE_DEPRECATED + +const char *RenamesMap3To4::enum_renames[][2] = { + //// constants + { "TYPE_COLOR_ARRAY", "TYPE_PACKED_COLOR_ARRAY" }, + { "TYPE_FLOAT64_ARRAY", "TYPE_PACKED_FLOAT64_ARRAY" }, + { "TYPE_INT64_ARRAY", "TYPE_PACKED_INT64_ARRAY" }, + { "TYPE_INT_ARRAY", "TYPE_PACKED_INT32_ARRAY" }, + { "TYPE_QUAT", "TYPE_QUATERNION" }, + { "TYPE_RAW_ARRAY", "TYPE_PACKED_BYTE_ARRAY" }, + { "TYPE_REAL", "TYPE_FLOAT" }, + { "TYPE_REAL_ARRAY", "TYPE_PACKED_FLOAT32_ARRAY" }, + { "TYPE_STRING_ARRAY", "TYPE_PACKED_STRING_ARRAY" }, + { "TYPE_TRANSFORM", "TYPE_TRANSFORM3D" }, + { "TYPE_VECTOR2_ARRAY", "TYPE_PACKED_VECTOR2_ARRAY" }, + { "TYPE_VECTOR3_ARRAY", "TYPE_PACKED_VECTOR3_ARRAY" }, + + // {"FLAG_MAX", "PARTICLE_FLAG_MAX"}, // CPUParticles2D - used in more classes + { "ALIGN_BEGIN", "ALIGNMENT_BEGIN" }, //AspectRatioContainer + { "ALIGN_CENTER", "ALIGNMENT_CENTER" }, //AspectRatioContainer + { "ALIGN_END", "ALIGNMENT_END" }, //AspectRatioContainer + { "ARRAY_COMPRESS_BASE", "ARRAY_COMPRESS_FLAGS_BASE" }, // Mesh + { "ARVR_AR", "XR_AR" }, // XRInterface + { "ARVR_EXCESSIVE_MOTION", "XR_EXCESSIVE_MOTION" }, // XRInterface + { "ARVR_EXTERNAL", "XR_EXTERNAL" }, // XRInterface + { "ARVR_INSUFFICIENT_FEATURES", "XR_INSUFFICIENT_FEATURES" }, // XRInterface + { "ARVR_MONO", "XR_MONO" }, // XRInterface + { "ARVR_NONE", "XR_NONE" }, // XRInterface + { "ARVR_NORMAL_TRACKING", "XR_NORMAL_TRACKING" }, // XRInterface + { "ARVR_NOT_TRACKING", "XR_NOT_TRACKING" }, // XRInterface + { "ARVR_STEREO", "XR_STEREO" }, // XRInterface + { "ARVR_UNKNOWN_TRACKING", "XR_UNKNOWN_TRACKING" }, // XRInterface + { "BAKE_ERROR_INVALID_MESH", "BAKE_ERROR_MESHES_INVALID" }, // LightmapGI + { "BODY_MODE_CHARACTER", "BODY_MODE_RIGID_LINEAR" }, // PhysicsServer + { "BUTTON_LEFT", "MOUSE_BUTTON_LEFT" }, // Globals + { "BUTTON_MASK_LEFT", "MOUSE_BUTTON_MASK_LEFT" }, // Globals + { "BUTTON_MASK_MIDDLE", "MOUSE_BUTTON_MASK_MIDDLE" }, // Globals + { "BUTTON_MASK_RIGHT", "MOUSE_BUTTON_MASK_RIGHT" }, // Globals + { "BUTTON_MASK_XBUTTON1", "MOUSE_BUTTON_MASK_XBUTTON1" }, // Globals + { "BUTTON_MASK_XBUTTON2", "MOUSE_BUTTON_MASK_XBUTTON2" }, // Globals + { "BUTTON_MIDDLE", "MOUSE_BUTTON_MIDDLE" }, // Globals + { "BUTTON_RIGHT", "MOUSE_BUTTON_RIGHT" }, // Globals + { "BUTTON_WHEEL_DOWN", "MOUSE_BUTTON_WHEEL_DOWN" }, // Globals + { "BUTTON_WHEEL_LEFT", "MOUSE_BUTTON_WHEEL_LEFT" }, // Globals + { "BUTTON_WHEEL_RIGHT", "MOUSE_BUTTON_WHEEL_RIGHT" }, // Globals + { "BUTTON_WHEEL_UP", "MOUSE_BUTTON_WHEEL_UP" }, // Globals + { "BUTTON_XBUTTON1", "MOUSE_BUTTON_XBUTTON1" }, // Globals + { "BUTTON_XBUTTON2", "MOUSE_BUTTON_XBUTTON2" }, // Globals + { "CLEAR_MODE_ONLY_NEXT_FRAME", "CLEAR_MODE_ONCE" }, // SubViewport + { "COMPRESS_PVRTC4", "COMPRESS_PVRTC1_4" }, // Image + { "CONNECT_ONESHOT", "CONNECT_ONE_SHOT" }, // Object + { "CONTAINER_PROPERTY_EDITOR_BOTTOM", "CONTAINER_INSPECTOR_BOTTOM" }, // EditorPlugin + { "CUBEMAP_BACK", "CUBEMAP_LAYER_BACK" }, // RenderingServer + { "CUBEMAP_BOTTOM", "CUBEMAP_LAYER_BOTTOM" }, // RenderingServer + { "CUBEMAP_FRONT", "CUBEMAP_LAYER_FRONT" }, // RenderingServer + { "CUBEMAP_LEFT", "CUBEMAP_LAYER_LEFT" }, // RenderingServer + { "CUBEMAP_RIGHT", "CUBEMAP_LAYER_RIGHT" }, // RenderingServer + { "CUBEMAP_TOP", "CUBEMAP_LAYER_TOP" }, // RenderingServer + { "DAMPED_STRING_DAMPING", "DAMPED_SPRING_DAMPING" }, // PhysicsServer2D + { "DAMPED_STRING_REST_LENGTH", "DAMPED_SPRING_REST_LENGTH" }, // PhysicsServer2D + { "DAMPED_STRING_STIFFNESS", "DAMPED_SPRING_STIFFNESS" }, // PhysicsServer2D + { "FLAG_ALIGN_Y_TO_VELOCITY", "PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY" }, // CPUParticles2D + { "FLAG_DISABLE_Z", "PARTICLE_FLAG_DISABLE_Z" }, // CPUParticles2D + { "FLAG_ROTATE_Y", "PARTICLE_FLAG_ROTATE_Y" }, // CPUParticles2D + { "FLAG_USE_BAKED_LIGHT", "GI_MODE_BAKED" }, // GeometryInstance3D + { "FORMAT_PVRTC2", "FORMAT_PVRTC1_2" }, // Image + { "FORMAT_PVRTC2A", "FORMAT_PVRTC1_2A" }, // Image + { "FORMAT_PVRTC4", "FORMAT_PVRTC1_4" }, // Image + { "FORMAT_PVRTC4A", "FORMAT_PVRTC1_4A" }, // Image + { "FUNC_FRAC", "FUNC_FRACT" }, // VisualShaderNodeVectorFunc + { "INSTANCE_LIGHTMAP_CAPTURE", "INSTANCE_LIGHTMAP" }, // RenderingServer + { "JOINT_6DOF", "JOINT_TYPE_6DOF" }, // PhysicsServer3D + { "JOINT_CONE_TWIST", "JOINT_TYPE_CONE_TWIST" }, // PhysicsServer3D + { "JOINT_DAMPED_SPRING", "JOINT_TYPE_DAMPED_SPRING" }, // PhysicsServer2D + { "JOINT_GROOVE", "JOINT_TYPE_GROOVE" }, // PhysicsServer2D + { "JOINT_HINGE", "JOINT_TYPE_HINGE" }, // PhysicsServer3D + { "JOINT_PIN", "JOINT_TYPE_PIN" }, // PhysicsServer2D + { "JOINT_SLIDER", "JOINT_TYPE_SLIDER" }, // PhysicsServer3D + { "KEY_CONTROL", "KEY_CTRL" }, // Globals + { "LOOP_PING_PONG", "LOOP_PINGPONG" }, // AudioStreamWAV + { "MODE_KINEMATIC", "FREEZE_MODE_KINEMATIC" }, // RigidBody + { "MODE_OPEN_ANY", "FILE_MODE_OPEN_ANY" }, // FileDialog + { "MODE_OPEN_DIR", "FILE_MODE_OPEN_DIR" }, // FileDialog + { "MODE_OPEN_FILE", "FILE_MODE_OPEN_FILE" }, // FileDialog + { "MODE_OPEN_FILES", "FILE_MODE_OPEN_FILES" }, // FileDialog + { "MODE_SAVE_FILE", "FILE_MODE_SAVE_FILE" }, // FileDialog + { "MODE_STATIC", "FREEZE_MODE_STATIC" }, // RigidBody + { "NOTIFICATION_APP_PAUSED", "NOTIFICATION_APPLICATION_PAUSED" }, // MainLoop + { "NOTIFICATION_APP_RESUMED", "NOTIFICATION_APPLICATION_RESUMED" }, // MainLoop + { "NOTIFICATION_INSTANCED", "NOTIFICATION_SCENE_INSTANTIATED" }, // Node + { "NOTIFICATION_PATH_CHANGED", "NOTIFICATION_PATH_RENAMED" }, //Node + { "NOTIFICATION_WM_FOCUS_IN", "NOTIFICATION_APPLICATION_FOCUS_IN" }, // MainLoop + { "NOTIFICATION_WM_FOCUS_OUT", "NOTIFICATION_APPLICATION_FOCUS_OUT" }, // MainLoop + { "NOTIFICATION_WM_UNFOCUS_REQUEST", "NOTIFICATION_WM_WINDOW_FOCUS_OUT" }, //Node + { "PAUSE_MODE_INHERIT", "PROCESS_MODE_INHERIT" }, // Node + { "PAUSE_MODE_PROCESS", "PROCESS_MODE_ALWAYS" }, // Node + { "PAUSE_MODE_STOP", "PROCESS_MODE_PAUSABLE" }, // Node + { "RENDER_DRAW_CALLS_IN_FRAME", "RENDER_TOTAL_DRAW_CALLS_IN_FRAME" }, // Performance + { "RENDER_OBJECTS_IN_FRAME", "RENDER_TOTAL_OBJECTS_IN_FRAME" }, // Performance + { "SIDE_BOTTOM", "MARGIN_BOTTOM" }, // Globals + { "SIDE_LEFT", "MARGIN_LEFT" }, // Globals + { "SIDE_RIGHT", "MARGIN_RIGHT" }, // Globals + { "SIDE_TOP", "MARGIN_TOP" }, // Globals + { "TEXTURE_TYPE_2D_ARRAY", "TEXTURE_LAYERED_2D_ARRAY" }, // RenderingServer + { "TEXTURE_TYPE_CUBEMAP", "TEXTURE_LAYERED_CUBEMAP_ARRAY" }, // RenderingServer + { "TRACKER_LEFT_HAND", "TRACKER_HAND_LEFT" }, // XRPositionalTracker + { "TRACKER_RIGHT_HAND", "TRACKER_HAND_RIGHT" }, // XRPositionalTracker + { "TYPE_NORMALMAP", "TYPE_NORMAL_MAP" }, // VisualShaderNodeCubemap + + /// enums + { "AlignMode", "AlignmentMode" }, //AspectRatioContainer + { "AnimationProcessMode", "AnimationProcessCallback" }, // AnimationTree, AnimationPlayer + { "Camera2DProcessMode", "Camera2DProcessCallback" }, // Camera2D + { "CubeMapSide", "CubeMapLayer" }, // RenderingServer + { "DampedStringParam", "DampedSpringParam" }, // PhysicsServer2D + { "FFT_Size", "FFTSize" }, // AudioEffectPitchShift,AudioEffectSpectrumAnalyzer + { "PauseMode", "ProcessMode" }, // Node + { "TimerProcessMode", "TimerProcessCallback" }, // Timer + { "Tracking_status", "TrackingStatus" }, // XRInterface + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::gdscript_function_renames[][2] = { + // { "_set_name", "get_tracker_name"}, // XRPositionalTracker - CameraFeed use this + // { "_unhandled_input", "_unhandled_key_input"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer + // { "create_gizmo", "_create_gizmo"}, // EditorNode3DGizmoPlugin - may be used + // { "get_dependencies", "_get_dependencies" }, // ResourceFormatLoader broke ResourceLoader + // { "get_extents", "get_size" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume + // { "get_h_offset", "get_drag_horizontal_offset"}, // Camera2D, broke PathFollow, Camera + // { "get_mode", "get_file_mode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap + // { "get_motion", "get_travel"}, // PhysicsTestMotionResult2D broke ParalaxLayer + // { "get_name", "get_tracker_name"}, // XRPositionalTracker broke OS, Node + // { "get_network_connected_peers", "get_peers"}, // MultiplayerAPI broke SceneTree + // { "get_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree + // { "get_network_unique_id", "get_unique_id"}, // MultiplayerAPI broke SceneTree + // { "get_offset", "get_position_offset" }, // GraphNode broke Gradient + // { "get_peer_port", "get_peer" }, // ENetMultiplayerPeer broke WebSocketServer + // { "get_process_mode", "get_process_callback" }, // ClippedCamera3D broke Node, Sky + // { "get_render_info", "get_rendering_info" }, // RenderingServer broke Viewport + // { "get_type", "get_tracker_type"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight + // { "get_v_offset", "get_drag_vertical_offset"}, // Camera2D, broke PathFollow, Camera + // { "has_network_peer", "has_multiplayer_peer"}, // MultiplayerAPI broke SceneTree + // { "instance", "instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule + // { "is_listening", "is_bound"}, // PacketPeerUDP broke TCPServer, UDPServer + // { "is_refusing_new_network_connections", "is_refusing_new_connections"}, // MultiplayerAPI broke SceneTree + // { "is_valid", "has_valid_event" }, // Shortcut broke e.g. Callable + // { "listen", "bound"}, // PacketPeerUDP broke TCPServer, UDPServer + // { "load", "_load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D + // { "make_current", "set_current" }, // Camera2D broke Camera3D, Listener2D + // { "process", "_process" }, // AnimationNode - This word is commonly used + // { "save", "_save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D + // { "set_autowrap", "set_autowrap_mode" }, // AcceptDialog broke Label - Cyclic Rename + // { "set_color", "surface_set_color"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool + // { "set_event", "set_shortcut" }, // BaseButton - Cyclic Rename + // { "set_extents", "set_size"}, // BoxShape, RectangleShape broke ReflectionProbe + // { "set_flag", "set_particle_flag"}, // ParticleProcessMaterial broke Window, HingeJoint3D + // { "set_h_offset", "set_drag_horizontal_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D + // { "set_margin", "set_offset" }, // Control broke Shape3D, AtlasTexture + // { "set_mode", "set_mode_file_mode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap + // { "set_normal", "surface_set_normal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D + // { "set_offset", "set_progress" }, // PathFollow2D, PathFollow3D - Too common + // { "set_process_mode", "set_process_callback" }, // AnimationTree broke Node, Tween, Sky + // { "set_refuse_new_network_connections", "set_refuse_new_connections"}, // MultiplayerAPI broke SceneTree + // { "set_tooltip", "set_tooltip_text" }, // Control, breaks TreeItem, at least for now. + // { "set_uv", "surface_set_uv" }, // ImmediateMesh broke Polygon2D + // { "set_v_offset", "set_drag_vertical_offset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D + // {"get_points","get_points_id"},// Astar, broke Line2D, Convexpolygonshape + // {"get_v_scroll","get_v_scroll_bar"},//ItemList, broke TextView + // { "get_stylebox", "get_theme_stylebox" }, // Control - Will rename the method in Theme as well, skipping + { "_about_to_show", "_about_to_popup" }, // ColorPickerButton + { "_get_configuration_warning", "_get_configuration_warnings" }, // Node + { "_set_current", "set_current" }, // Camera2D + { "_set_editor_description", "set_editor_description" }, // Node + { "_toplevel_raise_self", "_top_level_raise_self" }, // CanvasItem + { "_update_wrap_at", "_update_wrap_at_column" }, // TextEdit + { "add_animation", "add_animation_library" }, // AnimationPlayer + { "add_cancel", "add_cancel_button" }, // AcceptDialog + { "add_central_force", "apply_central_force" }, //RigidBody2D + { "add_child_below_node", "add_sibling" }, // Node + { "add_color_override", "add_theme_color_override" }, // Control + { "add_constant_override", "add_theme_constant_override" }, // Control + { "add_font_override", "add_theme_font_override" }, // Control + { "add_force", "apply_force" }, //RigidBody2D + { "add_icon_override", "add_theme_icon_override" }, // Control + { "add_scene_import_plugin", "add_scene_format_importer_plugin" }, //EditorPlugin + { "add_spatial_gizmo_plugin", "add_node_3d_gizmo_plugin" }, // EditorPlugin + { "add_stylebox_override", "add_theme_stylebox_override" }, // Control + { "add_torque", "apply_torque" }, //RigidBody2D + { "agent_set_neighbor_dist", "agent_set_neighbor_distance" }, // NavigationServer2D, NavigationServer3D + { "apply_changes", "_apply_changes" }, // EditorPlugin + { "body_add_force", "body_apply_force" }, // PhysicsServer2D + { "body_add_torque", "body_apply_torque" }, // PhysicsServer2D + { "bumpmap_to_normalmap", "bump_map_to_normal_map" }, // Image + { "can_be_hidden", "_can_be_hidden" }, // EditorNode3DGizmoPlugin + { "can_drop_data", "_can_drop_data" }, // Control + { "can_generate_small_preview", "_can_generate_small_preview" }, // EditorResourcePreviewGenerator + { "can_instance", "can_instantiate" }, // PackedScene, Script + { "canvas_light_set_scale", "canvas_light_set_texture_scale" }, // RenderingServer + { "capture_get_device", "get_input_device" }, // AudioServer + { "capture_get_device_list", "get_input_device_list" }, // AudioServer + { "capture_set_device", "set_input_device" }, // AudioServer + { "center_viewport_to_cursor", "center_viewport_to_caret" }, // TextEdit + { "change_scene", "change_scene_to_file" }, // SceneTree + { "change_scene_to", "change_scene_to_packed" }, // SceneTree + { "clip_polygons_2d", "clip_polygons" }, // Geometry2D + { "clip_polyline_with_polygon_2d", "clip_polyline_with_polygon" }, //Geometry2D + { "commit_handle", "_commit_handle" }, // EditorNode3DGizmo + { "convex_hull_2d", "convex_hull" }, // Geometry2D + { "create_gizmo", "_create_gizmo" }, // EditorNode3DGizmoPlugin + { "cursor_get_blink_speed", "get_caret_blink_interval" }, // TextEdit + { "cursor_get_column", "get_caret_column" }, // TextEdit + { "cursor_get_line", "get_caret_line" }, // TextEdit + { "cursor_set_blink_enabled", "set_caret_blink_enabled" }, // TextEdit + { "cursor_set_blink_speed", "set_caret_blink_interval" }, // TextEdit + { "cursor_set_column", "set_caret_column" }, // TextEdit + { "cursor_set_line", "set_caret_line" }, // TextEdit + { "damped_spring_joint_create", "joint_make_damped_spring" }, // PhysicsServer2D + { "damped_string_joint_get_param", "damped_spring_joint_get_param" }, // PhysicsServer2D + { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D + { "dectime", "move_toward" }, // GDScript, Math functions + { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit + { "deselect_items", "deselect_all" }, // FileDialog + { "disable_plugin", "_disable_plugin" }, // EditorPlugin + { "drop_data", "_drop_data" }, // Control + { "exclude_polygons_2d", "exclude_polygons" }, // Geometry2D + { "find_node", "find_child" }, // Node + { "find_scancode_from_string", "find_keycode_from_string" }, // OS + { "forward_canvas_draw_over_viewport", "_forward_canvas_draw_over_viewport" }, // EditorPlugin + { "forward_canvas_force_draw_over_viewport", "_forward_canvas_force_draw_over_viewport" }, // EditorPlugin + { "forward_canvas_gui_input", "_forward_canvas_gui_input" }, // EditorPlugin + { "forward_spatial_draw_over_viewport", "_forward_3d_draw_over_viewport" }, // EditorPlugin + { "forward_spatial_force_draw_over_viewport", "_forward_3d_force_draw_over_viewport" }, // EditorPlugin + { "forward_spatial_gui_input", "_forward_3d_gui_input" }, // EditorPlugin + { "generate_from_path", "_generate_from_path" }, // EditorResourcePreviewGenerator + { "generate_small_preview_automatically", "_generate_small_preview_automatically" }, // EditorResourcePreviewGenerator + { "get_action_list", "action_get_events" }, // InputMap + { "get_alt", "is_alt_pressed" }, // InputEventWithModifiers + { "get_animation_process_mode", "get_process_callback" }, // AnimationPlayer + { "get_applied_force", "get_constant_force" }, //RigidBody2D + { "get_applied_torque", "get_constant_torque" }, //RigidBody2D + { "get_audio_bus", "get_audio_bus_name" }, // Area3D + { "get_bound_child_nodes_to_bone", "get_bone_children" }, // Skeleton3D + { "get_camera", "get_camera_3d" }, // Viewport -> this is also convertible to get_camera_2d, broke GLTFNode + { "get_cancel", "get_cancel_button" }, // ConfirmationDialog + { "get_caption", "_get_caption" }, // AnimationNode + { "get_cast_to", "get_target_position" }, // RayCast2D, RayCast3D + { "get_child_by_name", "_get_child_by_name" }, // AnimationNode + { "get_child_nodes", "_get_child_nodes" }, // AnimationNode + { "get_closest_point_to_segment_2d", "get_closest_point_to_segment" }, // Geometry2D + { "get_closest_point_to_segment_uncapped_2d", "get_closest_point_to_segment_uncapped" }, // Geometry2D + { "get_closest_points_between_segments_2d", "get_closest_point_to_segment" }, // Geometry2D + { "get_collision_layer_bit", "get_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap + { "get_collision_mask_bit", "get_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap + { "get_color_types", "get_color_type_list" }, // Theme + { "get_command", "is_command_or_control_pressed" }, // InputEventWithModifiers + { "get_constant_types", "get_constant_type_list" }, // Theme + { "get_control", "is_ctrl_pressed" }, // InputEventWithModifiers + { "get_cull_mask_bit", "get_cull_mask_value" }, // Camera3D + { "get_cursor_position", "get_caret_column" }, // LineEdit + { "get_d", "get_distance" }, // LineShape2D + { "get_depth_bias_enable", "get_depth_bias_enabled" }, // RDPipelineRasterizationState + { "get_device", "get_output_device" }, // AudioServer + { "get_device_list", "get_output_device_list" }, // AudioServer + { "get_drag_data", "_get_drag_data" }, // Control + { "get_editor_viewport", "get_editor_main_screen" }, // EditorPlugin + { "get_enabled_focus_mode", "get_focus_mode" }, // BaseButton + { "get_endian_swap", "is_big_endian" }, // File + { "get_error_string", "get_error_message" }, // JSON + { "get_filename", "get_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places + { "get_focus_neighbour", "get_focus_neighbor" }, // Control + { "get_follow_smoothing", "get_position_smoothing_speed" }, // Camera2D + { "get_font_types", "get_font_type_list" }, // Theme + { "get_frame_color", "get_color" }, // ColorRect + { "get_global_rate_scale", "get_playback_speed_scale" }, // AudioServer + { "get_gravity_distance_scale", "get_gravity_point_unit_distance" }, // Area(2D/3D) + { "get_gravity_vector", "get_gravity_direction" }, // Area(2D/3D) + { "get_h_scrollbar", "get_h_scroll_bar" }, //ScrollContainer + { "get_hand", "get_tracker_hand" }, // XRPositionalTracker + { "get_handle_name", "_get_handle_name" }, // EditorNode3DGizmo + { "get_handle_value", "_get_handle_value" }, // EditorNode3DGizmo + { "get_icon_align", "get_icon_alignment" }, // Button + { "get_icon_types", "get_icon_type_list" }, // Theme + { "get_idle_frames", "get_process_frames" }, // Engine + { "get_import_options", "_get_import_options" }, // EditorImportPlugin + { "get_import_order", "_get_import_order" }, // EditorImportPlugin + { "get_importer_name", "_get_importer_name" }, // EditorImportPlugin + { "get_interior_ambient", "get_ambient_color" }, // ReflectionProbe + { "get_interior_ambient_energy", "get_ambient_color_energy" }, // ReflectionProbe + { "get_iterations_per_second", "get_physics_ticks_per_second" }, // Engine + { "get_last_mouse_speed", "get_last_mouse_velocity" }, // Input + { "get_layer_mask_bit", "get_layer_mask_value" }, // VisualInstance3D + { "get_len", "get_length" }, // File + { "get_max_atlas_size", "get_max_texture_size" }, // LightmapGI + { "get_metakey", "is_meta_pressed" }, // InputEventWithModifiers + { "get_mid_height", "get_height" }, // CapsuleMesh + { "get_motion_remainder", "get_remainder" }, // PhysicsTestMotionResult2D + { "get_neighbor_dist", "get_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D + { "get_network_connected_peers", "get_peers" }, // Multiplayer API + { "get_network_master", "get_multiplayer_authority" }, // Node + { "get_network_peer", "get_multiplayer_peer" }, // Multiplayer API + { "get_network_unique_id", "get_unique_id" }, // Multiplayer API + { "get_ok", "get_ok_button" }, // AcceptDialog + { "get_oneshot", "get_one_shot" }, // AnimatedTexture + { "get_option_visibility", "_get_option_visibility" }, // EditorImportPlugin + { "get_parameter_default_value", "_get_parameter_default_value" }, // AnimationNode + { "get_parameter_list", "_get_parameter_list" }, // AnimationNode + { "get_parent_spatial", "get_parent_node_3d" }, // Node3D + { "get_pause_mode", "get_process_mode" }, // Node + { "get_physical_scancode", "get_physical_keycode" }, // InputEventKey + { "get_physical_scancode_with_modifiers", "get_physical_keycode_with_modifiers" }, // InputEventKey + { "get_plugin_icon", "_get_plugin_icon" }, // EditorPlugin + { "get_plugin_name", "_get_plugin_name" }, // EditorPlugin + { "get_preset_count", "_get_preset_count" }, // EditorImportPlugin + { "get_preset_name", "_get_preset_name" }, // EditorImportPlugin + { "get_recognized_extensions", "_get_recognized_extensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver + { "get_render_info", "get_rendering_info" }, // RenderingServer + { "get_render_targetsize", "get_render_target_size" }, // XRInterface + { "get_resource_type", "_get_resource_type" }, // ResourceFormatLoader + { "get_result", "get_data" }, //JSON + { "get_reverb_bus", "set_reverb_bus_name" }, // Area3D + { "get_rpc_sender_id", "get_remote_sender_id" }, // Multiplayer API + { "get_save_extension", "_get_save_extension" }, // EditorImportPlugin + { "get_scancode", "get_keycode" }, // InputEventKey + { "get_scancode_string", "get_keycode_string" }, // OS + { "get_scancode_with_modifiers", "get_keycode_with_modifiers" }, // InputEventKey + { "get_selected_path", "get_current_directory" }, // EditorInterface + { "get_shift", "is_shift_pressed" }, // InputEventWithModifiers + { "get_size_override", "get_size_2d_override" }, // SubViewport + { "get_slide_count", "get_slide_collision_count" }, // CharacterBody2D, CharacterBody3D + { "get_slips_on_slope", "get_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D + { "get_space_override_mode", "get_gravity_space_override_mode" }, // Area2D + { "get_spatial_node", "get_node_3d" }, // EditorNode3DGizmo + { "get_speed", "get_velocity" }, // InputEventMouseMotion + { "get_stylebox_types", "get_stylebox_type_list" }, // Theme + { "get_surface_material", "get_surface_override_material" }, // MeshInstance3D broke ImporterMesh + { "get_surface_material_count", "get_surface_override_material_count" }, // MeshInstance3D + { "get_tab_disabled", "is_tab_disabled" }, // Tab + { "get_tab_hidden", "is_tab_hidden" }, // Tab + { "get_text_align", "get_text_alignment" }, // Button + { "get_theme_item_types", "get_theme_item_type_list" }, // Theme + { "get_timer_process_mode", "get_timer_process_callback" }, // Timer + { "get_translation", "get_position" }, // Node3D broke GLTFNode which is used rarely + { "get_unit_db", "get_volume_db" }, // AudioStreamPlayer3D + { "get_unit_offset", "get_progress_ratio" }, // PathFollow2D, PathFollow3D + { "get_use_in_baked_light", "is_baking_navigation" }, // GridMap + { "get_used_cells_by_id", "get_used_cells" }, // TileMap + { "get_v_scrollbar", "get_v_scroll_bar" }, //ScrollContainer + { "get_visible_name", "_get_visible_name" }, // EditorImportPlugin + { "get_window_layout", "_get_window_layout" }, // EditorPlugin + { "get_word_under_cursor", "get_word_under_caret" }, // TextEdit + { "get_world", "get_world_3d" }, // Viewport, Spatial + { "get_zfar", "get_far" }, // Camera3D broke GLTFCamera + { "get_znear", "get_near" }, // Camera3D broke GLTFCamera + { "groove_joint_create", "joint_make_groove" }, // PhysicsServer2D + { "handle_menu_selected", "_handle_menu_selected" }, // EditorResourcePicker + { "handles_type", "_handles_type" }, // ResourceFormatLoader + { "has_color", "has_theme_color" }, // Control broke Theme + { "has_color_override", "has_theme_color_override" }, // Control broke Theme + { "has_constant", "has_theme_constant" }, // Control + { "has_constant_override", "has_theme_constant_override" }, // Control + { "has_filter", "_has_filter" }, // AnimationNode + { "has_font", "has_theme_font" }, // Control broke Theme + { "has_font_override", "has_theme_font_override" }, // Control + { "has_icon", "has_theme_icon" }, // Control broke Theme + { "has_icon_override", "has_theme_icon_override" }, // Control + { "has_main_screen", "_has_main_screen" }, // EditorPlugin + { "has_network_peer", "has_multiplayer_peer" }, // Multiplayer API + { "has_stylebox", "has_theme_stylebox" }, // Control broke Theme + { "has_stylebox_override", "has_theme_stylebox_override" }, // Control + { "http_escape", "uri_encode" }, // String + { "http_unescape", "uri_decode" }, // String + { "import_scene_from_other_importer", "_import_scene" }, //EditorSceneFormatImporter + { "instance_set_surface_material", "instance_set_surface_override_material" }, // RenderingServer + { "interpolate", "sample" }, // Curve, Curve2D, Curve3D, Gradient + { "intersect_polygons_2d", "intersect_polygons" }, // Geometry2D + { "intersect_polyline_with_polygon_2d", "intersect_polyline_with_polygon" }, // Geometry2D + { "is_a_parent_of", "is_ancestor_of" }, // Node + { "is_commiting_action", "is_committing_action" }, // UndoRedo + { "is_doubleclick", "is_double_click" }, // InputEventMouseButton + { "is_draw_red", "is_draw_warning" }, // EditorProperty + { "is_follow_smoothing_enabled", "is_position_smoothing_enabled" }, // Camera2D + { "is_h_drag_enabled", "is_drag_horizontal_enabled" }, // Camera2D + { "is_handle_highlighted", "_is_handle_highlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin + { "is_inverting_faces", "get_flip_faces" }, // CSGPrimitive3D + { "is_network_master", "is_multiplayer_authority" }, // Node + { "is_network_server", "is_server" }, // Multiplayer API + { "is_normalmap", "is_normal_map" }, // NoiseTexture + { "is_refusing_new_network_connections", "is_refusing_new_connections" }, // Multiplayer API + { "is_region", "is_region_enabled" }, // Sprite2D + { "is_rotating", "is_ignoring_rotation" }, // Camera2D + { "is_scancode_unicode", "is_keycode_unicode" }, // OS + { "is_selectable_when_hidden", "_is_selectable_when_hidden" }, // EditorNode3DGizmoPlugin + { "is_set_as_toplevel", "is_set_as_top_level" }, // CanvasItem + { "is_shortcut", "matches_event" }, // Shortcut + { "is_size_override_stretch_enabled", "is_size_2d_override_stretch_enabled" }, // SubViewport + { "is_sort_enabled", "is_y_sort_enabled" }, // Node2D + { "is_static_body", "is_able_to_sleep" }, // PhysicalBone3D - TODO - not sure + { "is_v_drag_enabled", "is_drag_vertical_enabled" }, // Camera2D + { "joint_create_cone_twist", "joint_make_cone_twist" }, // PhysicsServer3D + { "joint_create_generic_6dof", "joint_make_generic_6dof" }, // PhysicsServer3D + { "joint_create_hinge", "joint_make_hinge" }, // PhysicsServer3D + { "joint_create_pin", "joint_make_pin" }, // PhysicsServer3D + { "joint_create_slider", "joint_make_slider" }, // PhysicsServer3D + { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D + { "load_from_globals", "load_from_project_settings" }, // InputMap + { "load_interactive", "load_threaded_request" }, // ResourceLoader - load_threaded_request is alternative, but is used differently + { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D + { "make_visible", "_make_visible" }, // EditorPlugin + { "merge_polygons_2d", "merge_polygons" }, // Geometry2D + { "mesh_surface_get_format", "mesh_surface_get_format_attribute_stride" }, // RenderingServer + { "mesh_surface_update_region", "mesh_surface_update_attribute_region" }, // RenderingServer + { "move_to_bottom", "move_after" }, // Skeleton3D + { "move_to_top", "move_before" }, // Skeleton3D + { "multimesh_allocate", "multimesh_allocate_data" }, // RenderingServer + { "normalmap_to_xy", "normal_map_to_xy" }, // Image + { "offset_polygon_2d", "offset_polygon" }, // Geometry2D + { "offset_polyline_2d", "offset_polyline" }, // Geometry2D + { "percent_decode", "uri_decode" }, // String + { "percent_encode", "uri_encode" }, // String + { "pin_joint_create", "joint_make_pin" }, // PhysicsServer2D + { "popup_centered_minsize", "popup_centered_clamped" }, // Window + { "post_import", "_post_import" }, // EditorScenePostImport + { "print_stray_nodes", "print_orphan_nodes" }, // Node + { "property_list_changed_notify", "notify_property_list_changed" }, // Object + { "raise", "move_to_front" }, // CanvasItem + { "recognize", "_recognize" }, // ResourceFormatLoader + { "regen_normalmaps", "regen_normal_maps" }, // ArrayMesh + { "remove", "remove_at" }, // Array, broke Directory + { "remove_animation", "remove_animation_library" }, // AnimationPlayer + { "remove_color_override", "remove_theme_color_override" }, // Control + { "remove_constant_override", "remove_theme_constant_override" }, // Control + { "remove_font_override", "remove_theme_font_override" }, // Control + { "remove_icon_override", "remove_theme_icon_override" }, // Control + { "remove_scene_import_plugin", "remove_scene_format_importer_plugin" }, //EditorPlugin + { "remove_spatial_gizmo_plugin", "remove_node_3d_gizmo_plugin" }, // EditorPlugin + { "remove_stylebox_override", "remove_theme_stylebox_override" }, // Control + { "rename_animation", "rename_animation_library" }, // AnimationPlayer + { "rename_dependencies", "_rename_dependencies" }, // ResourceFormatLoader + { "save_external_data", "_save_external_data" }, // EditorPlugin + { "segment_intersects_segment_2d", "segment_intersects_segment" }, // Geometry2D + { "set_adjustment_enable", "set_adjustment_enabled" }, // Environment + { "set_alt", "set_alt_pressed" }, // InputEventWithModifiers + { "set_anchor_and_margin", "set_anchor_and_offset" }, // Control + { "set_anchors_and_margins_preset", "set_anchors_and_offsets_preset" }, // Control + { "set_animation_process_mode", "set_process_callback" }, // AnimationPlayer + { "set_as_bulk_array", "set_buffer" }, // MultiMesh + { "set_as_normalmap", "set_as_normal_map" }, // NoiseTexture + { "set_as_toplevel", "set_as_top_level" }, // CanvasItem + { "set_audio_bus", "set_audio_bus_name" }, // Area3D + { "set_autowrap", "set_autowrap_mode" }, // Label broke AcceptDialog + { "set_cast_to", "set_target_position" }, // RayCast2D, RayCast3D + { "set_collision_layer_bit", "set_collision_layer_value" }, // CSGShape3D and a lot of others like GridMap + { "set_collision_mask_bit", "set_collision_mask_value" }, // CSGShape3D and a lot of others like GridMap + { "set_column_min_width", "set_column_custom_minimum_width" }, // Tree + { "set_command", "set_meta_pressed" }, // InputEventWithModifiers + { "set_control", "set_ctrl_pressed" }, // InputEventWithModifiers + { "set_create_options", "_set_create_options" }, // EditorResourcePicker + { "set_cull_mask_bit", "set_cull_mask_value" }, // Camera3D + { "set_cursor_position", "set_caret_column" }, // LineEdit + { "set_d", "set_distance" }, // WorldMarginShape2D + { "set_depth_bias_enable", "set_depth_bias_enabled" }, // RDPipelineRasterizationState + { "set_device", "set_output_device" }, // AudioServer + { "set_doubleclick", "set_double_click" }, // InputEventMouseButton + { "set_draw_red", "set_draw_warning" }, // EditorProperty + { "set_enable_follow_smoothing", "set_position_smoothing_enabled" }, // Camera2D + { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton + { "set_endian_swap", "set_big_endian" }, // File + { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit + { "set_filename", "set_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places + { "set_focus_neighbour", "set_focus_neighbor" }, // Control + { "set_follow_smoothing", "set_position_smoothing_speed" }, // Camera2D + { "set_frame_color", "set_color" }, // ColorRect + { "set_global_rate_scale", "set_playback_speed_scale" }, // AudioServer + { "set_gravity_distance_scale", "set_gravity_point_unit_distance" }, // Area(2D/3D) + { "set_gravity_vector", "set_gravity_direction" }, // Area(2D/3D) + { "set_h_drag_enabled", "set_drag_horizontal_enabled" }, // Camera2D + { "set_icon_align", "set_icon_alignment" }, // Button + { "set_interior_ambient", "set_ambient_color" }, // ReflectionProbe + { "set_interior_ambient_energy", "set_ambient_color_energy" }, // ReflectionProbe + { "set_invert_faces", "set_flip_faces" }, // CSGPrimitive3D + { "set_is_initialized", "_is_initialized" }, // XRInterface + { "set_is_primary", "set_primary" }, // XRInterface + { "set_iterations_per_second", "set_physics_ticks_per_second" }, // Engine + { "set_layer_mask_bit", "set_layer_mask_value" }, // VisualInstance3D + { "set_margins_preset", "set_offsets_preset" }, // Control + { "set_max_atlas_size", "set_max_texture_size" }, // LightmapGI + { "set_metakey", "set_meta_pressed" }, // InputEventWithModifiers + { "set_mid_height", "set_height" }, // CapsuleMesh + { "set_neighbor_dist", "set_neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D + { "set_network_master", "set_multiplayer_authority" }, // Node + { "set_network_peer", "set_multiplayer_peer" }, // Multiplayer API + { "set_oneshot", "set_one_shot" }, // AnimatedTexture + { "set_pause_mode", "set_process_mode" }, // Node + { "set_physical_scancode", "set_physical_keycode" }, // InputEventKey + { "set_proximity_fade", "set_proximity_fade_enabled" }, // Material + { "set_refuse_new_network_connections", "set_refuse_new_connections" }, // Multiplayer API + { "set_region", "set_region_enabled" }, // Sprite2D, Sprite broke AtlasTexture + { "set_region_filter_clip", "set_region_filter_clip_enabled" }, // Sprite2D + { "set_reverb_bus", "set_reverb_bus_name" }, // Area3D + { "set_rotate", "set_rotates" }, // PathFollow2D + { "set_scancode", "set_keycode" }, // InputEventKey + { "set_shift", "set_shift_pressed" }, // InputEventWithModifiers + { "set_size_override", "set_size_2d_override" }, // SubViewport broke ImageTexture + { "set_size_override_stretch", "set_size_2d_override_stretch" }, // SubViewport + { "set_slips_on_slope", "set_slide_on_slope" }, // SeparationRayShape2D, SeparationRayShape3D + { "set_sort_enabled", "set_y_sort_enabled" }, // Node2D + { "set_space_override_mode", "set_gravity_space_override_mode" }, // Area2D + { "set_spatial_node", "set_node_3d" }, // EditorNode3DGizmo + { "set_speed", "set_velocity" }, // InputEventMouseMotion + { "set_ssao_edge_sharpness", "set_ssao_sharpness" }, // Environment + { "set_surface_material", "set_surface_override_material" }, // MeshInstance3D broke ImporterMesh + { "set_tab_align", "set_tab_alignment" }, //TabContainer + { "set_tangent", "surface_set_tangent" }, // ImmediateGeometry broke SurfaceTool + { "set_text_align", "set_text_alignment" }, // Button + { "set_timer_process_mode", "set_timer_process_callback" }, // Timer + { "set_translation", "set_position" }, // Node3D - this broke GLTFNode which is used rarely + { "set_unit_db", "set_volume_db" }, // AudioStreamPlayer3D + { "set_unit_offset", "set_progress_ratio" }, // PathFollow2D, PathFollow3D + { "set_uv2", "surface_set_uv2" }, // ImmediateMesh broke Surffacetool + { "set_v_drag_enabled", "set_drag_vertical_enabled" }, // Camera2D + { "set_valign", "set_vertical_alignment" }, // Label + { "set_window_layout", "_set_window_layout" }, // EditorPlugin + { "set_zfar", "set_far" }, // Camera3D broke GLTFCamera + { "set_znear", "set_near" }, // Camera3D broke GLTFCamera + { "shortcut_match", "is_match" }, // InputEvent + { "skeleton_allocate", "skeleton_allocate_data" }, // RenderingServer + { "surface_update_region", "surface_update_attribute_region" }, // ArrayMesh + { "targeting_method", "tween_method" }, // Tween + { "targeting_property", "tween_property" }, // Tween + { "track_remove_key_at_position", "track_remove_key_at_time" }, // Animation + { "triangulate_delaunay_2d", "triangulate_delaunay" }, // Geometry2D + { "unselect", "deselect" }, // ItemList + { "unselect_all", "deselect_all" }, // ItemList + { "update_configuration_warning", "update_configuration_warnings" }, // Node + { "update_gizmo", "update_gizmos" }, // Node3D + { "viewport_set_use_arvr", "viewport_set_use_xr" }, // RenderingServer + { "warp_mouse_position", "warp_mouse" }, // Input + { "world_to_map", "local_to_map" }, // TileMap, GridMap + { "set_shader_param", "set_shader_parameter" }, // ShaderMaterial + { "get_shader_param", "get_shader_parameter" }, // ShaderMaterial + { "set_uniform_name", "set_parameter_name" }, // ParameterRef + { "get_uniform_name", "get_parameter_name" }, // ParameterRef + + // Builtin types + // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed + // { "empty", "is_empty" }, // Array - Used as custom rule // Be careful, this will be used everywhere + { "clamped", "clamp" }, // Vector2 // Be careful, this will be used everywhere + { "get_rotation_quat", "get_rotation_quaternion" }, // Basis + { "grow_margin", "grow_side" }, // Rect2 + { "invert", "reverse" }, // Array - TODO check // Be careful, this will be used everywhere + { "is_abs_path", "is_absolute_path" }, // String + { "is_valid_integer", "is_valid_int" }, // String + { "linear_interpolate", "lerp" }, // Color + { "find_last", "rfind" }, // Array, String + { "to_ascii", "to_ascii_buffer" }, // String + { "to_utf8", "to_utf8_buffer" }, // String + { "to_wchar", "to_utf32_buffer" }, // String // TODO - utf32 or utf16? + + // @GlobalScope + // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed + { "bytes2var", "bytes_to_var" }, + { "bytes2var_with_objects", "bytes_to_var_with_objects" }, + { "db2linear", "db_to_linear" }, + { "deg2rad", "deg_to_rad" }, + { "linear2db", "linear_to_db" }, + { "rad2deg", "rad_to_deg" }, + { "rand_range", "randf_range" }, + { "range_lerp", "remap" }, + { "stepify", "snapped" }, + { "str2var", "str_to_var" }, + { "var2str", "var_to_str" }, + { "var2bytes", "var_to_bytes" }, + { "var2bytes_with_objects", "var_to_bytes_with_objects" }, + + // @GDScript + // Remember to add them to builtin_types_excluded_functions variable, because for now this functions cannot be listed + { "dict2inst", "dict_to_inst" }, + { "inst2dict", "inst_to_dict" }, + + { nullptr, nullptr }, +}; + +// gdscript_function_renames clone with CamelCase +const char *RenamesMap3To4::csharp_function_renames[][2] = { + // { "_SetName", "GetTrackerName"}, // XRPositionalTracker - CameraFeed use this + // { "_UnhandledInput", "_UnhandledKeyInput"}, // BaseButton, ViewportContainer broke Node, FileDialog,SubViewportContainer + // { "CreateGizmo", "_CreateGizmo"}, // EditorNode3DGizmoPlugin - may be used + // { "GetDependencies", "_GetDependencies" }, // ResourceFormatLoader broke ResourceLoader + // { "GetExtents", "GetSize" }, // BoxShape, RectangleShape broke Decal, VoxelGI, GPUParticlesCollisionBox, GPUParticlesCollisionSDF, GPUParticlesCollisionHeightField, GPUParticlesAttractorBox, GPUParticlesAttractorVectorField, FogVolume + // { "GetHOffset", "GetDragHorizontalOffset"}, // Camera2D, broke PathFollow, Camera + // { "GetMode", "GetFileMode"}, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap + // { "GetMotion", "GetTravel"}, // PhysicsTestMotionResult2D broke ParalaxLayer + // { "GetName", "GetTrackerName"}, // XRPositionalTracker broke OS, Node + // { "GetNetworkConnectedPeers", "GetPeers"}, // MultiplayerAPI broke SceneTree + // { "GetNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree + // { "GetNetworkUniqueId", "GetUniqueId"}, // MultiplayerAPI broke SceneTree + // { "GetOffset", "GetPositionOffset" }, // GraphNode broke Gradient + // { "GetPeerPort", "GetPeer" }, // ENetMultiplayerPeer broke WebSocketServer + // { "GetProcessMode", "GetProcessCallback" }, // ClippedCamera3D broke Node, Sky + // { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer broke Viewport + // { "GetType", "GetTrackerType"}, // XRPositionalTracker broke GLTFAccessor, GLTFLight + // { "GetVOffset", "GetDragVerticalOffset"}, // Camera2D, broke PathFollow, Camera + // { "HasNetworkPeer", "HasMultiplayerPeer"}, // MultiplayerAPI broke SceneTree + // { "Instance", "Instantiate" }, // PackedScene, ClassDB - Broke FileSystemDock signal and also tscn files - [instance=ExtResource( 17 )] - this is implemented as custom rule + // { "IsListening", "IsBound"}, // PacketPeerUDP broke TCPServer, UDPServer + // { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections"}, // MultiplayerAPI broke SceneTree + // { "IsValid", "HasValidEvent" }, // Shortcut broke e.g. Callable + // { "Listen", "Bound"}, // PacketPeerUDP broke TCPServer, UDPServer + // { "Load", "_Load"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D + // { "MakeCurrent", "SetCurrent" }, // Camera2D broke Camera3D, Listener2D + // { "Process", "_Process" }, // AnimationNode - This word is commonly used + // { "Save", "_Save"}, // ResourceFormatLoader broke ConfigFile, Image, StreamTexture2D + // { "SetAutowrap", "SetAutowrapMode" }, // AcceptDialog broke Label - Cyclic Rename + // { "SetColor", "SurfaceSetColor"}, // ImmediateMesh broke Light2D, Theme, SurfaceTool + // { "SetEvent", "SetShortcut" }, // BaseButton - Cyclic Rename + // { "SetExtents", "SetSize"}, // BoxShape, RectangleShape broke ReflectionProbe + // { "SetFlag", "SetParticleFlag"}, // ParticleProcessMaterial broke Window, HingeJoint3D + // { "SetHOffset", "SetDragHorizontalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D + // { "SetMargin", "SetOffset" }, // Control broke Shape3D, AtlasTexture + // { "SetMode", "SetModeFileMode" }, // FileDialog broke Panel, Shader, CSGPolygon, Tilemap + // { "SetNormal", "SurfaceSetNormal"}, // ImmediateGeometry broke SurfaceTool, WorldMarginShape2D + // { "SetOffset", "SetProgress" }, // PathFollow2D, PathFollow3D - Too common + // { "SetProcessMode", "SetProcessCallback" }, // AnimationTree broke Node, Tween, Sky + // { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections"}, // MultiplayerAPI broke SceneTree + // { "SetTooltip", "SetTooltipText" }, // Control, breaks TreeItem, at least for now. + // { "SetUv", "SurfaceSetUv" }, // ImmediateMesh broke Polygon2D + // { "SetVOffset", "SetDragVerticalOffset" }, // Camera2D broke Camera3D, PathFollow3D, PathFollow2D + // {"GetPoints","GetPointsId"},// Astar, broke Line2D, Convexpolygonshape + // {"GetVScroll","GetVScrollBar"},//ItemList, broke TextView + // { "GetStylebox", "GetThemeStylebox" }, // Control - Will rename the method in Theme as well, skipping + { "AddSpatialGizmoPlugin", "AddNode3dGizmoPlugin" }, // EditorPlugin + { "RenderingServer", "GetTabAlignment" }, // Tab + { "_AboutToShow", "_AboutToPopup" }, // ColorPickerButton + { "_GetConfigurationWarning", "_GetConfigurationWarnings" }, // Node + { "_SetCurrent", "SetCurrent" }, // Camera2D + { "_SetEditorDescription", "SetEditorDescription" }, // Node + { "_SetPlaying", "SetPlaying" }, // AnimatedSprite3D + { "_ToplevelRaiseSelf", "_TopLevelRaiseSelf" }, // CanvasItem + { "_UpdateWrapAt", "_UpdateWrapAtColumn" }, // TextEdit + { "AddAnimation", "AddAnimationLibrary" }, // AnimationPlayer + { "AddCancel", "AddCancelButton" }, // AcceptDialog + { "AddCentralForce", "AddConstantCentralForce" }, //RigidBody2D + { "AddChildBelowNode", "AddSibling" }, // Node + { "AddColorOverride", "AddThemeColorOverride" }, // Control + { "AddConstantOverride", "AddThemeConstantOverride" }, // Control + { "AddFontOverride", "AddThemeFontOverride" }, // Control + { "AddForce", "AddConstantForce" }, //RigidBody2D + { "AddIconOverride", "AddThemeIconOverride" }, // Control + { "AddSceneImportPlugin", "AddSceneFormatImporterPlugin" }, //EditorPlugin + { "AddStyleboxOverride", "AddThemeStyleboxOverride" }, // Control + { "AddTorque", "AddConstantTorque" }, //RigidBody2D + { "AgentSetNeighborDist", "AgentSetNeighborDistance" }, // NavigationServer2D, NavigationServer3D + { "BindChildNodeToBone", "SetBoneChildren" }, // Skeleton3D + { "BumpmapToNormalmap", "BumpMapToNormalMap" }, // Image + { "CanBeHidden", "_CanBeHidden" }, // EditorNode3DGizmoPlugin + { "CanDropData", "_CanDropData" }, // Control + { "CanDropDataFw", "_CanDropDataFw" }, // ScriptEditor + { "CanGenerateSmallPreview", "_CanGenerateSmallPreview" }, // EditorResourcePreviewGenerator + { "CanInstance", "CanInstantiate" }, // PackedScene, Script + { "CanvasLightSetScale", "CanvasLightSetTextureScale" }, // RenderingServer + { "CaptureGetDevice", "GetInputDevice" }, // AudioServer + { "CaptureGetDeviceList", "GetInputDeviceList" }, // AudioServer + { "CaptureSetDevice", "SetInputDevice" }, // AudioServer + { "CenterViewportToCursor", "CenterViewportToCaret" }, // TextEdit + { "ChangeScene", "ChangeSceneToFile" }, // SceneTree + { "ChangeSceneTo", "ChangeSceneToPacked" }, // SceneTree + { "ClipPolygons2d", "ClipPolygons" }, // Geometry2D + { "ClipPolylineWithPolygon2d", "ClipPolylineWithPolygon" }, //Geometry2D + { "CommitHandle", "_CommitHandle" }, // EditorNode3DGizmo + { "ConvexHull2d", "ConvexHull" }, // Geometry2D + { "CursorGetBlinkSpeed", "GetCaretBlinkInterval" }, // TextEdit + { "CursorGetColumn", "GetCaretColumn" }, // TextEdit + { "CursorGetLine", "GetCaretLine" }, // TextEdit + { "CursorSetBlinkEnabled", "SetCaretBlinkEnabled" }, // TextEdit + { "CursorSetBlinkSpeed", "SetCaretBlinkInterval" }, // TextEdit + { "CursorSetColumn", "SetCaretColumn" }, // TextEdit + { "CursorSetLine", "SetCaretLine" }, // TextEdit + { "DampedSpringJointCreate", "JointMakeDampedSpring" }, // PhysicsServer2D + { "DampedStringJointGetParam", "DampedSpringJointGetParam" }, // PhysicsServer2D + { "DampedStringJointSetParam", "DampedSpringJointSetParam" }, // PhysicsServer2D + { "DeleteCharAtCursor", "DeleteCharAtCaret" }, // LineEdit + { "DeselectItems", "DeselectAll" }, // FileDialog + { "DropData", "_DropData" }, // Control + { "DropDataFw", "_DropDataFw" }, // ScriptEditor + { "ExcludePolygons2d", "ExcludePolygons" }, // Geometry2D + { "FindScancodeFromString", "FindKeycodeFromString" }, // OS + { "ForwardCanvasDrawOverViewport", "_ForwardCanvasDrawOverViewport" }, // EditorPlugin + { "ForwardCanvasForceDrawOverViewport", "_ForwardCanvasForceDrawOverViewport" }, // EditorPlugin + { "ForwardCanvasGuiInput", "_ForwardCanvasGuiInput" }, // EditorPlugin + { "ForwardSpatialDrawOverViewport", "_Forward3dDrawOverViewport" }, // EditorPlugin + { "ForwardSpatialForceDrawOverViewport", "_Forward3dForceDrawOverViewport" }, // EditorPlugin + { "ForwardSpatialGuiInput", "_Forward3dGuiInput" }, // EditorPlugin + { "GenerateFromPath", "_GenerateFromPath" }, // EditorResourcePreviewGenerator + { "GenerateSmallPreviewAutomatically", "_GenerateSmallPreviewAutomatically" }, // EditorResourcePreviewGenerator + { "GetActionList", "ActionGetEvents" }, // InputMap + { "GetAlt", "IsAltPressed" }, // InputEventWithModifiers + { "GetAnimationProcessMode", "GetProcessCallback" }, // AnimationPlayer + { "GetAppliedForce", "GetConstantForce" }, //RigidBody2D + { "GetAppliedTorque", "GetConstantTorque" }, //RigidBody2D + { "GetAudioBus", "GetAudioBusName" }, // Area3D + { "GetBoundChildNodesToBone", "GetBoneChildren" }, // Skeleton3D + { "GetCamera", "GetCamera3d" }, // Viewport -> this is also convertible to getCamera2d, broke GLTFNode + { "GetCancel", "GetCancelButton" }, // ConfirmationDialog + { "GetCaption", "_GetCaption" }, // AnimationNode + { "GetCastTo", "GetTargetPosition" }, // RayCast2D, RayCast3D + { "GetChildByName", "_GetChildByName" }, // AnimationNode + { "GetChildNodes", "_GetChildNodes" }, // AnimationNode + { "GetClosestPointToSegment2d", "GetClosestPointToSegment" }, // Geometry2D + { "GetClosestPointToSegmentUncapped2d", "GetClosestPointToSegmentUncapped" }, // Geometry2D + { "GetClosestPointsBetweenSegments2d", "GetClosestPointToSegment" }, // Geometry2D + { "GetCollisionLayerBit", "GetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap + { "GetCollisionMaskBit", "GetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap + { "GetColorTypes", "GetColorTypeList" }, // Theme + { "GetCommand", "IsCommandPressed" }, // InputEventWithModifiers + { "GetConstantTypes", "GetConstantTypeList" }, // Theme + { "GetControl", "IsCtrlPressed" }, // InputEventWithModifiers + { "GetCullMaskBit", "GetCullMaskValue" }, // Camera3D + { "GetCursorPosition", "GetCaretColumn" }, // LineEdit + { "GetD", "GetDistance" }, // LineShape2D + { "GetDepthBiasEnable", "GetDepthBiasEnabled" }, // RDPipelineRasterizationState + { "GetDevice", "GetOutputDevice" }, // AudioServer + { "GetDeviceList", "GetOutputDeviceList" }, // AudioServer + { "GetDragDataFw", "_GetDragDataFw" }, // ScriptEditor + { "GetEditorViewport", "GetViewport" }, // EditorPlugin + { "GetEnabledFocusMode", "GetFocusMode" }, // BaseButton + { "GetEndianSwap", "IsBigEndian" }, // File + { "GetErrorString", "GetErrorMessage" }, // JSON + { "GetFocusNeighbour", "GetFocusNeighbor" }, // Control + { "GetFollowSmoothing", "GetFollowSmoothingSpeed" }, // Camera2D + { "GetFontTypes", "GetFontTypeList" }, // Theme + { "GetFrameColor", "GetColor" }, // ColorRect + { "GetGlobalRateScale", "GetPlaybackSpeedScale" }, // AudioServer + { "GetGravityDistanceScale", "GetGravityPointDistanceScale" }, //Area2D + { "GetGravityVector", "GetGravityDirection" }, //Area2D + { "GetHScrollbar", "GetHScrollBar" }, //ScrollContainer + { "GetHand", "GetTrackerHand" }, // XRPositionalTracker + { "GetHandleName", "_GetHandleName" }, // EditorNode3DGizmo + { "GetHandleValue", "_GetHandleValue" }, // EditorNode3DGizmo + { "GetIconAlign", "GetIconAlignment" }, // Button + { "GetIconTypes", "GetIconTypeList" }, // Theme + { "GetIdleFrames", "GetProcessFrames" }, // Engine + { "GetImportOptions", "_GetImportOptions" }, // EditorImportPlugin + { "GetImportOrder", "_GetImportOrder" }, // EditorImportPlugin + { "GetImporterName", "_GetImporterName" }, // EditorImportPlugin + { "GetInteriorAmbient", "GetAmbientColor" }, // ReflectionProbe + { "GetInteriorAmbientEnergy", "GetAmbientColorEnergy" }, // ReflectionProbe + { "GetIterationsPerSecond", "GetPhysicsTicksPerSecond" }, // Engine + { "GetLastMouseSpeed", "GetLastMouseVelocity" }, // Input + { "GetLayerMaskBit", "GetLayerMaskValue" }, // VisualInstance3D + { "GetLen", "GetLength" }, // File + { "GetMaxAtlasSize", "GetMaxTextureSize" }, // LightmapGI + { "GetMetakey", "IsMetaPressed" }, // InputEventWithModifiers + { "GetMidHeight", "GetHeight" }, // CapsuleMesh + { "GetMotionRemainder", "GetRemainder" }, // PhysicsTestMotionResult2D + { "GetNeighborDist", "GetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D + { "GetNetworkConnectedPeers", "GetPeers" }, // Multiplayer API + { "GetNetworkMaster", "GetMultiplayerAuthority" }, // Node + { "GetNetworkPeer", "GetMultiplayerPeer" }, // Multiplayer API + { "GetNetworkUniqueId", "GetUniqueId" }, // Multiplayer API + { "GetOneshot", "GetOneShot" }, // AnimatedTexture + { "GetOk", "GetOkButton" }, // AcceptDialog + { "GetOptionVisibility", "_GetOptionVisibility" }, // EditorImportPlugin + { "GetParameterDefaultValue", "_GetParameterDefaultValue" }, // AnimationNode + { "GetParameterList", "_GetParameterList" }, // AnimationNode + { "GetParentSpatial", "GetParentNode3d" }, // Node3D + { "GetPhysicalScancode", "GetPhysicalKeycode" }, // InputEventKey + { "GetPhysicalScancodeWithModifiers", "GetPhysicalKeycodeWithModifiers" }, // InputEventKey + { "GetPluginIcon", "_GetPluginIcon" }, // EditorPlugin + { "GetPluginName", "_GetPluginName" }, // EditorPlugin + { "GetPresetCount", "_GetPresetCount" }, // EditorImportPlugin + { "GetPresetName", "_GetPresetName" }, // EditorImportPlugin + { "GetRecognizedExtensions", "_GetRecognizedExtensions" }, // ResourceFormatLoader, EditorImportPlugin broke ResourceSaver + { "GetRenderInfo", "GetRenderingInfo" }, // RenderingServer + { "GetRenderTargetsize", "GetRenderTargetSize" }, // XRInterface + { "GetResourceType", "_GetResourceType" }, // ResourceFormatLoader + { "GetResult", "GetData" }, //JSON + { "GetReverbBus", "GetReverbBusName" }, // Area3D + { "GetRpcSenderId", "GetRemoteSenderId" }, // Multiplayer API + { "GetSaveExtension", "_GetSaveExtension" }, // EditorImportPlugin + { "GetScancode", "GetKeycode" }, // InputEventKey + { "GetScancodeString", "GetKeycodeString" }, // OS + { "GetScancodeWithModifiers", "GetKeycodeWithModifiers" }, // InputEventKey + { "GetShift", "IsShiftPressed" }, // InputEventWithModifiers + { "GetSizeOverride", "GetSize2dOverride" }, // SubViewport + { "GetSlipsOnSlope", "GetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D + { "GetSpaceOverrideMode", "GetGravitySpaceOverrideMode" }, // Area2D + { "GetSpatialNode", "GetNode3d" }, // EditorNode3DGizmo + { "GetSpeed", "GetVelocity" }, // InputEventMouseMotion + { "GetStyleboxTypes", "GetStyleboxTypeList" }, // Theme + { "GetSurfaceMaterial", "GetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh + { "GetSurfaceMaterialCount", "GetSurfaceOverrideMaterialCount" }, // MeshInstance3D + { "GetTabDisabled", "IsTabDisabled" }, // Tab + { "GetTabHidden", "IsTabHidden" }, // Tab + { "GetTextAlign", "GetTextAlignment" }, // Button + { "GetThemeItemTypes", "GetThemeItemTypeList" }, // Theme + { "GetTimerProcessMode", "GetTimerProcessCallback" }, // Timer + { "GetTranslation", "GetPosition" }, // Node3D broke GLTFNode which is used rarely + { "GetUnitDb", "GetVolumeDb" }, // AudioStreamPlayer3D + { "GetUnitOffset", "GetProgressRatio" }, // PathFollow2D, PathFollow3D + { "GetUseInBakedLight", "IsBakingNavigation" }, // GridMap + { "GetUsedCellsById", "GetUsedCells" }, // TileMap + { "GetVScrollbar", "GetVScrollBar" }, //ScrollContainer + { "GetVisibleName", "_GetVisibleName" }, // EditorImportPlugin + { "GetWindowLayout", "_GetWindowLayout" }, // EditorPlugin + { "GetWordUnderCursor", "GetWordUnderCaret" }, // TextEdit + { "GetWorld", "GetWorld3d" }, // Viewport, Spatial + { "GetZfar", "GetFar" }, // Camera3D broke GLTFCamera + { "GetZnear", "GetNear" }, // Camera3D broke GLTFCamera + { "GrooveJointCreate", "JointMakeGroove" }, // PhysicsServer2D + { "HandleMenuSelected", "_HandleMenuSelected" }, // EditorResourcePicker + { "HandlesType", "_HandlesType" }, // ResourceFormatLoader + { "HasColor", "HasThemeColor" }, // Control broke Theme + { "HasColorOverride", "HasThemeColorOverride" }, // Control broke Theme + { "HasConstant", "HasThemeConstant" }, // Control + { "HasConstantOverride", "HasThemeConstantOverride" }, // Control + { "HasFilter", "_HasFilter" }, // AnimationNode + { "HasFont", "HasThemeFont" }, // Control broke Theme + { "HasFontOverride", "HasThemeFontOverride" }, // Control + { "HasIcon", "HasThemeIcon" }, // Control broke Theme + { "HasIconOverride", "HasThemeIconOverride" }, // Control + { "HasMainScreen", "_HasMainScreen" }, // EditorPlugin + { "HasNetworkPeer", "HasMultiplayerPeer" }, // Multiplayer API + { "HasStylebox", "HasThemeStylebox" }, // Control broke Theme + { "HasStyleboxOverride", "HasThemeStyleboxOverride" }, // Control + { "HttpEscape", "UriEncode" }, // String + { "HttpUnescape", "UriDecode" }, // String + { "ImportAnimationFromOtherImporter", "_ImportAnimation" }, //EditorSceneFormatImporter + { "ImportSceneFromOtherImporter", "_ImportScene" }, //EditorSceneFormatImporter + { "InstanceSetSurfaceMaterial", "InstanceSetSurfaceOverrideMaterial" }, // RenderingServer + { "IntersectPolygons2d", "IntersectPolygons" }, // Geometry2D + { "IntersectPolylineWithPolygon2d", "IntersectPolylineWithPolygon" }, // Geometry2D + { "IsAParentOf", "IsAncestorOf" }, // Node + { "IsCommitingAction", "IsCommittingAction" }, // UndoRedo + { "IsDoubleclick", "IsDoubleClick" }, // InputEventMouseButton + { "IsFollowSmoothingEnabled", "IsPositionSmoothingEnabled" }, // Camera2D + { "IsHDragEnabled", "IsDragHorizontalEnabled" }, // Camera2D + { "IsHandleHighlighted", "_IsHandleHighlighted" }, // EditorNode3DGizmo, EditorNode3DGizmoPlugin + { "IsNetworkMaster", "IsMultiplayerAuthority" }, // Node + { "IsNetworkServer", "IsServer" }, // Multiplayer API + { "IsNormalmap", "IsNormalMap" }, // NoiseTexture + { "IsRefusingNewNetworkConnections", "IsRefusingNewConnections" }, // Multiplayer API + { "IsRegion", "IsRegionEnabled" }, // Sprite2D + { "IsRotating", "IsIgnoringRotation" }, // Camera2D + { "IsScancodeUnicode", "IsKeycodeUnicode" }, // OS + { "IsSelectableWhenHidden", "_IsSelectableWhenHidden" }, // EditorNode3DGizmoPlugin + { "IsSetAsToplevel", "IsSetAsTopLevel" }, // CanvasItem + { "IsShortcut", "MatchesEvent" }, // Shortcut + { "IsSizeOverrideStretchEnabled", "IsSize2dOverrideStretchEnabled" }, // SubViewport + { "IsSortEnabled", "IsYSortEnabled" }, // Node2D + { "IsStaticBody", "IsAbleToSleep" }, // PhysicalBone3D - TODO - not sure + { "IsVDragEnabled", "IsDragVerticalEnabled" }, // Camera2D + { "JointCreateConeTwist", "JointMakeConeTwist" }, // PhysicsServer3D + { "JointCreateGeneric6dof", "JointMakeGeneric6dof" }, // PhysicsServer3D + { "JointCreateHinge", "JointMakeHinge" }, // PhysicsServer3D + { "JointCreatePin", "JointMakePin" }, // PhysicsServer3D + { "JointCreateSlider", "JointMakeSlider" }, // PhysicsServer3D + { "LineIntersectsLine2d", "LineIntersectsLine" }, // Geometry2D + { "LoadFromGlobals", "LoadFromProjectSettings" }, // InputMap + { "MakeConvexFromBrothers", "MakeConvexFromSiblings" }, // CollisionShape3D + { "MergePolygons2d", "MergePolygons" }, // Geometry2D + { "MeshSurfaceGetFormat", "MeshSurfaceGetFormatAttributeStride" }, // RenderingServer + { "MeshSurfaceUpdateRegion", "MeshSurfaceUpdateAttributeRegion" }, // RenderingServer + { "MoveToBottom", "MoveAfter" }, // Skeleton3D + { "MoveToTop", "MoveBefore" }, // Skeleton3D + { "MultimeshAllocate", "MultimeshAllocateData" }, // RenderingServer + { "NormalmapToXy", "NormalMapToXy" }, // Image + { "OffsetPolygon2d", "OffsetPolygon" }, // Geometry2D + { "OffsetPolyline2d", "OffsetPolyline" }, // Geometry2D + { "PercentDecode", "UriDecode" }, // String + { "PercentEncode", "UriEncode" }, // String + { "PinJointCreate", "JointMakePin" }, // PhysicsServer2D + { "PopupCenteredMinsize", "PopupCenteredClamped" }, // Window + { "PostImport", "_PostImport" }, // EditorScenePostImport + { "PrintStrayNodes", "PrintOrphanNodes" }, // Node + { "PropertyListChangedNotify", "NotifyPropertyListChanged" }, // Object + { "Recognize", "_Recognize" }, // ResourceFormatLoader + { "RegenNormalmaps", "RegenNormalMaps" }, // ArrayMesh + { "Remove", "RemoveAt" }, // Array, broke Directory + { "RemoveAnimation", "RemoveAnimationLibrary" }, // AnimationPlayer + { "RemoveColorOverride", "RemoveThemeColorOverride" }, // Control + { "RemoveConstantOverride", "RemoveThemeConstantOverride" }, // Control + { "RemoveFontOverride", "RemoveThemeFontOverride" }, // Control + { "RemoveSceneImportPlugin", "RemoveSceneFormatImporterPlugin" }, //EditorPlugin + { "RemoveSpatialGizmoPlugin", "RemoveNode3dGizmoPlugin" }, // EditorPlugin + { "RemoveStyleboxOverride", "RemoveThemeStyleboxOverride" }, // Control + { "RenameAnimation", "RenameAnimationLibrary" }, // AnimationPlayer + { "RenameDependencies", "_RenameDependencies" }, // ResourceFormatLoader + { "SaveExternalData", "_SaveExternalData" }, // EditorPlugin + { "SegmentIntersectsSegment2d", "SegmentIntersectsSegment" }, // Geometry2D + { "SetAdjustmentEnable", "SetAdjustmentEnabled" }, // Environment + { "SetAlt", "SetAltPressed" }, // InputEventWithModifiers + { "SetAnchorAndMargin", "SetAnchorAndOffset" }, // Control + { "SetAnchorsAndMarginsPreset", "SetAnchorsAndOffsetsPreset" }, // Control + { "SetAnimationProcessMode", "SetProcessCallback" }, // AnimationPlayer + { "SetAsBulkArray", "SetBuffer" }, // MultiMesh + { "SetAsNormalmap", "SetAsNormalMap" }, // NoiseTexture + { "SetAsToplevel", "SetAsTopLevel" }, // CanvasItem + { "SetAudioBus", "SetAudioBusName" }, // Area3D + { "SetAutowrap", "SetAutowrapMode" }, // Label broke AcceptDialog + { "SetCastTo", "SetTargetPosition" }, // RayCast2D, RayCast3D + { "SetCollisionLayerBit", "SetCollisionLayerValue" }, // CSGShape3D and a lot of others like GridMap + { "SetCollisionMaskBit", "SetCollisionMaskValue" }, // CSGShape3D and a lot of others like GridMap + { "SetColumnMinWidth", "SetColumnCustomMinimumWidth" }, // Tree + { "SetCommand", "SetCommandPressed" }, // InputEventWithModifiers + { "SetControl", "SetCtrlPressed" }, // InputEventWithModifiers + { "SetCreateOptions", "_SetCreateOptions" }, // EditorResourcePicker + { "SetCullMaskBit", "SetCullMaskValue" }, // Camera3D + { "SetCursorPosition", "SetCaretColumn" }, // LineEdit + { "SetD", "SetDistance" }, // WorldMarginShape2D + { "SetDepthBiasEnable", "SetDepthBiasEnabled" }, // RDPipelineRasterizationState + { "SetDevice", "SetOutputDevice" }, // AudioServer + { "SetDoubleclick", "SetDoubleClick" }, // InputEventMouseButton + { "SetEnableFollowSmoothing", "SetFollowSmoothingEnabled" }, // Camera2D + { "SetEnabledFocusMode", "SetFocusMode" }, // BaseButton + { "SetEndianSwap", "SetBigEndian" }, // File + { "SetExpandToTextLength", "SetExpandToTextLengthEnabled" }, // LineEdit + { "SetFocusNeighbour", "SetFocusNeighbor" }, // Control + { "SetFollowSmoothing", "SetFollowSmoothingSpeed" }, // Camera2D + { "SetFrameColor", "SetColor" }, // ColorRect + { "SetGlobalRateScale", "SetPlaybackSpeedScale" }, // AudioServer + { "SetGravityDistanceScale", "SetGravityPointDistanceScale" }, // Area2D + { "SetGravityVector", "SetGravityDirection" }, // Area2D + { "SetHDragEnabled", "SetDragHorizontalEnabled" }, // Camera2D + { "SetIconAlign", "SetIconAlignment" }, // Button + { "SetInteriorAmbient", "SetAmbientColor" }, // ReflectionProbe + { "SetInteriorAmbientEnergy", "SetAmbientColorEnergy" }, // ReflectionProbe + { "SetIsInitialized", "_IsInitialized" }, // XRInterface + { "SetIsPrimary", "SetPrimary" }, // XRInterface + { "SetIterationsPerSecond", "SetPhysicsTicksPerSecond" }, // Engine + { "SetLayerMaskBit", "SetLayerMaskValue" }, // VisualInstance3D + { "SetMarginsPreset", "SetOffsetsPreset" }, // Control + { "SetMaxAtlasSize", "SetMaxTextureSize" }, // LightmapGI + { "SetMetakey", "SetMetaPressed" }, // InputEventWithModifiers + { "SetMidHeight", "SetHeight" }, // CapsuleMesh + { "SetNeighborDist", "SetNeighborDistance" }, // NavigationAgent2D, NavigationAgent3D + { "SetNetworkMaster", "SetMultiplayerAuthority" }, // Node + { "SetNetworkPeer", "SetMultiplayerPeer" }, // Multiplayer API + { "SetOneshot", "SetOneShot" }, // AnimatedTexture + { "SetPhysicalScancode", "SetPhysicalKeycode" }, // InputEventKey + { "SetProximityFade", "SetProximityFadeEnabled" }, // Material + { "SetRefuseNewNetworkConnections", "SetRefuseNewConnections" }, // Multiplayer API + { "SetRegion", "SetRegionEnabled" }, // Sprite2D, Sprite broke AtlasTexture + { "SetRegionFilterClip", "SetRegionFilterClipEnabled" }, // Sprite2D + { "SetReverbBus", "SetReverbBusName" }, // Area3D + { "SetRotate", "SetRotates" }, // PathFollow2D + { "SetScancode", "SetKeycode" }, // InputEventKey + { "SetShift", "SetShiftPressed" }, // InputEventWithModifiers + { "SetSizeOverride", "SetSize2dOverride" }, // SubViewport broke ImageTexture + { "SetSizeOverrideStretch", "SetSize2dOverrideStretch" }, // SubViewport + { "SetSlipsOnSlope", "SetSlideOnSlope" }, // SeparationRayShape2D, SeparationRayShape3D + { "SetSortEnabled", "SetYSortEnabled" }, // Node2D + { "SetSpaceOverrideMode", "SetGravitySpaceOverrideMode" }, // Area2D + { "SetSpatialNode", "SetNode3d" }, // EditorNode3DGizmo + { "SetSpeed", "SetVelocity" }, // InputEventMouseMotion + { "SetSsaoEdgeSharpness", "SetSsaoSharpness" }, // Environment + { "SetSurfaceMaterial", "SetSurfaceOverrideMaterial" }, // MeshInstance3D broke ImporterMesh + { "SetTabAlign", "SetTabAlignment" }, //TabContainer + { "SetTangent", "SurfaceSetTangent" }, // ImmediateGeometry broke SurfaceTool + { "SetTextAlign", "SetTextAlignment" }, // Button + { "SetTimerProcessMode", "SetTimerProcessCallback" }, // Timer + { "SetTonemapAutoExposure", "SetTonemapAutoExposureEnabled" }, // Environment + { "SetTranslation", "SetPosition" }, // Node3D - this broke GLTFNode which is used rarely + { "SetUnitDb", "SetVolumeDb" }, // AudioStreamPlayer3D + { "SetUnitOffset", "SetProgressRatio" }, // PathFollow2D, PathFollow3D + { "SetUv2", "SurfaceSetUv2" }, // ImmediateMesh broke Surffacetool + { "SetVDragEnabled", "SetDragVerticalEnabled" }, // Camera2D + { "SetValign", "SetVerticalAlignment" }, // Label + { "SetWindowLayout", "_SetWindowLayout" }, // EditorPlugin + { "SetZfar", "SetFar" }, // Camera3D broke GLTFCamera + { "SetZnear", "SetNear" }, // Camera3D broke GLTFCamera + { "ShortcutMatch", "IsMatch" }, // InputEvent + { "SkeletonAllocate", "SkeletonAllocateData" }, // RenderingServer + { "SurfaceUpdateRegion", "SurfaceUpdateAttributeRegion" }, // ArrayMesh + { "TargetingMethod", "TweenMethod" }, // Tween + { "TargetingProperty", "TweenProperty" }, // Tween + { "TrackRemoveKeyAtPosition", "TrackRemoveKeyAtTime" }, // Animation + { "TriangulateDelaunay2d", "TriangulateDelaunay" }, // Geometry2D + { "UnbindChildNodeFromBone", "RemoveBoneChild" }, // Skeleton3D + { "Unselect", "Deselect" }, // ItemList + { "UnselectAll", "DeselectAll" }, // ItemList + { "UpdateConfigurationWarning", "UpdateConfigurationWarnings" }, // Node + { "UpdateGizmo", "UpdateGizmos" }, // Node3D + { "ViewportSetUseArvr", "ViewportSetUseXr" }, // RenderingServer + { "WarpMousePosition", "WarpMouse" }, // Input + { "WorldToMap", "LocalToMap" }, // TileMap, GridMap + { "SetShaderParam", "SetShaderParameter" }, // ShaderMaterial + { "GetShaderParam", "GetShaderParameter" }, // ShaderMaterial + { "SetUniformName", "SetParameterName" }, // ParameterRef + { "GetUniformName", "GetParameterName" }, // ParameterRef + + // Builtin types + // { "Empty", "IsEmpty" }, // Array - Used as custom rule // Be careful, this will be used everywhere + { "Clamped", "Clamp" }, // Vector2 // Be careful, this will be used everywhere + { "GetRotationQuat", "GetRotationQuaternion" }, // Basis + { "GrowMargin", "GrowSide" }, // Rect2 + { "Invert", "Reverse" }, // Array - TODO check // Be careful, this will be used everywhere + { "IsAbsPath", "IsAbsolutePath" }, // String + { "IsValidInteger", "IsValidInt" }, // String + { "LinearInterpolate", "Lerp" }, // Color + { "ToAscii", "ToAsciiBuffer" }, // String + { "ToUtf8", "ToUtf8Buffer" }, // String + { "ToWchar", "ToUtf32Buffer" }, // String // TODO - utf32 or utf16? + + // @GlobalScope + { "Bytes2Var", "BytesToVar" }, + { "Bytes2VarWithObjects", "BytesToVarWithObjects" }, + { "Db2Linear", "DbToLinear" }, + { "Deg2Rad", "DegToRad" }, + { "Linear2Db", "LinearToDb" }, + { "Rad2Deg", "RadToDeg" }, + { "RandRange", "RandfRange" }, + { "RangeLerp", "Remap" }, + { "Stepify", "Snapped" }, + { "Str2Var", "StrToVar" }, + { "Var2Str", "VarToStr" }, + { "Var2Bytes", "VarToBytes" }, + { "Var2BytesWithObjects", "VarToBytesWithObjects" }, + + // @GDScript + { "Dict2Inst", "DictToInst" }, + { "Inst2Dict", "InstToDict" }, + + { nullptr, nullptr }, +}; + +// Some needs to be disabled, because users can use this names as variables +const char *RenamesMap3To4::gdscript_properties_renames[][2] = { + // // { "d", "distance" }, //WorldMarginShape2D - TODO, looks that polish letters Ä… Ä™ are treaten as space, not as letter, so `bÄ™dÄ…` are renamed to `bÄ™distanceÄ…` + // // {"alt","alt_pressed"}, // This may broke a lot of comments and user variables + // // {"command","command_pressed"},// This may broke a lot of comments and user variables + // // {"control","ctrl_pressed"},// This may broke a lot of comments and user variables + // // {"extends","size"}, // BoxShape3D, LightmapGI broke ReflectionProbe + // // {"meta","meta_pressed"},// This may broke a lot of comments and user variables + // // {"pause_mode","process_mode"}, // Node - Cyclic rename, look for others + // // {"rotate","rotates"}, // PathFollow2D - probably function exists with same name + // // {"offset","progress"}, // PathFollow2D, PathFollow3D - Name is way too vague + // // {"shift","shift_pressed"},// This may broke a lot of comments and user variables + // { "autowrap", "autowrap_mode" }, // Label + // { "cast_to", "target_position" }, // RayCast2D, RayCast3D + // { "device", "output_device"}, // AudioServer - Too vague, most likely breaks comments & variables + // { "doubleclick", "double_click" }, // InputEventMouseButton + // { "group", "button_group" }, // BaseButton + // { "process_mode", "process_callback" }, // AnimationTree, Camera2D + // { "scancode", "keycode" }, // InputEventKey + // { "toplevel", "top_level" }, // Node + // { "window_title", "title" }, // Window + // { "wrap_enabled", "wrap_mode" }, // TextEdit + // { "zfar", "far" }, // Camera3D + // { "znear", "near" }, // Camera3D + // { "filename", "scene_file_path" }, // Node + // { "pressed", "button_pressed" }, // BaseButton - Will also rename the signal, skipping for now + { "as_normalmap", "as_normal_map" }, // NoiseTexture + { "bbcode_text", "text" }, // RichTextLabel + { "bg", "panel" }, // Theme + { "bg_focus", "focus" }, // Theme + { "capture_device", "input_device" }, // AudioServer + { "caret_blink_speed", "caret_blink_interval" }, // TextEdit, LineEdit + { "caret_moving_by_right_click", "caret_move_on_right_click" }, // TextEdit + { "caret_position", "caret_column" }, // LineEdit + { "check_vadjust", "check_v_offset" }, // Theme + { "close_h_ofs", "close_h_offset" }, // Theme + { "close_v_ofs", "close_v_offset" }, // Theme + { "commentfocus", "comment_focus" }, // Theme + { "contacts_reported", "max_contacts_reported" }, // RigidBody + { "depth_bias_enable", "depth_bias_enabled" }, // RDPipelineRasterizationState + { "drag_margin_bottom", "drag_bottom_margin" }, // Camera2D + { "drag_margin_h_enabled", "drag_horizontal_enabled" }, // Camera2D + { "drag_margin_left", "drag_left_margin" }, // Camera2D + { "drag_margin_right", "drag_right_margin" }, // Camera2D + { "drag_margin_top", "drag_top_margin" }, // Camera2D + { "drag_margin_v_enabled", "drag_vertical_enabled" }, // Camera2D + { "enabled_focus_mode", "focus_mode" }, // BaseButton - Removed + { "extra_spacing_bottom", "spacing_bottom" }, // Font + { "extra_spacing_top", "spacing_top" }, // Font + { "focus_neighbour_bottom", "focus_neighbor_bottom" }, // Control + { "focus_neighbour_left", "focus_neighbor_left" }, // Control + { "focus_neighbour_right", "focus_neighbor_right" }, // Control + { "focus_neighbour_top", "focus_neighbor_top" }, // Control + { "follow_viewport_enable", "follow_viewport_enabled" }, // CanvasItem + { "file_icon_modulate", "file_icon_color" }, // Theme + { "files_disabled", "file_disabled_color" }, // Theme + { "folder_icon_modulate", "folder_icon_color" }, // Theme + { "global_rate_scale", "playback_speed_scale" }, // AudioServer + { "gravity_distance_scale", "gravity_point_unit_distance" }, // Area(2D/3D) + { "gravity_vec", "gravity_direction" }, // Area(2D/3D) + { "hint_tooltip", "tooltip_text" }, // Control + { "hseparation", "h_separation" }, // Theme + { "icon_align", "icon_alignment" }, // Button + { "iterations_per_second", "physics_ticks_per_second" }, // Engine + { "invert_enable", "invert_enabled" }, // Polygon2D + { "margin_bottom", "offset_bottom" }, // Control broke NinePatchRect, StyleBox + { "margin_left", "offset_left" }, // Control broke NinePatchRect, StyleBox + { "margin_right", "offset_right" }, // Control broke NinePatchRect, StyleBox + { "margin_top", "offset_top" }, // Control broke NinePatchRect, StyleBox + { "mid_height", "height" }, // CapsuleMesh + { "neighbor_dist", "neighbor_distance" }, // NavigationAgent2D, NavigationAgent3D + { "offset_h", "drag_horizontal_offset" }, // Camera2D + { "offset_v", "drag_vertical_offset" }, // Camera2D + { "off", "unchecked" }, // Theme + { "off_disabled", "unchecked_disabled" }, // Theme + { "ofs", "offset" }, // Theme + { "on", "checked" }, // Theme + { "on_disabled", "checked_disabled" }, // Theme + { "oneshot", "one_shot" }, // AnimatedTexture + { "out_of_range_mode", "max_polyphony" }, // AudioStreamPlayer3D + { "pause_mode", "process_mode" }, // Node + { "physical_scancode", "physical_keycode" }, // InputEventKey + { "popup_exclusive", "exclusive" }, // Window + { "proximity_fade_enable", "proximity_fade_enabled" }, // Material + { "rect_position", "position" }, // Control + { "rect_global_position", "global_position" }, // Control + { "rect_size", "size" }, // Control + { "rect_min_size", "custom_minimum_size" }, // Control + { "rect_rotation", "rotation" }, // Control + { "rect_scale", "scale" }, // Control + { "rect_pivot_offset", "pivot_offset" }, // Control + { "rect_clip_content", "clip_contents" }, // Control + { "refuse_new_network_connections", "refuse_new_connections" }, // MultiplayerAPI + { "region_filter_clip", "region_filter_clip_enabled" }, // Sprite2D + { "reverb_bus_enable", "reverb_bus_enabled" }, // Area3D + { "selectedframe", "selected_frame" }, // Theme + { "size_override_stretch", "size_2d_override_stretch" }, // SubViewport + { "slips_on_slope", "slide_on_slope" }, // SeparationRayShape2D + { "smoothing_enabled", "follow_smoothing_enabled" }, // Camera2D + { "smoothing_speed", "position_smoothing_speed" }, // Camera2D + { "ss_reflections_depth_tolerance", "ssr_depth_tolerance" }, // Environment + { "ss_reflections_enabled", "ssr_enabled" }, // Environment + { "ss_reflections_fade_in", "ssr_fade_in" }, // Environment + { "ss_reflections_fade_out", "ssr_fade_out" }, // Environment + { "ss_reflections_max_steps", "ssr_max_steps" }, // Environment + { "state_machine_selectedframe", "state_machine_selected_frame" }, // Theme + { "syntax_highlighting", "syntax_highlighter" }, // TextEdit + { "tab_align", "tab_alignment" }, // TabContainer + { "table_hseparation", "table_h_separation" }, // Theme + { "table_vseparation", "table_v_separation" }, // Theme + { "translation", "position" }, // Node3D - broke GLTFNode + { "unit_db", "volume_db" }, // AudioStreamPlayer3D + { "unit_offset", "progress_ratio" }, // PathFollow2D, PathFollow3D + { "vseparation", "v_separation" }, // Theme + { "frames", "sprite_frames" }, // AnimatedSprite2D, AnimatedSprite3D + + { nullptr, nullptr }, +}; + +// Some needs to be disabled, because users can use this names as variables +const char *RenamesMap3To4::csharp_properties_renames[][2] = { + // // { "D", "Distance" }, //WorldMarginShape2D - TODO, looks that polish letters Ä… Ä™ are treaten as space, not as letter, so `bÄ™dÄ…` are renamed to `bÄ™distanceÄ…` + // // {"Alt","AltPressed"}, // This may broke a lot of comments and user variables + // // {"Command","CommandPressed"},// This may broke a lot of comments and user variables + // // {"Control","CtrlPressed"},// This may broke a lot of comments and user variables + // // {"Extends","Size"}, // BoxShape3D, LightmapGI broke ReflectionProbe + // // {"Meta","MetaPressed"},// This may broke a lot of comments and user variables + // // {"PauseMode","ProcessMode"}, // Node - Cyclic rename, look for others + // // {"Rotate","Rotates"}, // PathFollow2D - probably function exists with same name + // // {"Offset","Progress"}, // PathFollow2D, PathFollow3D - Name is way too vague + // // {"Shift","ShiftPressed"},// This may broke a lot of comments and user variables + // { "Autowrap", "AutowrapMode" }, // Label + // { "CastTo", "TargetPosition" }, // RayCast2D, RayCast3D + // { "Doubleclick", "DoubleClick" }, // InputEventMouseButton + // { "Group", "ButtonGroup" }, // BaseButton + // { "PercentVisible, "ShowPercentage}, // ProgressBar, conflicts with Label and RichTextLabel, but may be a worth it. + // { "ProcessMode", "ProcessCallback" }, // AnimationTree, Camera2D + // { "Scancode", "Keycode" }, // InputEventKey + // { "Toplevel", "TopLevel" }, // Node + // { "WindowTitle", "Title" }, // Window + // { "WrapEnabled", "WrapMode" }, // TextEdit + // { "Zfar", "Far" }, // Camera3D + // { "Znear", "Near" }, // Camera3D + // { "Pressed", "ButtonPressed" }, // BaseButton - Will also rename the signal, skipping for now + { "AsNormalmap", "AsNormalMap" }, // NoiseTexture + { "BbcodeText", "Text" }, // RichTextLabel + { "CaretBlinkSpeed", "CaretBlinkInterval" }, // TextEdit, LineEdit + { "CaretMovingByRightClick", "CaretMoveOnRightClick" }, // TextEdit + { "CaretPosition", "CaretColumn" }, // LineEdit + { "CheckVadjust", "CheckVAdjust" }, // Theme + { "CloseHOfs", "CloseHOffset" }, // Theme + { "CloseVOfs", "CloseVOffset" }, // Theme + { "Commentfocus", "CommentFocus" }, // Theme + { "DepthBiasEnable", "DepthBiasEnabled" }, // RDPipelineRasterizationState + { "DragMarginBottom", "DragBottomMargin" }, // Camera2D + { "DragMarginHEnabled", "DragHorizontalEnabled" }, // Camera2D + { "DragMarginLeft", "DragLeftMargin" }, // Camera2D + { "DragMarginRight", "DragRightMargin" }, // Camera2D + { "DragMarginTop", "DragTopMargin" }, // Camera2D + { "DragMarginVEnabled", "DragVerticalEnabled" }, // Camera2D + { "EnabledFocusMode", "FocusMode" }, // BaseButton - Removed + { "ExtraSpacingBottom", "SpacingBottom" }, // Font + { "ExtraSpacingTop", "SpacingTop" }, // Font + { "FocusNeighbourBottom", "FocusNeighborBottom" }, // Control + { "FocusNeighbourLeft", "FocusNeighborLeft" }, // Control + { "FocusNeighbourRight", "FocusNeighborRight" }, // Control + { "FocusNeighbourTop", "FocusNeighborTop" }, // Control + { "FollowViewportEnable", "FollowViewportEnabled" }, // CanvasItem + { "GlobalRateScale", "PlaybackSpeedScale" }, // AudioServer + { "GravityDistanceScale", "GravityPointDistanceScale" }, // Area2D + { "GravityVec", "GravityDirection" }, // Area2D + { "HintTooltip", "TooltipText" }, // Control + { "Hseparation", "HSeparation" }, // Theme + { "IconAlign", "IconAlignment" }, // Button + { "IterationsPerSecond", "PhysicsTicksPerSecond" }, // Engine + { "InvertEnable", "InvertEnabled" }, // Polygon2D + { "MarginBottom", "OffsetBottom" }, // Control broke NinePatchRect, StyleBox + { "MarginLeft", "OffsetLeft" }, // Control broke NinePatchRect, StyleBox + { "MarginRight", "OffsetRight" }, // Control broke NinePatchRect, StyleBox + { "MarginTop", "OffsetTop" }, // Control broke NinePatchRect, StyleBox + { "MidHeight", "Height" }, // CapsuleMesh + { "NeighborDist", "NeighborDistance" }, // NavigationAgent2D, NavigationAgent3D + { "OffsetH", "DragHorizontalOffset" }, // Camera2D + { "OffsetV", "DragVerticalOffset" }, // Camera2D + { "Ofs", "Offset" }, // Theme + { "Oneshot", "OneShot" }, // AnimatedTexture + { "OutOfRangeMode", "MaxPolyphony" }, // AudioStreamPlayer3D + { "PauseMode", "ProcessMode" }, // Node + { "PhysicalScancode", "PhysicalKeycode" }, // InputEventKey + { "PopupExclusive", "Exclusive" }, // Window + { "ProximityFadeEnable", "ProximityFadeEnabled" }, // Material + { "RectPosition", "Position" }, // Control + { "RectGlobalPosition", "GlobalPosition" }, // Control + { "RectSize", "Size" }, // Control + { "RectMinSize", "CustomMinimumSize" }, // Control + { "RectRotation", "Rotation" }, // Control + { "RectScale", "Scale" }, // Control + { "RectPivotOffset", "PivotOffset" }, // Control + { "RectClipContent", "ClipContents" }, // Control + { "RefuseNewNetworkConnections", "RefuseNewConnections" }, // MultiplayerAPI + { "RegionFilterClip", "RegionFilterClipEnabled" }, // Sprite2D + { "ReverbBusEnable", "ReverbBusEnabled" }, // Area3D + { "Selectedframe", "SelectedFrame" }, // Theme + { "SizeOverrideStretch", "Size2dOverrideStretch" }, // SubViewport + { "SlipsOnSlope", "SlideOnSlope" }, // SeparationRayShape2D + { "SmoothingEnabled", "FollowSmoothingEnabled" }, // Camera2D + { "SmoothingSpeed", "FollowSmoothingSpeed" }, // Camera2D + { "SsReflectionsDepthTolerance", "SsrDepthTolerance" }, // Environment + { "SsReflectionsEnabled", "SsrEnabled" }, // Environment + { "SsReflectionsFadeIn", "SsrFadeIn" }, // Environment + { "SsReflectionsFadeOut", "SsrFadeOut" }, // Environment + { "SsReflectionsMaxSteps", "SsrMaxSteps" }, // Environment + { "StateMachineSelectedframe", "StateMachineSelectedFrame" }, // Theme + { "SyntaxHighlighting", "SyntaxHighlighter" }, // TextEdit + { "TabAlign", "TabAlignment" }, // TabContainer + { "TableHseparation", "TableHSeparation" }, // Theme + { "TableVseparation", "TableVSeparation" }, // Theme + { "Translation", "Position" }, // Node3D - broke GLTFNode + { "UnitDb", "VolumeDb" }, // AudioStreamPlayer3D + { "UnitOffset", "ProgressRatio" }, // PathFollow2D, PathFollow3D + { "Vseparation", "VSeparation" }, // Theme + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::gdscript_signals_renames[][2] = { + // {"instantiate","instance"}, // FileSystemDock + // { "hide", "hidden" }, // CanvasItem - function with same name exists + // { "tween_all_completed","loop_finished"}, // Tween - TODO, not sure + // {"changed","settings_changed"}, // EditorSettings + { "about_to_show", "about_to_popup" }, // Popup + { "button_release", "button_released" }, // XRController3D + { "cancelled", "canceled" }, // AcceptDialog + { "item_double_clicked", "item_icon_double_clicked" }, // Tree + { "network_peer_connected", "peer_connected" }, // MultiplayerAPI + { "network_peer_disconnected", "peer_disconnected" }, // MultiplayerAPI + { "network_peer_packet", "peer_packet" }, // MultiplayerAPI + { "node_unselected", "node_deselected" }, // GraphEdit + { "offset_changed", "position_offset_changed" }, // GraphNode + { "settings_changed", "changed" }, // TileMap broke EditorSettings + { "skeleton_updated", "pose_updated" }, // + { "tab_close", "tab_closed" }, // TextEdit + { "tab_hover", "tab_hovered" }, // TextEdit + { "text_entered", "text_submitted" }, // LineEdit + { "tween_completed", "finished" }, // Tween + { "tween_step", "step_finished" }, // Tween + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::csharp_signals_renames[][2] = { + // {"Instantiate","Instance"}, // FileSystemDock + // { "Hide", "Hidden" }, // CanvasItem - function with same name exists + // { "TweenAllCompleted","LoopFinished"}, // Tween - TODO, not sure + // {"Changed","SettingsChanged"}, // EditorSettings + { "AboutToShow", "AboutToPopup" }, // Popup + { "ButtonRelease", "ButtonReleased" }, // XRController3D + { "NetworkPeerConnected", "PeerConnected" }, // MultiplayerAPI + { "NetworkPeerDisconnected", "PeerDisconnected" }, // MultiplayerAPI + { "NetworkPeerPacket", "PeerPacket" }, // MultiplayerAPI + { "NodeUnselected", "NodeDeselected" }, // GraphEdit + { "OffsetChanged", "PositionOffsetChanged" }, // GraphNode + { "SettingsChanged", "Changed" }, // TileMap broke EditorSettings + { "SkeletonUpdated", "PoseUpdated" }, // + { "TabClose", "TabClosed" }, // TextEdit + { "TabHover", "TabHovered" }, // TextEdit + { "TextEntered", "TextSubmitted" }, // LineEdit + { "TweenCompleted", "Finished" }, // Tween + { "TweenStep", "StepFinished" }, // Tween + + { nullptr, nullptr }, + +}; + +const char *RenamesMap3To4::project_settings_renames[][2] = { + { "audio/channel_disable_threshold_db", "audio/buses/channel_disable_threshold_db" }, + { "audio/channel_disable_time", "audio/buses/channel_disable_time" }, + { "audio/default_bus_layout", "audio/buses/default_bus_layout" }, + { "audio/driver", "audio/driver/driver" }, + { "audio/enable_audio_input", "audio/driver/enable_input" }, + { "audio/mix_rate", "audio/driver/mix_rate" }, + { "audio/output_latency", "audio/driver/output_latency" }, + { "audio/output_latency.web", "audio/driver/output_latency.web" }, + { "audio/video_delay_compensation_ms", "audio/video/video_delay_compensation_ms" }, + { "display/window/vsync/use_vsync", "display/window/vsync/vsync_mode" }, + { "editor/main_run_args", "editor/run/main_run_args" }, + { "gui/common/swap_ok_cancel", "gui/common/swap_cancel_ok" }, + { "network/limits/debugger_stdout/max_chars_per_second", "network/limits/debugger/max_chars_per_second" }, + { "network/limits/debugger_stdout/max_errors_per_second", "network/limits/debugger/max_errors_per_second" }, + { "network/limits/debugger_stdout/max_messages_per_frame", "network/limits/debugger/max_queued_messages" }, + { "network/limits/debugger_stdout/max_warnings_per_second", "network/limits/debugger/max_warnings_per_second" }, + { "network/ssl/certificates", "network/tls/certificate_bundle_override" }, + { "physics/2d/thread_model", "physics/2d/run_on_thread" }, // TODO not sure + { "rendering/environment/default_clear_color", "rendering/environment/defaults/default_clear_color" }, + { "rendering/environment/default_environment", "rendering/environment/defaults/default_environment" }, + { "rendering/quality/depth_prepass/disable_for_vendors", "rendering/driver/depth_prepass/disable_for_vendors" }, + { "rendering/quality/depth_prepass/enable", "rendering/driver/depth_prepass/enable" }, + { "rendering/quality/shading/force_blinn_over_ggx", "rendering/shading/overrides/force_blinn_over_ggx" }, + { "rendering/quality/shading/force_blinn_over_ggx.mobile", "rendering/shading/overrides/force_blinn_over_ggx.mobile" }, + { "rendering/quality/shading/force_lambert_over_burley", "rendering/shading/overrides/force_lambert_over_burley" }, + { "rendering/quality/shading/force_lambert_over_burley.mobile", "rendering/shading/overrides/force_lambert_over_burley.mobile" }, + { "rendering/quality/shading/force_vertex_shading", "rendering/shading/overrides/force_vertex_shading" }, + { "rendering/quality/shading/force_vertex_shading.mobile", "rendering/shading/overrides/force_vertex_shading.mobile" }, + { "rendering/quality/shadow_atlas/quadrant_0_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_0_subdiv" }, + { "rendering/quality/shadow_atlas/quadrant_1_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_1_subdiv" }, + { "rendering/quality/shadow_atlas/quadrant_2_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_2_subdiv" }, + { "rendering/quality/shadow_atlas/quadrant_3_subdiv", "rendering/lights_and_shadows/shadow_atlas/quadrant_3_subdiv" }, + { "rendering/quality/shadow_atlas/size", "rendering/lights_and_shadows/shadow_atlas/size" }, + { "rendering/quality/shadow_atlas/size.mobile", "rendering/lights_and_shadows/shadow_atlas/size.mobile" }, + { "rendering/vram_compression/import_etc2", "rendering/textures/vram_compression/import_etc2_astc" }, + { "rendering/vram_compression/import_s3tc", "rendering/textures/vram_compression/import_s3tc_bptc" }, + { "window/size/width", "window/size/viewport_width" }, + { "window/size/height", "window/size/viewport_height" }, + { "window/size/test_width", "window/size/window_width_override" }, + { "window/size/test_height", "window/size/window_height_override" }, + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::input_map_renames[][2] = { + { ",\"alt\":", ",\"alt_pressed\":" }, + { ",\"shift\":", ",\"shift_pressed\":" }, + { ",\"control\":", ",\"ctrl_pressed\":" }, + { ",\"meta\":", ",\"meta_pressed\":" }, + { ",\"scancode\":", ",\"keycode\":" }, + { ",\"physical_scancode\":", ",\"physical_keycode\":" }, + { ",\"doubleclick\":", ",\"double_click\":" }, + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::builtin_types_renames[][2] = { + { "PoolByteArray", "PackedByteArray" }, + { "PoolColorArray", "PackedColorArray" }, + { "PoolIntArray", "PackedInt32Array" }, + { "PoolRealArray", "PackedFloat32Array" }, + { "PoolStringArray", "PackedStringArray" }, + { "PoolVector2Array", "PackedVector2Array" }, + { "PoolVector3Array", "PackedVector3Array" }, + { "Quat", "Quaternion" }, + { "Transform", "Transform3D" }, + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::shaders_renames[][2] = { + { "ALPHA_SCISSOR", "ALPHA_SCISSOR_THRESHOLD" }, + { "CAMERA_MATRIX", "INV_VIEW_MATRIX" }, + { "INV_CAMERA_MATRIX", "VIEW_MATRIX" }, + { "NORMALMAP", "NORMAL_MAP" }, + { "NORMALMAP_DEPTH", "NORMAL_MAP_DEPTH" }, + { "TRANSMISSION", "BACKLIGHT" }, + { "WORLD_MATRIX", "MODEL_MATRIX" }, + { "depth_draw_alpha_prepass", "depth_draw_opaque" }, + { "hint_albedo", "source_color" }, + { "hint_aniso", "hint_anisotropy" }, + { "hint_black", "hint_default_black" }, + { "hint_black_albedo", "hint_default_black" }, + { "hint_color", "source_color" }, + { "hint_white", "hint_default_white" }, + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::class_renames[][2] = { + // { "BulletPhysicsDirectBodyState", "BulletPhysicsDirectBodyState3D" }, // Class is not visible in ClassDB + // { "BulletPhysicsServer", "BulletPhysicsServer3D" }, // Class is not visible in ClassDB + // { "GDScriptFunctionState", "Node3D" }, // TODO - not sure to which should be changed + // { "GDScriptNativeClass", "Node3D" }, // TODO - not sure to which should be changed + // { "InputDefault",""}, // TODO ? + // { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB + // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB + // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB + // { "NativeScript","GDExtension"}, ?? + { "ARVRAnchor", "XRAnchor3D" }, + { "ARVRCamera", "XRCamera3D" }, + { "ARVRController", "XRController3D" }, + { "ARVRInterface", "XRInterface" }, + { "ARVRInterfaceGDNative", "Node3D" }, + { "ARVROrigin", "XROrigin3D" }, + { "ARVRPositionalTracker", "XRPositionalTracker" }, + { "ARVRServer", "XRServer" }, + { "AStar", "AStar3D" }, + { "AnimatedSprite", "AnimatedSprite2D" }, + { "AnimationTreePlayer", "AnimationTree" }, + { "Area", "Area3D" }, // Be careful, this will be used everywhere + { "AudioStreamOGGVorbis", "AudioStreamOggVorbis" }, + { "AudioStreamRandomPitch", "AudioStreamRandomizer" }, + { "AudioStreamSample", "AudioStreamWAV" }, + { "BakedLightmap", "LightmapGI" }, + { "BakedLightmapData", "LightmapGIData" }, + { "BitmapFont", "FontFile" }, + { "BoneAttachment", "BoneAttachment3D" }, + { "BoxShape", "BoxShape3D" }, + { "CPUParticles", "CPUParticles3D" }, + { "CSGBox", "CSGBox3D" }, + { "CSGCombiner", "CSGCombiner3D" }, + { "CSGCylinder", "CSGCylinder3D" }, + { "CSGMesh", "CSGMesh3D" }, + { "CSGPolygon", "CSGPolygon3D" }, + { "CSGPrimitive", "CSGPrimitive3D" }, + { "CSGShape", "CSGShape3D" }, + { "CSGSphere", "CSGSphere3D" }, + { "CSGTorus", "CSGTorus3D" }, + { "Camera", "Camera3D" }, // Be careful, this will be used everywhere + { "CapsuleShape", "CapsuleShape3D" }, + { "ClippedCamera", "Camera3D" }, + { "CollisionObject", "CollisionObject3D" }, + { "CollisionPolygon", "CollisionPolygon3D" }, + { "CollisionShape", "CollisionShape3D" }, + { "ConcavePolygonShape", "ConcavePolygonShape3D" }, + { "ConeTwistJoint", "ConeTwistJoint3D" }, + { "ConvexPolygonShape", "ConvexPolygonShape3D" }, + { "CubeMap", "Cubemap" }, + { "CubeMesh", "BoxMesh" }, + { "CylinderShape", "CylinderShape3D" }, + { "DirectionalLight", "DirectionalLight3D" }, + { "DynamicFont", "FontFile" }, + { "DynamicFontData", "FontFile" }, + { "EditorNavigationMeshGenerator", "NavigationMeshGenerator" }, + { "EditorSceneImporter", "EditorSceneFormatImporter" }, + { "EditorSceneImporterFBX", "EditorSceneFormatImporterFBX" }, + { "EditorSceneImporterGLTF", "EditorSceneFormatImporterGLTF" }, + { "EditorSpatialGizmo", "EditorNode3DGizmo" }, + { "EditorSpatialGizmoPlugin", "EditorNode3DGizmoPlugin" }, + { "ExternalTexture", "ImageTexture" }, + { "FuncRef", "Callable" }, + { "GIProbe", "VoxelGI" }, + { "GIProbeData", "VoxelGIData" }, + { "Generic6DOFJoint", "Generic6DOFJoint3D" }, + { "Geometry", "Geometry2D" }, // Geometry class is split between Geometry2D and Geometry3D so we need to choose one + { "GeometryInstance", "GeometryInstance3D" }, + { "GradientTexture", "GradientTexture2D" }, + { "HeightMapShape", "HeightMapShape3D" }, + { "HingeJoint", "HingeJoint3D" }, + { "IP_Unix", "IPUnix" }, + { "ImmediateGeometry", "ImmediateMesh" }, + { "ImmediateGeometry3D", "ImmediateMesh" }, + { "InterpolatedCamera", "Camera3D" }, + { "InterpolatedCamera3D", "Camera3D" }, + { "JSONParseResult", "JSON" }, + { "Joint", "Joint3D" }, + { "KinematicBody", "CharacterBody3D" }, + { "KinematicBody2D", "CharacterBody2D" }, + { "KinematicCollision", "KinematicCollision3D" }, + { "LargeTexture", "ImageTexture" }, + { "Light", "Light3D" }, + { "Light2D", "PointLight2D" }, + { "LineShape2D", "WorldBoundaryShape2D" }, + { "Listener", "AudioListener3D" }, + { "Listener2D", "AudioListener2D" }, + { "MeshInstance", "MeshInstance3D" }, + { "MultiMeshInstance", "MultiMeshInstance3D" }, + { "MultiplayerPeerGDNative", "MultiplayerPeerExtension" }, + { "Navigation", "Node3D" }, + { "Navigation2D", "Node2D" }, + { "Navigation2DServer", "NavigationServer2D" }, + { "Navigation3D", "Node3D" }, + { "NavigationAgent", "NavigationAgent3D" }, + { "NavigationMeshInstance", "NavigationRegion3D" }, + { "NavigationObstacle", "NavigationObstacle3D" }, + { "NavigationPolygonInstance", "NavigationRegion2D" }, + { "NavigationRegion", "NavigationRegion3D" }, + { "NavigationServer", "NavigationServer3D" }, + { "NetworkedMultiplayerENet", "ENetMultiplayerPeer" }, + { "NetworkedMultiplayerPeer", "MultiplayerPeer" }, + { "Occluder", "OccluderInstance3D" }, + { "OmniLight", "OmniLight3D" }, + { "PHashTranslation", "OptimizedTranslation" }, + { "PacketPeerGDNative", "PacketPeerExtension" }, + { "PanoramaSky", "Sky" }, + { "Particles", "GPUParticles3D" }, // Be careful, this will be used everywhere + { "Particles2D", "GPUParticles2D" }, + { "ParticlesMaterial", "ParticleProcessMaterial" }, + { "Path", "Path3D" }, // Be careful, this will be used everywhere + { "PathFollow", "PathFollow3D" }, + { "PhysicalBone", "PhysicalBone3D" }, + { "Physics2DDirectBodyState", "PhysicsDirectBodyState2D" }, + { "Physics2DDirectSpaceState", "PhysicsDirectSpaceState2D" }, + { "Physics2DServer", "PhysicsServer2D" }, + { "Physics2DServerSW", "GodotPhysicsServer2D" }, + { "Physics2DShapeQueryParameters", "PhysicsShapeQueryParameters2D" }, + { "Physics2DTestMotionResult", "PhysicsTestMotionResult2D" }, + { "PhysicsBody", "PhysicsBody3D" }, + { "PhysicsDirectBodyState", "PhysicsDirectBodyState3D" }, + { "PhysicsDirectSpaceState", "PhysicsDirectSpaceState3D" }, + { "PhysicsServer", "PhysicsServer3D" }, + { "PhysicsShapeQueryParameters", "PhysicsShapeQueryParameters3D" }, + { "PhysicsTestMotionResult", "PhysicsTestMotionResult3D" }, + { "PinJoint", "PinJoint3D" }, + { "PlaneShape", "WorldBoundaryShape3D" }, + { "PopupDialog", "Popup" }, + { "Position2D", "Marker2D" }, + { "Position3D", "Marker3D" }, + { "ProceduralSky", "Sky" }, + { "RayCast", "RayCast3D" }, + { "RayShape", "SeparationRayShape3D" }, + { "RayShape2D", "SeparationRayShape2D" }, + { "Reference", "RefCounted" }, // Be careful, this will be used everywhere + { "RemoteTransform", "RemoteTransform3D" }, + { "ResourceInteractiveLoader", "ResourceLoader" }, + { "RigidBody", "RigidBody3D" }, + { "SceneTreeTween", "Tween" }, + { "Shape", "Shape3D" }, // Be careful, this will be used everywhere + { "ShortCut", "Shortcut" }, + { "Skeleton", "Skeleton3D" }, + { "SkeletonIK", "SkeletonIK3D" }, + { "SliderJoint", "SliderJoint3D" }, + { "SoftBody", "SoftBody3D" }, + { "Spatial", "Node3D" }, + { "SpatialGizmo", "Node3DGizmo" }, + { "SpatialMaterial", "StandardMaterial3D" }, + { "SphereShape", "SphereShape3D" }, + { "SpotLight", "SpotLight3D" }, + { "SpringArm", "SpringArm3D" }, + { "Sprite", "Sprite2D" }, + { "StaticBody", "StaticBody3D" }, + { "StreamCubemap", "CompressedCubemap" }, + { "StreamCubemapArray", "CompressedCubemapArray" }, + { "StreamPeerGDNative", "StreamPeerExtension" }, + { "StreamPeerSSL", "StreamPeerTLS" }, + { "StreamTexture", "CompressedTexture2D" }, + { "StreamTexture2D", "CompressedTexture2D" }, + { "StreamTexture2DArray", "CompressedTexture2DArray" }, + { "StreamTextureLayered", "CompressedTextureLayered" }, + { "TCP_Server", "TCPServer" }, + { "Tabs", "TabBar" }, // Be careful, this will be used everywhere + { "TextFile", "Node3D" }, + { "Texture", "Texture2D" }, // May broke TextureRect + { "TextureArray", "Texture2DArray" }, + { "TextureProgress", "TextureProgressBar" }, + { "ToolButton", "Button" }, + { "VehicleBody", "VehicleBody3D" }, + { "VehicleWheel", "VehicleWheel3D" }, + { "VideoPlayer", "VideoStreamPlayer" }, + { "Viewport", "SubViewport" }, + { "ViewportContainer", "SubViewportContainer" }, + { "VisibilityEnabler", "VisibleOnScreenEnabler3D" }, + { "VisibilityEnabler2D", "VisibleOnScreenEnabler2D" }, + { "VisibilityNotifier", "VisibleOnScreenNotifier3D" }, + { "VisibilityNotifier2D", "VisibleOnScreenNotifier2D" }, + { "VisibilityNotifier3D", "VisibleOnScreenNotifier3D" }, + { "VisualInstance", "VisualInstance3D" }, + { "VisualServer", "RenderingServer" }, + { "VisualShaderNodeCubeMap", "VisualShaderNodeCubemap" }, + { "VisualShaderNodeScalarClamp", "VisualShaderNodeClamp" }, + { "VisualShaderNodeScalarConstant", "VisualShaderNodeFloatConstant" }, + { "VisualShaderNodeScalarFunc", "VisualShaderNodeFloatFunc" }, + { "VisualShaderNodeScalarInterp", "VisualShaderNodeMix" }, + { "VisualShaderNodeScalarOp", "VisualShaderNodeFloatOp" }, + { "VisualShaderNodeScalarSmoothStep", "VisualShaderNodeSmoothStep" }, + { "VisualShaderNodeScalarSwitch", "VisualShaderNodeSwitch" }, + { "VisualShaderNodeScalarTransformMult", "VisualShaderNodeTransformOp" }, + { "VisualShaderNodeTransformMult", "VisualShaderNode" }, + { "VisualShaderNodeVectorClamp", "VisualShaderNodeClamp" }, + { "VisualShaderNodeVectorInterp", "VisualShaderNodeMix" }, + { "VisualShaderNodeVectorScalarMix", "VisualShaderNodeMix" }, + { "VisualShaderNodeVectorScalarSmoothStep", "VisualShaderNodeSmoothStep" }, + { "VisualShaderNodeVectorScalarStep", "VisualShaderNodeStep" }, + { "VisualShaderNodeVectorSmoothStep", "VisualShaderNodeSmoothStep" }, + { "VisualShaderNodeBooleanUniform", "VisualShaderNodeBooleanParameter" }, + { "VisualShaderNodeColorUniform", "VisualShaderNodeColorParameter" }, + { "VisualShaderNodeScalarUniform", "VisualShaderNodeFloatParameter" }, + { "VisualShaderNodeCubemapUniform", "VisualShaderNodeCubemapParameter" }, + { "VisualShaderNodeTextureUniform", "VisualShaderNodeTexture2DParameter" }, + { "VisualShaderNodeTextureUniformTriplanar", "VisualShaderNodeTextureParameterTriplanar" }, + { "VisualShaderNodeTransformUniform", "VisualShaderNodeTransformParameter" }, + { "VisualShaderNodeVec3Uniform", "VisualShaderNodeVec3Parameter" }, + { "VisualShaderNodeUniform", "VisualShaderNodeParameter" }, + { "VisualShaderNodeUniformRef", "VisualShaderNodeParameterRef" }, + { "WebRTCDataChannelGDNative", "WebRTCDataChannelExtension" }, + { "WebRTCMultiplayer", "WebRTCMultiplayerPeer" }, + { "WebRTCPeerConnectionGDNative", "WebRTCPeerConnectionExtension" }, + { "WindowDialog", "Window" }, + { "World", "World3D" }, // Be careful, this will be used everywhere + { "XRAnchor", "XRAnchor3D" }, + { "XRController", "XRController3D" }, + { "XROrigin", "XROrigin3D" }, + { "YSort", "Node2D" }, + + { "CullInstance", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x + { "RoomGroup", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x + { "Room", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x + { "RoomManager", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x + { "Portal", "Node3D" }, // Probably this type needs to be added to Godot 4.0, since it is for now only available only in Godot 3.x + + { nullptr, nullptr }, +}; + +const char *RenamesMap3To4::color_renames[][2] = { + { "aliceblue", "ALICE_BLUE" }, + { "antiquewhite", "ANTIQUE_WHITE" }, + { "aqua", "AQUA" }, + { "aquamarine", "AQUAMARINE" }, + { "azure", "AZURE" }, + { "beige", "BEIGE" }, + { "bisque", "BISQUE" }, + { "black", "BLACK" }, + { "blanchedalmond", "BLANCHED_ALMOND" }, + { "blue", "BLUE" }, + { "blueviolet", "BLUE_VIOLET" }, + { "brown", "BROWN" }, + { "burlywood", "BURLYWOOD" }, + { "cadetblue", "CADET_BLUE" }, + { "chartreuse", "CHARTREUSE" }, + { "chocolate", "CHOCOLATE" }, + { "coral", "CORAL" }, + { "cornflowerblue", "CORNFLOWER_BLUE" }, + { "cornsilk", "CORNSILK" }, + { "crimson", "CRIMSON" }, + { "cyan", "CYAN" }, + { "darkblue", "DARK_BLUE" }, + { "darkcyan", "DARK_CYAN" }, + { "darkgoldenrod", "DARK_GOLDENROD" }, + { "darkgray", "DARK_GRAY" }, + { "darkgreen", "DARK_GREEN" }, + { "darkkhaki", "DARK_KHAKI" }, + { "darkmagenta", "DARK_MAGENTA" }, + { "darkolivegreen", "DARK_OLIVE_GREEN" }, + { "darkorange", "DARK_ORANGE" }, + { "darkorchid", "DARK_ORCHID" }, + { "darkred", "DARK_RED" }, + { "darksalmon", "DARK_SALMON" }, + { "darkseagreen", "DARK_SEA_GREEN" }, + { "darkslateblue", "DARK_SLATE_BLUE" }, + { "darkslategray", "DARK_SLATE_GRAY" }, + { "darkturquoise", "DARK_TURQUOISE" }, + { "darkviolet", "DARK_VIOLET" }, + { "deeppink", "DEEP_PINK" }, + { "deepskyblue", "DEEP_SKY_BLUE" }, + { "dimgray", "DIM_GRAY" }, + { "dodgerblue", "DODGER_BLUE" }, + { "firebrick", "FIREBRICK" }, + { "floralwhite", "FLORAL_WHITE" }, + { "forestgreen", "FOREST_GREEN" }, + { "fuchsia", "FUCHSIA" }, + { "gainsboro", "GAINSBORO" }, + { "ghostwhite", "GHOST_WHITE" }, + { "gold", "GOLD" }, + { "goldenrod", "GOLDENROD" }, + { "gray", "GRAY" }, + { "green", "GREEN" }, + { "greenyellow", "GREEN_YELLOW" }, + { "honeydew", "HONEYDEW" }, + { "hotpink", "HOT_PINK" }, + { "indianred", "INDIAN_RED" }, + { "indigo", "INDIGO" }, + { "ivory", "IVORY" }, + { "khaki", "KHAKI" }, + { "lavender", "LAVENDER" }, + { "lavenderblush", "LAVENDER_BLUSH" }, + { "lawngreen", "LAWN_GREEN" }, + { "lemonchiffon", "LEMON_CHIFFON" }, + { "lightblue", "LIGHT_BLUE" }, + { "lightcoral", "LIGHT_CORAL" }, + { "lightcyan", "LIGHT_CYAN" }, + { "lightgoldenrod", "LIGHT_GOLDENROD" }, + { "lightgray", "LIGHT_GRAY" }, + { "lightgreen", "LIGHT_GREEN" }, + { "lightpink", "LIGHT_PINK" }, + { "lightsalmon", "LIGHT_SALMON" }, + { "lightseagreen", "LIGHT_SEA_GREEN" }, + { "lightskyblue", "LIGHT_SKY_BLUE" }, + { "lightslategray", "LIGHT_SLATE_GRAY" }, + { "lightsteelblue", "LIGHT_STEEL_BLUE" }, + { "lightyellow", "LIGHT_YELLOW" }, + { "lime", "LIME" }, + { "limegreen", "LIME_GREEN" }, + { "linen", "LINEN" }, + { "magenta", "MAGENTA" }, + { "maroon", "MAROON" }, + { "mediumaquamarine", "MEDIUM_AQUAMARINE" }, + { "mediumblue", "MEDIUM_BLUE" }, + { "mediumorchid", "MEDIUM_ORCHID" }, + { "mediumpurple", "MEDIUM_PURPLE" }, + { "mediumseagreen", "MEDIUM_SEA_GREEN" }, + { "mediumslateblue", "MEDIUM_SLATE_BLUE" }, + { "mediumspringgreen", "MEDIUM_SPRING_GREEN" }, + { "mediumturquoise", "MEDIUM_TURQUOISE" }, + { "mediumvioletred", "MEDIUM_VIOLET_RED" }, + { "midnightblue", "MIDNIGHT_BLUE" }, + { "mintcream", "MINT_CREAM" }, + { "mistyrose", "MISTY_ROSE" }, + { "moccasin", "MOCCASIN" }, + { "navajowhite", "NAVAJO_WHITE" }, + { "navyblue", "NAVY_BLUE" }, + { "oldlace", "OLD_LACE" }, + { "olive", "OLIVE" }, + { "olivedrab", "OLIVE_DRAB" }, + { "orange", "ORANGE" }, + { "orangered", "ORANGE_RED" }, + { "orchid", "ORCHID" }, + { "palegoldenrod", "PALE_GOLDENROD" }, + { "palegreen", "PALE_GREEN" }, + { "paleturquoise", "PALE_TURQUOISE" }, + { "palevioletred", "PALE_VIOLET_RED" }, + { "papayawhip", "PAPAYA_WHIP" }, + { "peachpuff", "PEACH_PUFF" }, + { "peru", "PERU" }, + { "pink", "PINK" }, + { "plum", "PLUM" }, + { "powderblue", "POWDER_BLUE" }, + { "purple", "PURPLE" }, + { "rebeccapurple", "REBECCA_PURPLE" }, + { "red", "RED" }, + { "rosybrown", "ROSY_BROWN" }, + { "royalblue", "ROYAL_BLUE" }, + { "saddlebrown", "SADDLE_BROWN" }, + { "salmon", "SALMON" }, + { "sandybrown", "SANDY_BROWN" }, + { "seagreen", "SEA_GREEN" }, + { "seashell", "SEASHELL" }, + { "sienna", "SIENNA" }, + { "silver", "SILVER" }, + { "skyblue", "SKY_BLUE" }, + { "slateblue", "SLATE_BLUE" }, + { "slategray", "SLATE_GRAY" }, + { "snow", "SNOW" }, + { "springgreen", "SPRING_GREEN" }, + { "steelblue", "STEEL_BLUE" }, + { "tan", "TAN" }, + { "teal", "TEAL" }, + { "thistle", "THISTLE" }, + { "tomato", "TOMATO" }, + { "transparent", "TRANSPARENT" }, + { "turquoise", "TURQUOISE" }, + { "violet", "VIOLET" }, + { "webgray", "WEB_GRAY" }, + { "webgreen", "WEB_GREEN" }, + { "webmaroon", "WEB_MAROON" }, + { "webpurple", "WEB_PURPLE" }, + { "wheat", "WHEAT" }, + { "white", "WHITE" }, + { "whitesmoke", "WHITE_SMOKE" }, + { "yellow", "YELLOW" }, + { "yellowgreen", "YELLOW_GREEN" }, + + { nullptr, nullptr }, +}; + +#endif // DISABLE_DEPRECATED diff --git a/platform/ios/godot_view_gesture_recognizer.h b/editor/renames_map_3_to_4.h index 57bfc75568..119ededf43 100644 --- a/platform/ios/godot_view_gesture_recognizer.h +++ b/editor/renames_map_3_to_4.h @@ -1,5 +1,5 @@ /**************************************************************************/ -/* godot_view_gesture_recognizer.h */ +/* renames_map_3_to_4.h */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,19 +28,27 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ -// GLViewGestureRecognizer allows iOS gestures to work correctly by -// emulating UIScrollView's UIScrollViewDelayedTouchesBeganGestureRecognizer. -// It catches all gestures incoming to UIView and delays them for 150ms -// (the same value used by UIScrollViewDelayedTouchesBeganGestureRecognizer) -// If touch cancellation or end message is fired it fires delayed -// begin touch immediately as well as last touch signal +#ifndef RENAMES_MAP_3_TO_4_H +#define RENAMES_MAP_3_TO_4_H -#import <UIKit/UIKit.h> +#ifndef DISABLE_DEPRECATED -@interface GodotViewGestureRecognizer : UIGestureRecognizer +struct RenamesMap3To4 { + static const char *enum_renames[][2]; + static const char *gdscript_function_renames[][2]; + static const char *csharp_function_renames[][2]; + static const char *gdscript_properties_renames[][2]; + static const char *csharp_properties_renames[][2]; + static const char *gdscript_signals_renames[][2]; + static const char *csharp_signals_renames[][2]; + static const char *project_settings_renames[][2]; + static const char *input_map_renames[][2]; + static const char *builtin_types_renames[][2]; + static const char *shaders_renames[][2]; + static const char *class_renames[][2]; + static const char *color_renames[][2]; +}; -@property(nonatomic, readonly, assign) NSTimeInterval delayTimeInterval; +#endif // DISABLE_DEPRECATED -- (instancetype)init; - -@end +#endif // RENAMES_MAP_3_TO_4_H diff --git a/editor/translations/editor/ar.po b/editor/translations/editor/ar.po index 0fb924089d..51d860efe7 100644 --- a/editor/translations/editor/ar.po +++ b/editor/translations/editor/ar.po @@ -34,7 +34,7 @@ # Ahmed Shahwan <dev.ahmed.shahwan@gmail.com>, 2019. # hshw <shw@tutanota.com>, 2020. # Youssef Harmal <the.coder.crab@gmail.com>, 2020. -# Nabeel20 <nabeelandnizam@gmail.com>, 2020, 2021, 2022. +# Nabeel20 <nabeelandnizam@gmail.com>, 2020, 2021, 2022, 2023. # merouche djallal <kbordora@gmail.com>, 2020. # Airbus5717 <Abdussamadf350@gmail.com>, 2020. # tamsamani mohamed <tamsmoha@gmail.com>, 2020. @@ -76,8 +76,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-12-21 07:01+0000\n" -"Last-Translator: Abdulrahman <abdelrahman.ramadan686@gmail.com>\n" +"PO-Revision-Date: 2023-02-09 09:37+0000\n" +"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -86,14 +86,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "غير Ù…Øدد" msgid "Physical" msgstr "Ùيزيائي" +msgid "Left Mouse Button" +msgstr "زر الÙأرة الأيسر" + +msgid "Right Mouse Button" +msgstr "زر الÙأرة الأيمن" + +msgid "Middle Mouse Button" +msgstr "عجلة الÙأرة (الزر الأوسط)" + +msgid "Mouse Wheel Up" +msgstr "تØريك عجلة الÙأرة للأعلى" + +msgid "Mouse Wheel Down" +msgstr "تØريك عجلة الÙأرة للأسÙÙ„" + +msgid "Mouse Wheel Left" +msgstr "زر العجلة يساراً" + +msgid "Mouse Wheel Right" +msgstr "زر العجلة يميناً" + +msgid "Mouse Thumb Button 1" +msgstr "زر الÙأرة الأول الخاص بالإبهام" + +msgid "Mouse Thumb Button 2" +msgstr "زر الÙأرة الثاني الخاص بالإبهام" + msgid "Button" msgstr "زر" +msgid "Double Click" +msgstr "نقرة مضاعÙØ©" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Øركة الÙأرة بالموضع (%s) بالسرعة (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "المØور الأÙقي لعصا التØكم اليسرى، Ù…Øور التØكمJoystick الأÙقي 0" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "المØور العمودي لعصا التØكم اليسرى، Ù…Øور التØكم Joystick العمودي 0" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "المØور الأÙقي لعصا التØكم اليمنى، Ù…Øور التØكم Joystick الأÙقي 1" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "المØور العمودي لعصا التØكم اليمنى، Ù…Øور التØكم Joystickالعمودي 1" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "" +"المØور الأÙقي لمركز التØكم Joystick الثاني، المÙطلق الأيسر، Sony L2ØŒ Xbox LT" + msgid "Select" msgstr "Øدد" @@ -601,6 +653,9 @@ msgstr "من إشارة:" msgid "Scene does not contain any script." msgstr "لا ÙŠØتوي المشهد علي اي برنامج نصي." +msgid "Select Method" +msgstr "إختر طريقة" + msgid "Remove" msgstr "إمسØ" @@ -656,9 +711,6 @@ msgstr "قطع الاتصال" msgid "Connect a Signal to a Method" msgstr "قم بوصل الإشارة إلى الدالة" -msgid "Edit Connection:" -msgstr "تعديل الإتصال:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "هل أنت متأكد أنك تود إزالة كل الإتصالات من الإشارة \"%s\"ØŸ" @@ -803,23 +855,8 @@ msgstr "تØذير:" msgid "Error:" msgstr "خطأ:" -msgid "C++ Error" -msgstr "خطأ ÙÙŠ C++" - -msgid "C++ Error:" -msgstr "خطأ C++ :" - -msgid "Source" -msgstr "مصدر" - -msgid "C++ Source" -msgstr "مصدر C++" - -msgid "Source:" -msgstr "مصدر:" - -msgid "C++ Source:" -msgstr "مصدر C++:" +msgid "%s Error" +msgstr "Ùªs خطأ" msgid "Stack Trace" msgstr "تتبع المÙكدس Stack Trace" @@ -830,6 +867,9 @@ msgstr "خطأ ÙÙŠ نسخ" msgid "Open C++ Source on GitHub" msgstr "اÙØªØ Ù…ØµØ¯Ø± ++C على GitHub" +msgid "C++ Source" +msgstr "مصدر C++" + msgid "Video RAM" msgstr "الذاكرة العشوائية للÙيديو" @@ -1658,7 +1698,7 @@ msgid "Styles" msgstr "مظاهر" msgid "Enumerations" -msgstr "تعداد" +msgstr "تعدادات" msgid "Property Descriptions" msgstr "أوصا٠المÙلكية" @@ -1776,12 +1816,12 @@ msgstr "إظهار جميع المَØليّات Locales" msgid "Show Selected Locales Only" msgstr "إظهار المَØليّات المÙختارة ÙØسب" +msgid "Edit Filters" +msgstr "تعديل المÙرشØات" + msgid "Language:" msgstr "اللغة:" -msgid "Script" -msgstr "النص البرمجي" - msgid "Clear Output" msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ùخرجات" @@ -2287,7 +2327,7 @@ msgid "FileSystem" msgstr "نظام الملÙات" msgid "Inspector" -msgstr "Ù…ÙتÙØص" +msgstr "الÙاØص" msgid "Node" msgstr "ÙˆØدة" @@ -2311,23 +2351,6 @@ msgid "Install from file" msgstr "تثبيت من ملÙ" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"بهذه الطريقة سيتم إعداد المشروع الخاص بك لأجل نسخ بناء أندرويد مخصص عن طريق " -"تثبيت قوالب المصدر البرمجي ÙÙŠ \"res://android/build\".\n" -"يمكنك تطبيق تعديلات الخاصة على نسخة البناء للØصول على Øزمة تطبيق أندرويد APK " -"معدّلة عند التصدير (زيادة Ù…ÙÙ„Øقات، تعديل مل٠AndroidManifest.xml إلخ..).\n" -"ضع ÙÙŠ بالك أنه من أجل إنشاء نسخ بناء مخصوصة بدلاً من الØزم APKs المبنية سلÙاً، " -"ينبغي أن يكون إعداد \"استخدام بناء مخصص\" ممكناً ÙÙŠ إعدادات تصدير الأندرويد " -"Android export preset." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2548,9 +2571,6 @@ msgstr "الاختصارات" msgid "Binding" msgstr "الربط" -msgid "%s Error" -msgstr "Ùªs خطأ" - msgid "All Devices" msgstr "جميع الأجهزة" @@ -3365,6 +3385,9 @@ msgstr "Øدد ÙˆØرك النقاط، أنشئ النقاط باستخدام RM msgid "Enable snap and show grid." msgstr "تمكين المØاذاة وإظهار الشبكة." +msgid "Blend:" +msgstr "الدمج:" + msgid "Point" msgstr "نقطة" @@ -3408,15 +3431,9 @@ msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø· والمثلثات." msgid "Generate blend triangles automatically (instead of manually)" msgstr "توليد مثلثات دمج بصورة تلقائية (بدلاً من اليدوية)" -msgid "Blend:" -msgstr "الدمج:" - msgid "Parameter Changed:" msgstr "لقد تم تغيير المَعلم:" -msgid "Edit Filters" -msgstr "تعديل المÙرشØات" - msgid "Output node can't be added to the blend tree." msgstr "لا يمكن إضاÙØ© مخرجات الوØدة إلى شجرة الدمج." @@ -3535,9 +3552,6 @@ msgstr "تشغيل الرسم المتØرك المختار بشكل عكسي Ù… msgid "Play selected animation backwards from end. (Shift+A)" msgstr "تشغيل الرسم المتØرك المختار بشكل عكسي من النهاية. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "إيقا٠تشغيل الرسم المتØرك. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "تشغيل الرسم المتØرك المØدد من البداية. (Shift+D)" @@ -4710,12 +4724,6 @@ msgstr "تعديل Notifier AABB" msgid "Change Particles AABB" msgstr "تعديل جÙزيئات AABB" -msgid "Change Box Shape Extents" -msgstr "تعديل Øجم الشكل الصندوقي" - -msgid "Change Probe Extents" -msgstr "تعديل نطاقات المسبر Probe Extents" - msgid "Change Capsule Shape Radius" msgstr "تعديل نص٠قطر الشكل الكبسولي Capsule Shape" @@ -5522,6 +5530,9 @@ msgstr "معياري" msgid "Connections to method:" msgstr "الاتصالات لدالة:" +msgid "Source" +msgstr "مصدر" + msgid "Target" msgstr "الهدÙ" @@ -5763,12 +5774,6 @@ msgstr "(Ùارغ)" msgid "Animations:" msgstr "الرسومات المتØركة:" -msgid "Speed:" -msgstr "السرعة:" - -msgid "Loop" -msgstr "Øلقة Loop" - msgid "Animation Frames:" msgstr "إطارات الرسومات المتØركة:" @@ -7045,9 +7050,6 @@ msgstr "إضاÙØ© إجراء إدخال" msgid "Change Action deadzone" msgstr "تغيير المنطقة الميتة للÙعالية Action deadzone" -msgid "Add Input Action Event" -msgstr "إضاÙØ© Øدث Ùعالية الإدخال" - msgid "Erase Input Action" msgstr "Ù…Ø³Ø Ø¥Ø¬Ø±Ø§Ø¡ الإدخال" @@ -7072,9 +7074,6 @@ msgstr "انتقاء الخاصية" msgid "Select Virtual Method" msgstr "اختر الطريقة الإÙتراضية" -msgid "Select Method" -msgstr "إختر طريقة" - msgid "Batch Rename" msgstr "إعادة تسمية الدÙعة" @@ -7775,14 +7774,6 @@ msgstr "Ù…ÙØªØ§Ø Ø¹Ø§Ù… غير ØµØ§Ù„Ø Ù„Ø£Ø¬Ù„ تصدير Øزمة تطبي٠msgid "Invalid package name:" msgstr "اسم رÙزمة غير صالØ:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "يجب تÙعيل \"Use Custom Build\" لإستخدام الإضاÙات." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"ÙŠØµØ¨Ø Ø®ÙŠØ§Ø± \"تصدير ABB\" صالØاً Ùقط عندما يتم اختيار \"استعمال تصدير مخصص " -"Custom Build\"." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -7826,13 +7817,6 @@ msgid "Unsupported export format!" msgstr "تنسيق تصدير غير مدعوم!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"تتم Ù…Øاولة البناء من قالب بناء Ù…Ùخصص، ولكن لا تتواجد معلومات النسخة. من Ùضلك " -"أعد التØميل من قائمة \"المشروع\"." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -8206,6 +8190,9 @@ msgstr "مصدر غير ØµØ§Ù„Ø Ù„Ù„Ù…Ø¹Ø§ÙŠÙ†Ø©." msgid "Invalid source for shader." msgstr "مصدر غير ØµØ§Ù„Ø Ù„ØªØ¸Ù„ÙŠÙ„." +msgid "Filter" +msgstr "المÙرشØ" + msgid "Repeat" msgstr "كرر" diff --git a/editor/translations/editor/bg.po b/editor/translations/editor/bg.po index e6e20fe39f..227c371174 100644 --- a/editor/translations/editor/bg.po +++ b/editor/translations/editor/bg.po @@ -11,7 +11,7 @@ # Whod <whodizhod@gmail.com>, 2020. # Stoyan <stoyan.stoyanov99@protonmail.com>, 2020. # zooid <the.zooid@gmail.com>, 2020, 2022. -# Любомир ВаÑилев <lyubomirv@gmx.com>, 2020, 2021, 2022. +# Любомир ВаÑилев <lyubomirv@gmx.com>, 2020, 2021, 2022, 2023. # Ziv D <wizdavid@gmail.com>, 2020. # Violin Iliev <violin.developer@gmail.com>, 2021. # Ivan Gechev <ivan_banov@abv.bg>, 2022. @@ -23,8 +23,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-10-25 15:43+0000\n" -"Last-Translator: Vosh <vosh4k@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Любомир ВаÑилев <lyubomirv@gmx.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" "Language: bg\n" @@ -32,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Physical" msgstr "ФизичеÑки" @@ -363,6 +363,16 @@ msgstr "Ðомер на реда:" msgid "%d replaced." msgstr "%d заменени." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d Ñъвпадение" +msgstr[1] "%d ÑъвпадениÑ" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d от %d Ñъвпадение" +msgstr[1] "%d от %d ÑъвпадениÑ" + msgid "Match Case" msgstr "Различаване на малки и главни букви" @@ -402,6 +412,9 @@ msgstr "От Ñигнал:" msgid "Scene does not contain any script." msgstr "Сцената не Ñъдържа Ñкриптове." +msgid "Select Method" +msgstr "Избиране на метод" + msgid "Remove" msgstr "Премахване" @@ -438,9 +451,6 @@ msgstr "Разкачване" msgid "Connect a Signal to a Method" msgstr "Свързване на Ñигнала към метод" -msgid "Edit Connection:" -msgstr "Редактиране на Връзката:" - msgid "Signals" msgstr "Сигнали" @@ -498,11 +508,8 @@ msgstr "Предупреждение:" msgid "Error:" msgstr "Грешка:" -msgid "C++ Error" -msgstr "Грешка в C++" - -msgid "C++ Error:" -msgstr "Грешка в C++:" +msgid "%s Error" +msgstr "Грешка от %s" msgid "Copy Error" msgstr "Копиране на грешката" @@ -1050,12 +1057,12 @@ msgstr "Показване на вÑички езици" msgid "Show Selected Locales Only" msgstr "Показване Ñамо на избраните езици" +msgid "Edit Filters" +msgstr "Редактиране на филтрите" + msgid "Language:" msgstr "Език:" -msgid "Script" -msgstr "Скрипт" - msgid "Clear Output" msgstr "ИзчиÑтване на изхода" @@ -1332,24 +1339,6 @@ msgstr "Управление на шаблоните" msgid "Install from file" msgstr "ИнÑталиране от файл" -msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Това ще наÑтрои проекта Ви за перÑонализирано компилиране за Android, като " -"инÑталира Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½ в „res://android/build“.\n" -"След това ще можете да го промените (като добавите модули, промените файла " -"„AndroidManifest.xml“ и Ñ‚.н.) и да Ñъздадете Ñвой ÑобÑтвен APK за " -"изнаÑÑнето.\n" -"Имайте предвид, че за да ползвате перÑонализирани файлове APK, вмеÑто " -"предварително готовите, в конфигурациÑта за изнаÑÑне за Android Ñ‚Ñ€Ñбва да " -"поÑтавена отметка в „Използване на ÑобÑтвена компилациÑ“." - msgid "Import Templates From ZIP File" msgstr "ВнаÑÑне на шаблони от архив във формат ZIP" @@ -1429,9 +1418,6 @@ msgstr "ÐаÑтройки на редактора" msgid "General" msgstr "Общи" -msgid "%s Error" -msgstr "Грешка от %s" - msgid "All Devices" msgstr "Ð’Ñички уÑтройÑтва" @@ -1745,39 +1731,107 @@ msgstr "Допълнителни наÑтройки на реÑурÑа." msgid "Edit Resource from Clipboard" msgstr "Редактиране на реÑÑƒÑ€Ñ Ð¾Ñ‚ буфера за обмен" +msgid "Go to previous edited object in history." +msgstr "Преминаване към Ð¿Ñ€ÐµÐ´Ñ…Ð¾Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð½ обект в иÑториÑта." + +msgid "Go to next edited object in history." +msgstr "Преминаване към ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð½ обект в иÑториÑта." + msgid "History of recently edited objects." msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° поÑледно редактираните обекти." msgid "Open documentation for this object." msgstr "ОтварÑне на документациÑта за този обект." +msgid "Filter Properties" +msgstr "Филтриране на ÑвойÑтвата" + msgid "Manage object properties." msgstr "Управление на ÑвойÑтвата на обекта." +msgid "This cannot be undone. Are you sure?" +msgstr "Това дейÑтвие е необратимо. ÐаиÑтина ли го иÑкате?" + msgid "Add %d Translations" msgstr "ДобавÑне на %d превода" msgid "Remove Translation" msgstr "Премахване на превода" +msgid "Add %d file(s) for POT generation" +msgstr "ДобавÑне на %d файл(а) за Ñъздаване на POT" + +msgid "Remove file from POT generation" +msgstr "Премахване на файла от процеÑа за Ñъздаване на POT" + +msgid "Removed" +msgstr "Премахнато" + +msgid "%s cannot be found." +msgstr "%s не може да бъде намерено." + +msgid "Translations" +msgstr "Преводи" + +msgid "Translations:" +msgstr "Преводи:" + +msgid "Resources:" +msgstr "РеÑурÑи:" + msgid "Locale" msgstr "Локал" +msgid "POT Generation" +msgstr "Създаване на POT" + +msgid "Files with translation strings:" +msgstr "Файлове Ñ Ð½Ð¸Ð·Ð¾Ð²Ðµ за превод:" + +msgid "Generate POT" +msgstr "Създаване на POT" + +msgid "Set %s on %d nodes" +msgstr "Задаване на %s на %d обекта" + +msgid "%s (%d Selected)" +msgstr "%s (%d избран(и))" + msgid "Select a single node to edit its signals and groups." msgstr "Изберете един обект, за да редактирате Ñигналите и групите му." +msgid "Plugin name cannot be blank." +msgstr "Името на приÑтавката не може да бъде празно." + +msgid "Script extension must match chosen language extension (.%s)." +msgstr "" +"Разширението на Ñкрипта Ñ‚Ñ€Ñбва да Ñъвпада Ñ Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸ÐµÑ‚Ð¾ на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐµÐ·Ð¸Ðº (." +"%s)." + +msgid "Subfolder name is not a valid folder name." +msgstr "Името на подпапката не е правилно име на папка." + +msgid "Subfolder cannot be one which already exists." +msgstr "Вече ÑъщеÑтвува подпапка Ñ Ñ‚Ð¾Ð²Ð° име." + msgid "Edit a Plugin" msgstr "Редактиране на приÑтавка" msgid "Create a Plugin" msgstr "Създаване на приÑтавка" +msgid "Update" +msgstr "ОбновÑване" + msgid "Plugin Name:" msgstr "Име на приÑтавката:" msgid "Subfolder:" msgstr "Подпапка:" +msgid "Author:" +msgstr "Ðвтор:" + msgid "Version:" msgstr "ВерÑиÑ:" @@ -1829,6 +1883,17 @@ msgstr "Зареждане..." msgid "Move Node Point" msgstr "ПремеÑтване на точката на обекта" +msgid "Change BlendSpace1D Config" +msgstr "ПромÑна на конфигурациÑта на BlendSpace1D" + +msgid "Change BlendSpace1D Labels" +msgstr "ПромÑна на етикетите на BlendSpace1D" + +msgid "This type of node can't be used. Only animation nodes are allowed." +msgstr "" +"Този тип обект не може да бъде използван. Разрешени Ñа Ñамо обекти за " +"анимиране." + msgid "This type of node can't be used. Only root nodes are allowed." msgstr "" "Този тип обект не може да бъде използван. Разрешени Ñа Ñамо коренни обекти." @@ -1842,6 +1907,9 @@ msgstr "ДобавÑне на точки за анимациÑ" msgid "Remove BlendSpace1D Point" msgstr "Премахване на точка на BlendSpace1D" +msgid "Move BlendSpace1D Node Point" +msgstr "ПремеÑтване на точката на обекта за BlendSpace1D" + msgid "" "AnimationTree is inactive.\n" "Activate to enable playback, check node warnings if activation fails." @@ -1859,6 +1927,12 @@ msgstr "Избиране и премеÑтване на точки; Ñъздав msgid "Enable snap and show grid." msgstr "Включване на прилепването и показване на решетката." +msgid "Sync:" +msgstr "Синхронизиране:" + +msgid "Blend:" +msgstr "СмеÑване:" + msgid "Point" msgstr "Точка" @@ -1874,8 +1948,17 @@ msgstr "Триъгълникът вече ÑъщеÑтвува." msgid "Add Triangle" msgstr "ДобавÑне на триъгълник" +msgid "Change BlendSpace2D Config" +msgstr "ПромÑна на конфигурациÑта на BlendSpace2D" + +msgid "Change BlendSpace2D Labels" +msgstr "ПромÑна на етикетите на BlendSpace2D" + msgid "Remove BlendSpace2D Point" -msgstr "ПремеÑтване на точка на BlendSpace2D" +msgstr "Премахване на точката на BlendSpace2D" + +msgid "Remove BlendSpace2D Triangle" +msgstr "Премахване на триъгълника на BlendSpace2D" msgid "BlendSpace2D does not belong to an AnimationTree node." msgstr "BlendSpace2D не принадлежи на обект от тип AnimationTree." @@ -1895,14 +1978,14 @@ msgstr "Изтриване на точки и триъгълници." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Създаване на триъгълници за ÑмеÑване автоматично (а не ръчно)" -msgid "Blend:" -msgstr "СмеÑване:" - msgid "Parameter Changed:" msgstr "Параметърът е променен:" -msgid "Edit Filters" -msgstr "Редактиране на филтрите" +msgid "Inspect Filters" +msgstr "Разглеждане на филтрите" + +msgid "Output node can't be added to the blend tree." +msgstr "РезултатниÑÑ‚ обект не може да бъде добавен към дървото за ÑмеÑване." msgid "Add Node to BlendTree" msgstr "ДобавÑне на обекта към BlendTree" @@ -1945,6 +2028,9 @@ msgstr "Ðудио клипове" msgid "Functions" msgstr "Функции" +msgid "Inspect Filtered Tracks:" +msgstr "Разглеждане на филтрираните пътечки:" + msgid "Edit Filtered Tracks:" msgstr "Редактиране на филтрираните пътечки:" @@ -1957,9 +2043,86 @@ msgstr "ДобавÑне на обект…" msgid "Enable Filtering" msgstr "Включване на филтрирането" +msgid "Library Name:" +msgstr "Име на библиотеката:" + +msgid "Animation name can't be empty." +msgstr "Името на анимациÑта не може да бъде празно." + +msgid "Animation name contains invalid characters: '/', ':', ',' or '['." +msgstr "" +"Името на анимациÑта Ñъдържа нÑкой/и от Ñледните непозволени знаци: / : , или " +"[." + +msgid "Animation with the same name already exists." +msgstr "Вече ÑъщеÑтвува Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ Ñ‚Ð¾Ð²Ð° име." + +msgid "Enter a library name." +msgstr "Въведете име за библиотеката." + +msgid "Library name contains invalid characters: '/', ':', ',' or '['." +msgstr "" +"Името на библиотеката Ñъдържа нÑкой/и от Ñледните непозволени знаци: / : , " +"или [." + +msgid "Library with the same name already exists." +msgstr "Вече ÑъщеÑтвува библиотека Ñ Ñ‚Ð¾Ð²Ð° име." + +msgid "Animation name is valid." +msgstr "Името на анимациÑта Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° изиÑкваниÑта." + +msgid "Global library will be created." +msgstr "Ще бъде Ñъздадена глобална библиотека." + +msgid "Library name is valid." +msgstr "Името на библиотеката Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° изиÑкваниÑта." + +msgid "Add Animation to Library: %s" +msgstr "ДобавÑне на Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ ÐºÑŠÐ¼ библиотеката: %s" + +msgid "Add Animation Library: %s" +msgstr "ДобавÑне на анимационна библиотека: %s" + msgid "Load Animation" msgstr "Зареждане на анимациÑ" +msgid "" +"This animation library can't be saved because it does not belong to the " +"edited scene. Make it unique first." +msgstr "" +"Тази анимационна библиотека не може да бъде запазена, тъй като не принадлежи " +"на редактираната Ñцена. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо." + +msgid "" +"This animation library can't be saved because it was imported from another " +"file. Make it unique first." +msgstr "" +"Тази анимационна библиотека не може да бъде запазена, тъй като е била " +"внеÑена от друг файл. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо." + +msgid "Save Library" +msgstr "Запазване на библиотеката" + +msgid "Make Animation Library Unique: %s" +msgstr "Превръщане на анимационна библиотека в уникална: %s" + +msgid "" +"This animation can't be saved because it does not belong to the edited " +"scene. Make it unique first." +msgstr "" +"Тази Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена, тъй като не принадлежи на " +"редактираната Ñцена. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо." + +msgid "" +"This animation can't be saved because it was imported from another file. " +"Make it unique first." +msgstr "" +"Тази Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ може да бъде запазена, тъй като е била внеÑена от друг " +"файл. Ðаправете Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»Ð½Ð° първо." + +msgid "Save Animation" +msgstr "Запазване на анимациÑта" + msgid "Animation Name:" msgstr "Име на анимациÑта:" @@ -2003,9 +2166,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Възпроизвеждане на избраната Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ от краÑ. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Спиране на възпроизвеждането на анимациÑта. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Възпроизвеждане на избраната Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ началото. (Shift+D)" @@ -2130,21 +2290,51 @@ msgstr "Съдържание:" msgid "View Files" msgstr "Преглед на файловете" +msgid "Download" +msgstr "СвалÑне" + msgid "Connection error, please try again." msgstr "Грешка във връзката. МолÑ, опитайте отново." +msgid "Can't connect." +msgstr "Ðе може да Ñе оÑъщеÑтви връзка." + +msgid "Can't connect to host:" +msgstr "Ðе може да Ñе оÑъщеÑтви връзка ÑÑŠÑ Ñървъра:" + +msgid "No response from host:" +msgstr "ÐÑма отговор от Ñървъра:" + +msgid "No response." +msgstr "ÐÑма отговор." + msgid "Request failed, return code:" msgstr "ЗаÑвката беше неуÑпешна. Код:" msgid "Cannot save response to:" msgstr "Отговорът не може да бъде запазен в:" +msgid "Write error." +msgstr "Грешка при запиÑ." + msgid "Request failed, too many redirects" msgstr "ЗаÑвката Ñе провали. Твърде много пренаÑочваниÑ" +msgid "Redirect loop." +msgstr "Цикъл от пренаÑочваниÑ." + msgid "Request failed, timeout" msgstr "ЗаÑвката е неуÑпешна, изчакването е неуÑпешно" +msgid "Timeout." +msgstr "Изтекло време." + +msgid "Failed:" +msgstr "ÐеуÑпешно:" + +msgid "Bad download hash, assuming file has been tampered with." +msgstr "Ðеправилна хеш-Ñума на ÑÐ²Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð». Приема Ñе, че той е бил увреден." + msgid "Expected:" msgstr "Очаквано:" @@ -2154,6 +2344,9 @@ msgstr "Получено:" msgid "Failed SHA-256 hash check" msgstr "ÐеуÑпешна проверка на хеш от вид SHA-256" +msgid "Ready to install!" +msgstr "Готово за инÑталиране!" + msgid "Downloading (%s / %s)..." msgstr "СвалÑне (%s / %s)..." @@ -2181,6 +2374,12 @@ msgstr "ПоÑледно обновени" msgid "Least Recently Updated" msgstr "Обновени отдавна" +msgid "Name (A-Z)" +msgstr "Име (Ð-Я)" + +msgid "Name (Z-A)" +msgstr "Име (Я-Ð)" + msgid "License (A-Z)" msgstr "Лиценз (Ð-Я)" @@ -2196,9 +2395,43 @@ msgstr "ТеÑтово" msgid "Loading..." msgstr "Зареждане…" +msgctxt "Pagination" +msgid "First" +msgstr "Първа" + +msgctxt "Pagination" +msgid "Previous" +msgstr "Предишна" + +msgctxt "Pagination" +msgid "Next" +msgstr "Следваща" + +msgctxt "Pagination" +msgid "Last" +msgstr "ПоÑледна" + msgid "All" msgstr "Ð’Ñички" +msgid "No results for \"%s\" for support level(s): %s." +msgstr "ÐÑма резултати за „%s“ за нивото/нивата на поддръжка: %s." + +msgid "" +"No results compatible with %s %s for support level(s): %s.\n" +"Check the enabled support levels using the 'Support' button in the top-right " +"corner." +msgstr "" +"ÐÑма резултати ÑъвмеÑтими Ñ â€ž%s“ за нивото/нивата на поддръжка: %s.\n" +"Проверете включените нива на поддръжка чрез бутона „Поддръжка“ в Ð³Ð¾Ñ€Ð½Ð¸Ñ " +"деÑен ъгъл." + +msgid "Search Templates, Projects, and Demos" +msgstr "ТърÑене на шаблони, проекти и демота" + +msgid "Search Assets (Excluding Templates, Projects, and Demos)" +msgstr "ТърÑене на материали (изключвайки шаблони, проекти и демота)" + msgid "Import..." msgstr "ВнаÑÑне…" @@ -2436,6 +2669,9 @@ msgstr "" "Ðко тази наÑтройка е включено, навигационните полигони и мрежи ще бъдат " "видими в изпълнÑÐ²Ð°Ñ‰Ð¸Ñ Ñе проект." +msgid " - Variation" +msgstr " – ВариациÑ" + msgid "Convert to CPUParticles2D" msgstr "Преобразуване в CPUParticles2D" @@ -2574,6 +2810,9 @@ msgstr "Източник за полигонна мрежа:" msgid "Mesh Up Axis:" msgstr "ÐžÑ Ñочеща нагоре за полигонната мрежа:" +msgid "Objects: %d\n" +msgstr "Обекти: %d\n" + msgid "Top View." msgstr "Изглед отгоре." @@ -3159,11 +3398,8 @@ msgstr "(празно)" msgid "Animations:" msgstr "Ðнимации:" -msgid "Speed:" -msgstr "СкороÑÑ‚:" - -msgid "Loop" -msgstr "ПовтарÑне" +msgid "Delete Animation" +msgstr "Изтриване на анимациÑта" msgid "Animation Frames:" msgstr "Кадри на анимациÑта:" @@ -3207,9 +3443,29 @@ msgstr "Стъпка:" msgid "Styleboxes" msgstr "Стилове" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "1 цвÑÑ‚" +msgstr[1] "{num} цвÑта" + +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "конÑтанта" +msgstr[1] "{num} конÑтанти" + msgid "No constants found." msgstr "ÐÑма намерени конÑтанти." +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "1 размер на шрифт" +msgstr[1] "{num} размера на шрифт" + +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "1 Ñтилова кутиÑ" +msgstr[1] "{num} Ñтилови кутии" + msgid "Importing Theme Items" msgstr "ВнаÑÑне на елементите на темата" @@ -3728,9 +3984,6 @@ msgstr "Избиране на ÑвойÑтво" msgid "Select Virtual Method" msgstr "Избиране на виртуален метод" -msgid "Select Method" -msgstr "Избиране на метод" - msgid "Batch Rename" msgstr "МаÑово преименуване" @@ -3868,6 +4121,11 @@ msgstr "Група бутони" msgid "(Connecting From)" msgstr "(Свързване от)" +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "Обектът има една връзка." +msgstr[1] "Обектът има {num} връзки." + msgid "Open Script:" msgstr "ОтварÑне на Ñкрипт:" @@ -4013,6 +4271,9 @@ msgstr "Размер" msgid "Network Profiler" msgstr "Профилиране на мрежата" +msgid "Delete Property?" +msgstr "Изтриване на ÑвойÑтвото?" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "ТрÑбва да Ñе зададе или Ñъздаде реÑÑƒÑ€Ñ Ð¾Ñ‚ тип NavigationMesh, за може да " @@ -4110,16 +4371,6 @@ msgstr "Ðеправилен публичен ключ за разширение msgid "Invalid package name:" msgstr "Ðеправилно име на пакет:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"„Използване на ÑобÑтвена компилациÑ“ Ñ‚Ñ€Ñбва да е включено, за да могат да Ñе " -"използват приÑтавките." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"„ИзнаÑÑне на AAB“ може да Ñе ползва Ñамо когато е включено „Използване на " -"ÑобÑтвена компилациÑ“." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -4180,7 +4431,7 @@ msgid "Creating APK..." msgstr "Създаване на APK…" msgid "Could not find template APK to export: \"%s\"." -msgstr "Ðе е намерен шаблонен файл APK за изнаÑÑне: %s" +msgstr "Ðе е намерен шаблонен файл APK за изнаÑÑне: „%s“." msgid "" "Missing libraries in the export template for the selected architectures: %s. " @@ -4227,10 +4478,28 @@ msgstr "Ðеправилна верÑÐ¸Ñ Ð½Ð° файла:" msgid "Invalid product version:" msgstr "Ðеправилна верÑÐ¸Ñ Ð½Ð° продукта:" +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape." +msgstr "" +"CollisionPolygon2D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован " +"на CollisionObject2D. Използвайте го Ñамо като под-обект на Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D и Ñ‚.н., за да им дадете форма." + msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Празен CollisionPolygon2D не влиÑе на колизиите." msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape." +msgstr "" +"CollisionShape2D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован на " +"CollisionObject2D. Използвайте го Ñамо като наÑледник на Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, и Ñ‚.н., за да им дадете форма." + +msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" @@ -4269,6 +4538,17 @@ msgstr "" "СвойÑтвото „Path“ Ñ‚Ñ€Ñбва да Ñочи към дейÑтвителен обект от тип Node2D, за да " "работи." +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon3D Ñлужи Ñамо, за да даде форма за колизии на обект оÑнован " +"на CollisionObject3D.\n" +"Използвайте го Ñамо като под-обект на Area3D, StaticBody3D, RigidBody3D, " +"KinematicBody3D и Ñ‚.н., за да им дадете форма." + msgid "Nothing is visible because no mesh has been assigned." msgstr "Ðе Ñе вижда нищо, той като нÑма зададена полигонна мрежа." @@ -4303,5 +4583,12 @@ msgstr "ТрÑбва да Ñе използва правилно разширеРmsgid "(Other)" msgstr "(Други)" +msgid "" +"Shader keywords cannot be used as parameter names.\n" +"Choose another name." +msgstr "" +"Шейдърните Ñлужебни думи не могат да Ñе ползват като имена на ÑвойÑтва.\n" +"Изберете друго име." + msgid "Constants cannot be modified." msgstr "КонÑтантите не могат да бъдат променени." diff --git a/editor/translations/editor/ca.po b/editor/translations/editor/ca.po index 4cad0ebca6..6d888c3448 100644 --- a/editor/translations/editor/ca.po +++ b/editor/translations/editor/ca.po @@ -557,6 +557,9 @@ msgstr "Des del Senyal:" msgid "Scene does not contain any script." msgstr "L'escena no conté cap script." +msgid "Select Method" +msgstr "Selecciona un Mètode" + msgid "Remove" msgstr "Treu" @@ -614,9 +617,6 @@ msgstr "Desconnectar" msgid "Connect a Signal to a Method" msgstr "Connectar un Senyal a un Mètode" -msgid "Edit Connection:" -msgstr "Editar Connexió:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Esteu segurs de que voleu eliminar totes les connexions del senyal \"%s\"?" @@ -735,12 +735,6 @@ msgstr "Bytes:" msgid "Error:" msgstr "Error:" -msgid "Source" -msgstr "Font" - -msgid "Source:" -msgstr "Font:" - msgid "Copy Error" msgstr "Copia l'error" @@ -1645,12 +1639,12 @@ msgstr "Mostrar tots els idiomes" msgid "Show Selected Locales Only" msgstr "Mostrar només els idiomes seleccionats" +msgid "Edit Filters" +msgstr "Edita Filtres" + msgid "Language:" msgstr "Llengua:" -msgid "Script" -msgstr "Script" - msgid "Clear Output" msgstr "Buida la Sortida" @@ -2175,22 +2169,6 @@ msgid "Install from file" msgstr "Instal·la des d'un fitxer" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"S'inicialitzarà el projecte per a compilar per Android. La plantilla " -"s'instal·larà a \"res://android/build\".\n" -"Pots aplicar modificacions i generar el teu propi APK en exportar ( afegir " -"mòduls, canviar el manifest AndroidManifest.xml, etc.).\n" -"Habilita l'opció \"Utilitza Compilació Personalitzada\" en la configuració " -"d'exportació per a Android per personalitzar la compilació." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -3074,6 +3052,9 @@ msgstr "Selecciona i mou els punts, crea punts fent clic dret." msgid "Enable snap and show grid." msgstr "Habilitar ajustament i mostrar quadrÃcula." +msgid "Blend:" +msgstr "Mescla:" + msgid "Point" msgstr "Punt" @@ -3116,15 +3097,9 @@ msgstr "Elimina punts i triangles." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Genera automà ticament triangles de mescla (en comptes d'a mà )" -msgid "Blend:" -msgstr "Mescla:" - msgid "Parameter Changed:" msgstr "Parà metre canviat:" -msgid "Edit Filters" -msgstr "Edita Filtres" - msgid "Output node can't be added to the blend tree." msgstr "No es pot afegir el node de sortida a l'arbre de mescla." @@ -3245,9 +3220,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Reprodueix enrera l'animació seleccionada des del final. (Maj+A)" -msgid "Stop animation playback. (S)" -msgstr "Aturar la reproducció de l'animació. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Reproduir l'animació seleccionada des de l'inici. (Maj+D)" @@ -4116,12 +4088,6 @@ msgstr "Canviar Notificador AABB" msgid "Change Particles AABB" msgstr "Modifica les PartÃcules AABB" -msgid "Change Box Shape Extents" -msgstr "Modifica l'abast de la Forma Caixa" - -msgid "Change Probe Extents" -msgstr "Modifica l'abast de la Sonda" - msgid "Change Capsule Shape Radius" msgstr "Modifica el radi d'una Forma Cà psula" @@ -4804,6 +4770,9 @@ msgstr "Està ndard" msgid "Connections to method:" msgstr "Connexions al mètode:" +msgid "Source" +msgstr "Font" + msgid "Target" msgstr "Objectiu" @@ -5010,9 +4979,6 @@ msgstr "(buit)" msgid "Animations:" msgstr "Animacions:" -msgid "Loop" -msgstr "Bucle" - msgid "Animation Frames:" msgstr "Fotogrames d'Animació:" @@ -5666,9 +5632,6 @@ msgstr "Afegeix una Acció d'Entrada" msgid "Change Action deadzone" msgstr "Canviar zona morta de l'acció" -msgid "Add Input Action Event" -msgstr "Afegeix un Incidència d'Acció de Entrada" - msgid "Erase Input Action" msgstr "Elimina l'Acció d'Entrada" @@ -5693,9 +5656,6 @@ msgstr "Selecciona una Propietat" msgid "Select Virtual Method" msgstr "Selecciona un Mètode Virtual" -msgid "Select Method" -msgstr "Selecciona un Mètode" - msgid "Batch Rename" msgstr "Reanomena en lot" diff --git a/editor/translations/editor/cs.po b/editor/translations/editor/cs.po index 8509e80fbb..3c58f37106 100644 --- a/editor/translations/editor/cs.po +++ b/editor/translations/editor/cs.po @@ -33,13 +33,14 @@ # Mirinek <mirek.nozicka77@gmail.com>, 2022. # LubomÃr Baloun <lubosbaloun@gmail.com>, 2022. # OndÅ™ej Pavelka <flamekick97@gmail.com>, 2022, 2023. +# ElisHoli <eliskaholz@seznam.cz>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-06 09:58+0000\n" -"Last-Translator: OndÅ™ej Pavelka <flamekick97@gmail.com>\n" +"PO-Revision-Date: 2023-02-09 01:51+0000\n" +"Last-Translator: ElisHoli <eliskaholz@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -47,7 +48,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Button" msgstr "TlaÄÃtko" @@ -479,6 +480,18 @@ msgstr "ÄŒÃslo řádku:" msgid "%d replaced." msgstr "%d nahrazeno." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d shoda." +msgstr[1] "%d shod." +msgstr[2] "%d shody." + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d shoda." +msgstr[1] "%d shod." +msgstr[2] "%d shody." + msgid "Match Case" msgstr "RozliÅ¡ovat malá/velká" @@ -540,6 +553,9 @@ msgstr "Ze signálu:" msgid "Scene does not contain any script." msgstr "Scéna neobsahuje žádný skript." +msgid "Select Method" +msgstr "Vybrat metodu" + msgid "Remove" msgstr "Odebrat" @@ -595,9 +611,6 @@ msgstr "Odpojit" msgid "Connect a Signal to a Method" msgstr "PÅ™ipojit signál k metodÄ›" -msgid "Edit Connection:" -msgstr "Upravit spojenÃ:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Jste si jisti, že chcete odstranit vÅ¡echna pÅ™ipojenà ze signálu \"%s\"?" @@ -740,30 +753,15 @@ msgstr "VarovánÃ:" msgid "Error:" msgstr "Chyba:" -msgid "C++ Error" -msgstr "Chyba C++" - -msgid "C++ Error:" -msgstr "Chyba C++:" - -msgid "Source" -msgstr "Zdroj" - -msgid "C++ Source" -msgstr "Zdroj C++" - -msgid "Source:" -msgstr "Zdroj:" - -msgid "C++ Source:" -msgstr "Zdroj C++:" - msgid "Stack Trace" msgstr "Trasovánà zásobnÃku" msgid "Copy Error" msgstr "KopÃrovat chybu" +msgid "C++ Source" +msgstr "Zdroj C++" + msgid "Video RAM" msgstr "Video RAM" @@ -1568,6 +1566,9 @@ msgstr "Vlastnosti" msgid "default:" msgstr "výchozÃ:" +msgid "Operators" +msgstr "Operátory" + msgid "Theme Properties" msgstr "Vlastnosti motivu" @@ -1703,12 +1704,12 @@ msgstr "Zobrazit vÅ¡echny jazyky" msgid "Show Selected Locales Only" msgstr "Zobrazit pouze vybrané jazyky" +msgid "Edit Filters" +msgstr "Editovat filtry" + msgid "Language:" msgstr "Jazyk:" -msgid "Script" -msgstr "Skript" - msgid "Clear Output" msgstr "Vymazat výstup" @@ -2240,23 +2241,6 @@ msgid "Install from file" msgstr "Instalovat ze souboru" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Tato možnost pÅ™ipravà váš projekt na vaÅ¡e vlastnà sestavenà pro Android " -"instalacà zdrojové Å¡ablony v \"res://android/build\".\n" -"Poté můžete pÅ™i exportu pÅ™idat úpravy a vytvoÅ™it si vlastnà soubor APK " -"(pÅ™idánà modulů, zmÄ›na souboru AndroidManifest.xml, atd.)\n" -"Upozorňujeme, že pokud chcete vytvoÅ™it vlastnà sestavenà namÃsto použità " -"pÅ™ipraveného souboru APK, mÄ›la by být v exportnÃm profilu Androidu povolena " -"možnost \"PoužÃt vlastnà sestavenÃ\"." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2476,6 +2460,13 @@ msgstr "Zkratky" msgid "Binding" msgstr "Vazba" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"Podržte %s pro zaokrouhlenà na celá ÄÃsla.\n" +" Pro pÅ™esnÄ›jÅ¡Ã zmÄ›ny podržte Shift." + msgid "All Devices" msgstr "VÅ¡echna zaÅ™ÃzenÃ" @@ -2488,6 +2479,9 @@ msgstr "Ukládám soubor:" msgid "No export template found at the expected path:" msgstr "Na oÄekávané cestÄ› nebyly nalezeny žádné Å¡ablony exportu:" +msgid "Could not open file to read from path \"%s\"." +msgstr "Nelze otevÅ™Ãt soubor pro Ätenà z cesty \"%s\"." + msgid "Packing" msgstr "BalÃm" @@ -3179,6 +3173,9 @@ msgstr "Mapovánà na základÄ› jazyku:" msgid "Locale" msgstr "Jazyky" +msgid "Set %s on %d nodes" +msgstr "Nastavit %s na %d uzlech" + msgid "Select a single node to edit its signals and groups." msgstr "Zvolte vybraný uzel pro editaci jeho signálů a skupin." @@ -3286,6 +3283,9 @@ msgstr "Zvolte a pÅ™esuňte body. Nové uzly vytvoÅ™te pomocà RMB." msgid "Enable snap and show grid." msgstr "Aktivovat pÅ™ichytávánà a zobrazit mřÞku." +msgid "Blend:" +msgstr "ProlÃnánÃ:" + msgid "Point" msgstr "Bod" @@ -3328,15 +3328,9 @@ msgstr "Odstranit body a trojúhelnÃky." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Vygenerovat blend trojúhelnÃky automaticky (ne manuálnÄ›)" -msgid "Blend:" -msgstr "ProlÃnánÃ:" - msgid "Parameter Changed:" msgstr "ZmÄ›nÄ›ný parametr:" -msgid "Edit Filters" -msgstr "Editovat filtry" - msgid "Output node can't be added to the blend tree." msgstr "Výstupnà uzly nemohou být pÅ™idané do blend stromu." @@ -3452,9 +3446,6 @@ msgstr "PÅ™ehrát zvolenou animaci pozpátku ze souÄasné pozice. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "PÅ™ehrát zvolenou animaci pozpátku od konce. (A)" -msgid "Stop animation playback. (S)" -msgstr "Zastavit pÅ™ehrávánà animace. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "PÅ™ehrát vybranou animaci od zaÄátku. (Shift+D)" @@ -3575,6 +3566,9 @@ msgstr "PÅ™ipojit uzly." msgid "Remove selected node or transition." msgstr "Odstranit vybraný uzel nebo pÅ™echod." +msgid "Transition:" +msgstr "PÅ™echod:" + msgid "Play Mode:" msgstr "Režim pÅ™ehrávánÃ:" @@ -3821,6 +3815,9 @@ msgstr "Seskupené" msgid "Add Node Here" msgstr "PÅ™idánà uzlu sem" +msgid "Scaling:" +msgstr "Å kálovánÃ:" + msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." @@ -4289,6 +4286,9 @@ msgstr "" "PÅ™i vzdáleném použità na zaÅ™Ãzenà je tato možnost efektivnÄ›jÅ¡Ã, když je " "povolen sÃÅ¥ový souborový systém." +msgid " - Variation" +msgstr " - Variace" + msgid "Convert to CPUParticles2D" msgstr "PÅ™evést na CPUParticles2D" @@ -4328,6 +4328,9 @@ msgstr "Povrchové body+Normály (orientované)" msgid "Volume" msgstr "Hlasitost" +msgid "Emission Source:" +msgstr "Zdroj emisÃ:" + msgid "Generate Visibility AABB" msgstr "Generovat viditelnostnà AABB" @@ -4596,12 +4599,6 @@ msgstr "ZmÄ›nit AABB Notifier" msgid "Change Particles AABB" msgstr "ZmÄ›nit Äástice AABB" -msgid "Change Box Shape Extents" -msgstr "ZmÄ›nit rozsahy Box Shape" - -msgid "Change Probe Extents" -msgstr "ZmÄ›nit rozsahy Probe" - msgid "Change Capsule Shape Radius" msgstr "ZmÄ›nit polomÄ›r Capsule Shape" @@ -4644,6 +4641,9 @@ msgstr "KlÃÄovánà je deaktivováno (nenà vložen žádný klÃÄ)." msgid "Animation Key Inserted." msgstr "AnimaÄnà klÃÄ vložen." +msgid "Objects: %d\n" +msgstr "Objekty: %d\n" + msgid "Top View." msgstr "Pohled shora." @@ -4677,6 +4677,9 @@ msgstr "OtoÄit" msgid "Translate" msgstr "Posunout" +msgid "Translating:" +msgstr "Posun:" + msgid "Rotating %s degrees." msgstr "Rotuji %s stupňů." @@ -4698,6 +4701,9 @@ msgstr "Rentgen pohled" msgid "Display Unshaded" msgstr "BezestÃnový pohled" +msgid "Normal Buffer" +msgstr "Normálnà vyrovnávacà paměť" + msgid "View Environment" msgstr "Zobrazit prostÅ™edÃ" @@ -5347,6 +5353,9 @@ msgstr "Standard" msgid "Connections to method:" msgstr "PÅ™ipojenà k metodÄ›:" +msgid "Source" +msgstr "Zdroj" + msgid "Target" msgstr "CÃl" @@ -5525,6 +5534,15 @@ msgstr "Neplatná geometrie, nelze vytvoÅ™it light occluder." msgid "Create LightOccluder2D Sibling" msgstr "VytvoÅ™it sourozence LightOccluder2D" +msgid "Simplification:" +msgstr "ZjednoduÅ¡enÃ:" + +msgid "Shrink (Pixels):" +msgstr "ZmenÅ¡enà (pixely):" + +msgid "Grow (Pixels):" +msgstr "ZvÄ›tÅ¡enà (pixely):" + msgid "Update Preview" msgstr "Obnovit náhled" @@ -5570,11 +5588,8 @@ msgstr "(prázdný)" msgid "Animations:" msgstr "Animace:" -msgid "Speed:" -msgstr "Rychlost:" - -msgid "Loop" -msgstr "SmyÄka" +msgid "Delete Animation" +msgstr "Smazat animaci" msgid "Animation Frames:" msgstr "SnÃmky animace:" @@ -5624,18 +5639,48 @@ msgstr "Automatický Å™ez" msgid "Step:" msgstr "Krok:" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "Barvy" +msgstr[1] "Barev" +msgstr[2] "Barvy" + msgid "No colors found." msgstr "Nebyly nalezeny žádné barvy." +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "KonstantnÃ" +msgstr[1] "KonstantnÃch" +msgstr[2] "KonstantnÃ" + msgid "No constants found." msgstr "Nebyly nalezeny žádné konstanty." msgid "No fonts found." msgstr "Nebyla nalezena žádná pÃsma." +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "Velikost pÃsma" +msgstr[1] "Velikost pÃsem" +msgstr[2] "Velikosti pÃsma" + msgid "No icons found." msgstr "Nebyly nalezeny žádné ikony." +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "Styl" +msgstr[1] "Stylů" +msgstr[2] "Styly" + +msgid "{num} currently selected" +msgid_plural "{num} currently selected" +msgstr[0] "právÄ› vybráno {num}" +msgstr[1] "právÄ› vybráno {num}" +msgstr[2] "právÄ› vybráno {num}" + msgid "Nothing was selected for the import." msgstr "Nic nebylo vybráno pro import." @@ -5816,6 +5861,9 @@ msgstr "PÅ™evrátit horizontálnÄ›" msgid "Flip Vertically" msgstr "PÅ™evrátit vertikálnÄ›" +msgid "Scattering:" +msgstr "Rozptyl:" + msgid "Yes" msgstr "Ano" @@ -6528,6 +6576,61 @@ msgid "Can't open project at '%s'." msgstr "Nelze otevÅ™Ãt projekt v '%s'." msgid "" +"The selected project \"%s\" does not specify its supported Godot version in " +"its configuration file (\"project.godot\").\n" +"\n" +"Project path: %s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"KonfiguraÄnà soubor projektu nespecifikuje verzi Godotu ve které byl " +"vytvoÅ™en.\n" +"\n" +"Cesta projektu: %s\n" +"\n" +"Pokud se rozhodnete ho otevÅ™Ãt, tak bude pÅ™eveden do aktuálnÃho formátu " +"konfiguraÄnÃho souboru Godotu.\n" +"VarovánÃ: Nebude možné otevÅ™Ãt projekt v dÅ™ÃvÄ›jÅ¡Ãch verzÃch enginu." + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"NásledujÃcà konfiguraÄnà soubor projektu byl vytvoÅ™en starÅ¡Ã verzà enginu a " +"potÅ™ebuje být konvertován pro aktuálnà verzi:\n" +"\n" +"Cesta k projektu: %s\n" +"\n" +"PÅ™ejete si ho konvertovat?\n" +"VarovánÃ: Nebude možné otevÅ™Ãt projekt v dÅ™ÃvÄ›jÅ¡Ãch verzÃch enginu." + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"Nelze otevÅ™Ãt projekt „%s“ na následujÃcà cestÄ›:\n" +"\n" +"%s\n" +"\n" +"Nastavenà projektu byla vytvoÅ™ena novÄ›jÅ¡Ã verzà enginu, jejÞ nastavenà nenà " +"kompatibilnà s touto verzÃ." + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." @@ -6625,9 +6728,6 @@ msgstr "PÅ™idat vstupnà akci" msgid "Change Action deadzone" msgstr "ZmÄ›nit mrtvou zónu akce" -msgid "Add Input Action Event" -msgstr "PÅ™idat událost vstupnà akce" - msgid "Erase Input Action" msgstr "Vymazat vstupnà akce" @@ -6643,6 +6743,9 @@ msgstr "Mapovánà vstupů" msgid "Localization" msgstr "Lokalizace" +msgid "Autoload" +msgstr "Automatické naÄÃtánÃ" + msgid "Plugins" msgstr "Pluginy" @@ -6655,9 +6758,6 @@ msgstr "Vybrat vlastnost" msgid "Select Virtual Method" msgstr "Vybrat virtuálnà metodu" -msgid "Select Method" -msgstr "Vybrat metodu" - msgid "Batch Rename" msgstr "Dávkové pÅ™ejmenovánÃ" @@ -6945,6 +7045,21 @@ msgstr "(PÅ™ipojovánà z)" msgid "Node configuration warning:" msgstr "Varovánà konfigurace uzlu:" +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "Uzel má jedno pÅ™ipojenÃ." +msgstr[1] "Uzel má {num} pÅ™ipojenÃ" +msgstr[2] "Uzel má pÅ™ipojenÃ" + +msgid "Node is in this group:" +msgid_plural "Node is in the following groups:" +msgstr[0] "Uzel je v této skupinÄ›:" +msgstr[1] "Uzly je v tÄ›chto skupinách:" +msgstr[2] "Uzel je ve skupinách" + +msgid "Click to show signals dock." +msgstr "KliknutÃm zobrazÃte panel signálů." + msgid "Open Script:" msgstr "OtevÅ™Ãt skript:" @@ -7219,6 +7334,9 @@ msgstr "Velikost" msgid "Network Profiler" msgstr "SÃÅ¥ový profiler" +msgid "Delete Property?" +msgstr "Smazat vlastnost?" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "Aby tento uzel mohl fungovat, musà mÃt nastaven nebo vytvoÅ™en zdroj " @@ -7345,21 +7463,19 @@ msgstr "Neplatný veÅ™ejný klÃÄ pro rozÅ¡ÃÅ™enà APK." msgid "Invalid package name:" msgstr "Neplatné jméno balÃÄku:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"Chcete-li použÃvat doplňky, musà být povoleno \"použÃt vlastnà build\"." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Export AAB\" je validnà pouze v pÅ™ÃpadÄ›, že je povolena možnost \"PoužÃt " -"vlastnà sestavu\"." - msgid "Signing release %s..." msgstr "Podepisovánà vydánà %s..." msgid "Could not find keystore, unable to export." msgstr "NepodaÅ™ilo se najÃt úložiÅ¡tÄ› klÃÄů, nelze exportovat." +msgid "" +"output: \n" +"%s" +msgstr "" +"Výstup:\n" +"%s" + msgid "Verifying %s..." msgstr "Ověřuji %s..." @@ -7379,13 +7495,6 @@ msgid "Unsupported export format!" msgstr "Nepodporovaný formát exportu!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Pokus o sestavenà z vlastnà šablony, ale neexistujà pro ni žádné informace o " -"verzi. PÅ™einstalujte jej z nabÃdky \"Projekt\"." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -7422,7 +7531,7 @@ msgid "Creating APK..." msgstr "VytvářÃm APK..." msgid "Could not find template APK to export: \"%s\"." -msgstr "NepodaÅ™ilo se najÃt Å¡ablonu APK pro export: \"%s\"" +msgstr "NepodaÅ™ilo se najÃt Å¡ablonu APK pro export: \"%s\"." msgid "Adding files..." msgstr "PÅ™idávám soubory..." @@ -7604,6 +7713,17 @@ msgstr "" "Této kosti chybà správná klidová póza. PÅ™ejdÄ›te na uzel Skeleton2D a " "nastavte jej." +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon3D sloužà pouze k poskytnutà tvaru kolize pro uzel odvozený " +"od CollisionObject3D.\n" +"PoužÃvejte jej pouze jako potomka Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D atd., abyste jim dali tvar." + msgid "Nothing is visible because no mesh has been assigned." msgstr "Nic nenà zobrazeno, protože nebyla pÅ™iÅ™azena žádná mřÞka." @@ -7612,6 +7732,9 @@ msgid "" msgstr "" "Nic nenà viditelné, protože mřÞky nebyly pÅ™iÅ™azeny do vykreslovacà fronty." +msgid "Generating Probe Volumes" +msgstr "Generovánà objemů sondy" + msgid "This body will be ignored until you set a mesh." msgstr "Toto tÄ›leso bude ignorováno, dokud nenastavÃte model." @@ -7655,6 +7778,13 @@ msgstr "Cesta k AnimationPlayer nevede k uzlu AnimationPlayer." msgid "The AnimationPlayer root node is not a valid node." msgstr "KoÅ™enový uzel AnimationPlayer nenà platný uzel." +msgid "" +"Color: #%s\n" +"LMB: Apply color" +msgstr "" +"Barva: #%s\n" +"LMB: Nastavit barvu" + msgid "Pick a color from the editor window." msgstr "Vyberte barvu z okna editoru." @@ -7740,3 +7870,9 @@ msgstr "PÅ™iÅ™azeno uniformu." msgid "Constants cannot be modified." msgstr "Konstanty nenà možné upravovat." + +msgid "Invalid argument name." +msgstr "Neplatný název argumentu." + +msgid "Invalid macro argument count." +msgstr "Neplatný poÄet argumentů makra." diff --git a/editor/translations/editor/de.po b/editor/translations/editor/de.po index 98ce8d8250..8eb4586c54 100644 --- a/editor/translations/editor/de.po +++ b/editor/translations/editor/de.po @@ -54,7 +54,7 @@ # Jacqueline Ulken <Jacqueline.Ulken@protonmail.com>, 2020. # Günther Bohn <ciscouser@gmx.de>, 2020, 2021. # Tom Wor <mail@tomwor.com>, 2020. -# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020. +# Bjarne Hiller <bjarne.hiller@gmail.com>, 2020, 2023. # Dirk Federmann <weblategodot@dirkfedermann.de>, 2020. # Helmut Hirtes <helmut.h@gmx.de>, 2020. # Michal695 <michalek.jedrzejak@gmail.com>, 2020. @@ -88,13 +88,16 @@ # Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. # miguel <miguel-gonzalez@gmx.de>, 2022. # Least Significant Bite <leastsignificantbite@proton.me>, 2023. +# HolonProduction <holonproduction@gmail.com>, 2023. +# co1inco <colin.meihoefer@gmx.de>, 2023. +# Jakob <js2k2@gmx.de>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-09 20:42+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Jakob <js2k2@gmx.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -102,20 +105,173 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Deaktiviert" msgid "Physical" msgstr "Physisch" +msgid "Left Mouse Button" +msgstr "Linke Maustaste" + +msgid "Right Mouse Button" +msgstr "Rechte Maustaste" + +msgid "Middle Mouse Button" +msgstr "Mittlere Maustaste" + +msgid "Mouse Wheel Up" +msgstr "Mausrad hoch" + +msgid "Mouse Wheel Down" +msgstr "Mausrad runter" + +msgid "Mouse Wheel Left" +msgstr "Mausrad links" + +msgid "Mouse Wheel Right" +msgstr "Mausrad rechts" + +msgid "Mouse Thumb Button 1" +msgstr "Daumentaste 1" + +msgid "Mouse Thumb Button 2" +msgstr "Daumentaste 2" + msgid "Button" msgstr "Button" +msgid "Double Click" +msgstr "Doppelklick" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Mausbewegung an Position (%s) mit Geschwindigkeit (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Linker Stick X-Achse, Joystick 0 X-Achse" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Linker Stick Y-Achse, Joystick 0 Y-Achse" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Rechter Stick X-Achse, Joystick 1 X-Achse" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Rechter Stick Y-Achse, Joystick 1 Y-Achse" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Joystick 2 X-Achse, Linker Trigger, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Joystick 2 Y-Achse, Rechter Trigger, Sony R2, Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "Joystick 3 X-Achse" + +msgid "Joystick 3 Y-Axis" +msgstr "Joystick 3 Y-Achse" + +msgid "Joystick 4 X-Axis" +msgstr "Joystick 4 X-Achse" + +msgid "Joystick 4 Y-Axis" +msgstr "Joystick 4 Y-Achse" + +msgid "Unknown Joypad Axis" +msgstr "Unbekannte Joypad Achse" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Joypad Bewegung auf der Achse %d (%s) mit dem Wert %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Untere Aktion, Sony Kreuz, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Rechte Aktion, Sony Kreis, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Linke Aktion, Sony Rechteck, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Obere Aktion, Sony Dreieck, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Zurück, Sony Select, Xbox Back, Nintendo -" + +msgid "Start, Nintendo +" +msgstr "Start, Nintendo +" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "Linker Steuerknüppel, Sony L3, Xbox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "Rechter Steuerknüppel, Sony R3, Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "Linke Schultertaste, Sony L1, Xbox LB" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "Rechte Schultertaste, Sony R1, Xbox RB" + +msgid "D-pad Up" +msgstr "Steuerkreuz Oben" + +msgid "D-pad Down" +msgstr "Steuerkreuz Unten" + +msgid "D-pad Left" +msgstr "Steuerkreuz Links" + +msgid "D-pad Right" +msgstr "Steuerkreuz Rechts" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox Teilen, PS5 Mikrofon, Nintendo Aufnehmen" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 Touchpad" + +msgid "released" +msgstr "veröffentlicht" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Bildschirm %s bei (%s) mit %s Touch-Punkten" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "" +"Auf Bildschirm gezogen mit %s Touch-Punkten bei der Position (%s) mit einer " +"Geschwindigkeit von (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Vergrößerungsgeste bei (%s) mit Faktor %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Pan Geste bei (%s) mit delta (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "MIDI Eingabe auf Kannal=%s Nachricht=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Eingabe Event mit Tastenkürzel=%s" + +msgid "Accept" +msgstr "Annehmen" + msgid "Select" msgstr "Auswählen" msgid "Cancel" msgstr "Abbrechen" +msgid "Focus Next" +msgstr "Nächster Fokus" + +msgid "Focus Prev" +msgstr "Vorheriger Fokus" + msgid "Left" msgstr "Links" @@ -128,6 +284,12 @@ msgstr "Hoch" msgid "Down" msgstr "Runter" +msgid "Page Up" +msgstr "Bild Auf" + +msgid "Page Down" +msgstr "Bild Ab" + msgid "End" msgstr "Ende" @@ -146,15 +308,30 @@ msgstr "Rückgängig machen" msgid "Redo" msgstr "Wiederherstellen" +msgid "New Line" +msgstr "Neue Zeile" + +msgid "New Blank Line" +msgstr "Neue leere Zeile" + +msgid "New Line Above" +msgstr "Neue Zeile oberhalb" + msgid "Indent" msgstr "Einrücken" +msgid "Dedent" +msgstr "Ausrücken" + msgid "Delete" msgstr "Löschen" msgid "Select All" msgstr "Alles auswählen" +msgid "Select Word Under Caret" +msgstr "Markiere Wort unter Cursor" + msgid "Duplicate Nodes" msgstr "Nodes duplizieren" @@ -207,6 +384,11 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d Element" +msgstr[1] "%d Elemente" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -397,6 +579,14 @@ msgstr "Animationsinterpolationsmodus ändern" msgid "Change Animation Loop Mode" msgstr "Animationswiederholungsmodus ändern" +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"Komprimierte Spuren können nicht bearbeitet oder entfernt werden. " +"Importieren Sie die Animation erneut mit deaktivierter Kompression um das " +"Bearbeiten zu ermöglichen." + msgid "Remove Anim Track" msgstr "Spur entfernen" @@ -667,6 +857,9 @@ msgstr "Durch Signal:" msgid "Scene does not contain any script." msgstr "Szene enthält kein einziges Skript." +msgid "Select Method" +msgstr "Methode auswählen" + msgid "Remove" msgstr "Entfernen" @@ -727,9 +920,6 @@ msgstr "Trennen" msgid "Connect a Signal to a Method" msgstr "Ein Signal mit einer Methode verbinden" -msgid "Edit Connection:" -msgstr "Verbindung bearbeiten:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Sollen wirklich alle Verbindungen des Signals „%s“ entfernt werden?" @@ -875,23 +1065,8 @@ msgstr "Warnung:" msgid "Error:" msgstr "Fehler:" -msgid "C++ Error" -msgstr "C++-Fehler" - -msgid "C++ Error:" -msgstr "C++-Fehler:" - -msgid "Source" -msgstr "Quelle" - -msgid "C++ Source" -msgstr "C++-Quellcode" - -msgid "Source:" -msgstr "Quelle:" - -msgid "C++ Source:" -msgstr "C++-Quellcode:" +msgid "%s Error" +msgstr "%s Fehler" msgid "Stack Trace" msgstr "Stacktrace" @@ -902,6 +1077,9 @@ msgstr "Fehlermeldung kopieren" msgid "Open C++ Source on GitHub" msgstr "C++-Quelldatei auf GitHub aufrufen" +msgid "C++ Source" +msgstr "C++-Quellcode" + msgid "Video RAM" msgstr "Video RAM" @@ -1385,6 +1563,9 @@ msgstr "Navigation" msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + msgid "Nodes and Classes:" msgstr "Nodes und Klassen:" @@ -1395,7 +1576,7 @@ msgid "Error saving profile to path: '%s'." msgstr "Fehler beim Speichern des Profils im Pfad: ‚%s‘." msgid "New" -msgstr "Erstelle" +msgstr "Neu" msgid "Save" msgstr "Speichern" @@ -1742,6 +1923,9 @@ msgstr "Ãœberschreibt %s:" msgid "default:" msgstr "Standard:" +msgid "Operators" +msgstr "Operatoren" + msgid "Theme Properties" msgstr "Theme-Eigenschaften" @@ -1882,12 +2066,12 @@ msgstr "Alle Sprachen anzeigen" msgid "Show Selected Locales Only" msgstr "Nur ausgewählte Sprachen anzeigen" +msgid "Edit Filters" +msgstr "Filter bearbeiten" + msgid "Language:" msgstr "Sprache:" -msgid "Script" -msgstr "Skript" - msgid "Variant" msgstr "Variante" @@ -2455,23 +2639,6 @@ msgid "Install from file" msgstr "Aus Datei installieren" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Hiermit wird der Projektordner für beliebige Android-Builds eingerichtet in " -"dem das Quell-Template nach „res://android/build“ installiert wird.\n" -"Danach können eigene Modifikationen vorgenommen und ein eigens APK " -"exportiert werden (Module hinzufügen, AndroidManifest.xml ändern, usw.).\n" -"Achtung: Um eigene Builds, statt den vorgefertigten zu generieren, muss die " -"„Use Custom Build“-Option in den Android-Export-Voreinstellungen aktiviert " -"sein." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2698,9 +2865,6 @@ msgstr "Tastenkürzel" msgid "Binding" msgstr "Zuordnung" -msgid "%s Error" -msgstr "%s Fehler" - msgid "All Devices" msgstr "Alle Geräte" @@ -3103,6 +3267,22 @@ msgstr "Verwalte Exportvorlagen" msgid "Export With Debug" msgstr "Exportiere mit Debuginformationen" +msgid "Path to FBX2glTF executable is empty." +msgstr "Dateipfad zur ausführbaren Datei von FBX2glTF ist leer." + +msgid "Error executing this file (wrong version or architecture)." +msgstr "Fehler beim Ausführen dieser Datei (falsche Version oder Architektur)." + +msgid "" +"FBX2glTF is required for importing FBX files.\n" +"Please download it and provide a valid path to the binary:" +msgstr "" +"FBX2glTF wird benötigt um FBX Dateien zu importieren.\n" +"Bitte laden Sie es herunter und geben Sie den Pfad zur ausführbaren Datei an:" + +msgid "Click this link to download FBX2glTF" +msgstr "Klicken Sie diesen Link an um FBX2glTF herunterzuladen" + msgid "Browse" msgstr "Durchsuchen" @@ -3331,6 +3511,13 @@ msgstr "Neuimport" msgid "Offset:" msgstr "Versatz:" +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "" +"Warnung: Mehrere Konfigurationen haben identische Einstellungen. Duplikate " +"werden ignoriert." + msgid "Importing Scene..." msgstr "Szene wird importiert..." @@ -3641,6 +3828,9 @@ msgstr "Punkte auswählen und verschieben, erstellen mit RMT." msgid "Enable snap and show grid." msgstr "Schnapp- und Anzeigeraster aktivieren." +msgid "Blend:" +msgstr "Blende:" + msgid "Point" msgstr "Punkt" @@ -3683,15 +3873,9 @@ msgstr "Punkte und Dreiecke löschen." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Vermischungsdreiecke automatisch erstellen (statt manuell)" -msgid "Blend:" -msgstr "Blende:" - msgid "Parameter Changed:" msgstr "Parameter geändert:" -msgid "Edit Filters" -msgstr "Filter bearbeiten" - msgid "Output node can't be added to the blend tree." msgstr "Ausgabe-Node kann nicht zum Mischungsbaum hinzugefügt werden." @@ -3814,9 +3998,6 @@ msgstr "Spiele ausgewählte Animation rückwärts von aktueller Position. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Spiele ausgewählte Animation rückwärts vom Ende. (Umschalt+A)" -msgid "Stop animation playback. (S)" -msgstr "Stoppe Animations-Wiedergabe. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Spiele ausgewählte Animation vom Start. (Umschalt+D)" @@ -4494,6 +4675,21 @@ msgstr "Standardtyp ändern" msgid "Set Handle" msgstr "Wähle Griff" +msgid "This node is a child of a container." +msgstr "Dieses Node ist Kind eines Containers." + +msgid "Use container properties for positioning." +msgstr "Benutze Containereigenschaften zur Positionierung." + +msgid "Use anchors and the rectangle for positioning." +msgstr "Benutze Anker und das Rechteck zur Positionierung." + +msgid "Collapse positioning hint." +msgstr "Hinweis für Positionierung einklappen." + +msgid "Expand positioning hint." +msgstr "Hinweis für Positionierung ausklappen." + msgid "Fill" msgstr "Füllung" @@ -4716,6 +4912,15 @@ msgstr "" "Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am " "effizientesten, das Netzwerk-Dateisystem zu aktivieren." +msgid "Run Multiple Instances" +msgstr "Mehrere Instanzen ausführen" + +msgid " - Variation" +msgstr " - Variation" + +msgid "Unable to preview font" +msgstr "Vorschau für Schriftart nicht verfügbar" + msgid "Convert to CPUParticles2D" msgstr "Zu CPUParticles2D konvertieren" @@ -4761,9 +4966,15 @@ msgstr "Emissionsquelle:" msgid "Generate Visibility AABB" msgstr "Erzeuge Sichtbarkeits-AABB" +msgid "Select path for SDF Texture" +msgstr "Wähle Pfad für SDF Textur" + msgid "Gradient Edited" msgstr "Gradient bearbeitet" +msgid "Reverse/mirror gradient." +msgstr "Gradient spiegeln/umkehren." + msgid "Swap GradientTexture2D Fill Points" msgstr "GrandientTexture2D Füllpunkte vertauschen" @@ -5058,12 +5269,6 @@ msgstr "Benachrichtigendes AABB ändern" msgid "Change Particles AABB" msgstr "Ändere Partikel AABB" -msgid "Change Box Shape Extents" -msgstr "Kastenformausmaße ändern" - -msgid "Change Probe Extents" -msgstr "Sondenausmaße ändern" - msgid "Change Capsule Shape Radius" msgstr "Kapselfromradius ändern" @@ -5142,6 +5347,12 @@ msgstr "Schlüsselbildeinfügen ist deaktiviert (kein Schlüsselbild eingefügt) msgid "Animation Key Inserted." msgstr "Animationsschlüsselbild eingefügt." +msgid "Size: %s (%.1fMP)\n" +msgstr "Größe: %s (%.1fMP)\n" + +msgid "Objects: %d\n" +msgstr "Objekte: %d\n" + msgid "Top View." msgstr "Sicht von oben." @@ -5250,6 +5461,15 @@ msgstr "Freisicht Geschwindigkeitsregler" msgid "Freelook Slow Modifier" msgstr "Freisicht Trägheitsregler" +msgid "Lock Transformation to X axis" +msgstr "Sperre Transformation auf X-Achse" + +msgid "Lock Transformation to Y axis" +msgstr "Sperre Transformation auf Y-Achse" + +msgid "Lock Transformation to Z axis" +msgstr "Sperre Transformation auf Z-Achse" + msgid "Toggle Camera Preview" msgstr "Kameravorschau umschalten" @@ -5890,6 +6110,9 @@ msgstr "Standard" msgid "Connections to method:" msgstr "Verbindungen mit Methode:" +msgid "Source" +msgstr "Quelle" + msgid "Target" msgstr "Ziel" @@ -6138,12 +6361,6 @@ msgstr "(leer)" msgid "Animations:" msgstr "Animationen:" -msgid "Speed:" -msgstr "Geschwindigkeit:" - -msgid "Loop" -msgstr "Wiederholung" - msgid "Animation Frames:" msgstr "Animationsbilder:" @@ -7580,9 +7797,6 @@ msgstr "Füge Eingabeaktion hinzu" msgid "Change Action deadzone" msgstr "Nullschwelle der Aktion ändern" -msgid "Add Input Action Event" -msgstr "Eingabeaktionsereignis hinzufügen" - msgid "Erase Input Action" msgstr "Eingabeaktion löschen" @@ -7610,9 +7824,6 @@ msgstr "Eigenschaft auswählen" msgid "Select Virtual Method" msgstr "Virtuelle Methode auswählen" -msgid "Select Method" -msgstr "Methode auswählen" - msgid "Batch Rename" msgstr "Stapelweise Umbenennung" @@ -8414,23 +8625,10 @@ msgstr "Ungültiger öffentlicher Schlüssel für APK-Erweiterung." msgid "Invalid package name:" msgstr "Ungültiger Paketname:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"„Use Custom Build“ muss aktiviert werden um die Plugins nutzen zu können." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "" "„Passthrough“ ist nur gültig wenn „XR Mode“ als „OpenXR“ gesetzt wurde." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "„Export AAB“ ist nur gültig wenn „Use Custom Build“ aktiviert ist." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"Das „Min SDK“ zu überschreiben ist nur möglich wenn „Use Custom Build“ " -"aktiviert ist." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "„Min SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig ist." @@ -8443,12 +8641,6 @@ msgstr "" "Bibliothek benötigt." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"„Target SDK“ kann nur überschrieben werden wenn „Use Custom Build“ aktiviert " -"ist." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "„Taret SDK“ sollte eine gültige Ganzzahl sein, war aber „%s“, was ungültig " @@ -8516,14 +8708,6 @@ msgid "Unsupported export format!" msgstr "Nicht unterstütztes Exportformat!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Es wurde versucht aus einer eigener Build-Vorlage zu bauen aber es " -"existieren keine Versionsinformation für sie. Neuinstallation im ‚Projekt‘-" -"Menü benötigt." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -9226,6 +9410,13 @@ msgstr "" "als „Ignore“ festgelegt wurde. Zum Beheben muss der Mausfilter als „Stop“ " "oder „Pass“ festgelegt werden." +msgid "" +"Changing the Z index of a control only affects the drawing order, not the " +"input event handling order." +msgstr "" +"Änderungen des Z-Index beeinflussen nur die Reihenfolge der Darstellung, " +"nicht die Reihenfolge der Eingabeverarbeitung." + msgid "Theme Overrides" msgstr "Themen-Ãœberschreibungen" @@ -9235,12 +9426,31 @@ msgstr "Warnung!" msgid "Please Confirm..." msgstr "Bitte bestätigen..." +msgid "You don't have permission to access contents of this folder." +msgstr "Keine Berechtigung um auf den Inhalt des Ordners zuzugreifen." + msgid "Must use a valid extension." msgstr "Eine gültige Datei-Endung muss verwendet werden." msgid "Enable grid minimap." msgstr "Gitterübersichtskarte aktivieren." +msgid "" +"The current font does not support rendering one or more characters used in " +"this Label's text." +msgstr "" +"Die aktuelle Schriftart unterstützt mindestens ein Zeichen nicht, welches im " +"Text des Labels verwendet wird." + +msgid "Right-to-Left" +msgstr "Rechts-nach-Links" + +msgid "Left-to-Right Mark (LRM)" +msgstr "Links-nach-Rechts Markierung (LRM)" + +msgid "Right-to-Left Mark (RLM)" +msgstr "Rechts-nach-Links Markierung (RLM)" + msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Wenn „Exp Edit“ aktiviert ist muss „Min Value“ größer als null sein." @@ -9308,6 +9518,45 @@ msgstr "Wiederholen" msgid "Invalid comparison function for that type." msgstr "Ungültige Vergleichsfunktion für diesen Typ." +msgid "" +"Argument %d of function '%s' can only take a local variable, array, or " +"member." +msgstr "" +"Argument %d der Funktion '%s' kann nur eine lokale Variable, Array oder " +"member annehmen." + +msgid "Built-in function \"%s(%s)\" is only supported on high-end platforms." +msgstr "" +"Integrierte Funktion \"%s(%s)\" wird nur auf High-End Plattformen " +"unterstützt." + +msgid "Recursion is not allowed." +msgstr "Rekursion ist nicht erlaubt." + +msgid "Function '%s' can't be called from source code." +msgstr "Funktion '%s' kann nicht aus dem Quelltext aufgerufen werden." + +msgid "" +"Invalid argument for \"%s(%s)\" function: argument %d should be %s but is %s." +msgstr "" +"Ungültiges Argument für Funktion \"%s(%s)\": Argument %d sollte %s sein aber " +"ist %s." + +msgid "" +"Too few arguments for \"%s(%s)\" call. Expected at least %d but received %d." +msgstr "" +"Zu wenige Argumente für den Aufruf von \"%s(%s)\". Erwarte mindestens %d, " +"nur %d übergeben." + +msgid "" +"Too many arguments for \"%s(%s)\" call. Expected at most %d but received %d." +msgstr "" +"Zu viele Argumente für Aufruf von \"%s(%s)\". Erwarte maximal %d aber es " +"wurden %d übergeben." + +msgid "Expected ',' or ')' after argument." +msgstr "Erwarte ',' oder ')' nach Argument." + msgid "Varying may not be assigned in the '%s' function." msgstr "Varyings dürfen nicht in Funktion ‚%s‘ zugewiesen werden." @@ -9319,3 +9568,60 @@ msgstr "Zuweisung an Uniform." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." + +msgid "An object of type '%s' can't be indexed." +msgstr "Ein Objekt des Typs '%s' kann nicht Indexiert werden." + +msgid "" +"Global non-constant variables are not supported. Expected '%s' keyword " +"before constant definition." +msgstr "" +"Globale nicht-konstante Variablen werden nicht unterstützt. Erwarte '%s' " +"Schlüsselwort vor der Definition einer Konstanten." + +msgid "Expected at least one '%s' statement in a non-void function." +msgstr "Erwartete mindestens eine '%s' Anweisung in einer nicht-void Funktion." + +msgid "Unmatched endif." +msgstr "Unvollständiges endif." + +msgid "" +"Shader include load failed. Does the shader include exist? Is there a cyclic " +"dependency?" +msgstr "" +"Laden des Shader include fehlgeschlagen. Existiert der include des Shaders? " +"Gibt es eine zyklische Abhängigkeit?" + +msgid "Cyclic include found." +msgstr "Zyklisches include erkannt." + +msgid "" +"Direct floating-point comparison (this may not evaluate to `true` as you " +"expect). Instead, use `abs(a - b) < 0.0001` for an approximate but " +"predictable comparison." +msgstr "" +"Direkter Vergleich von Gleitkommazahlen (dies muss entgegen der Vermutung " +"nicht `true` ergeben). Nutzen Sie stattdessen `abs(a - b) < 0.0001` für " +"einen ungefähren, aber vorhersehbaren Vergleich." + +msgid "The const '%s' is declared but never used." +msgstr "Die Konstante '%s' wurde deklariert, aber nie verwendet." + +msgid "The function '%s' is declared but never used." +msgstr "Die Funktion '%s' wurde deklariert, aber nie verwendet." + +msgid "The uniform '%s' is declared but never used." +msgstr "Das Uniform '%s' wurde deklariert, aber nie verwendet." + +msgid "The varying '%s' is declared but never used." +msgstr "Das Varying '%s' wurde deklariert, aber nie verwendet." + +msgid "The local variable '%s' is declared but never used." +msgstr "Die lokale Variable '%s' wurde deklariert, aber nie verwendet." + +msgid "" +"The total size of the %s for this shader on this device has been exceeded " +"(%d/%d). The shader may not work correctly." +msgstr "" +"Die Gesamtgröße der %s für diesen Shader auf diesem Gerät wurde " +"überschritten (%d/%d). Der Shader funktioniert eventuell nicht korrekt." diff --git a/editor/translations/editor/el.po b/editor/translations/editor/el.po index 5fcf5140d9..54c7561f36 100644 --- a/editor/translations/editor/el.po +++ b/editor/translations/editor/el.po @@ -19,13 +19,14 @@ # Anthony V. <batmanplayer123@gmail.com>, 2022. # Anthony V. <anthonyv156@outlook.com>, 2022. # Ilias Vasilakis <vaselas99@gmail.com>, 2023. +# "Overloaded @ Orama Interactive" <manoschool@yahoo.gr>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-15 13:34+0000\n" -"Last-Translator: Ilias Vasilakis <vaselas99@gmail.com>\n" +"PO-Revision-Date: 2023-02-08 18:01+0000\n" +"Last-Translator: \"Overloaded @ Orama Interactive\" <manoschool@yahoo.gr>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" "Language: el\n" @@ -33,11 +34,96 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Physical" +msgstr "Φυσικό" + +msgid "Left Mouse Button" +msgstr "ΑÏιστεÏÏŒ κουμπί ποντικιοÏ" + +msgid "Right Mouse Button" +msgstr "Δεξί κουμπί ποντικιοÏ" + +msgid "Middle Mouse Button" +msgstr "Μεσαίο κουμπί ποντικιοÏ" + +msgid "Mouse Wheel Up" +msgstr "ΡοδÎλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Ï€Î¬Î½Ï‰" + +msgid "Mouse Wheel Down" +msgstr "ΡοδÎλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÎºÎ¬Ï„Ï‰" + +msgid "Mouse Wheel Left" +msgstr "ΡοδÎλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±ÏιστεÏά" + +msgid "Mouse Wheel Right" +msgstr "ΡοδÎλα Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î´ÎµÎ¾Î¹Î¬" + +msgid "Mouse Thumb Button 1" +msgstr "Κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±Î½Ï„Î¯Ï‡ÎµÎ¹Ïα 1" + +msgid "Mouse Thumb Button 2" +msgstr "Κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±Î½Ï„Î¯Ï‡ÎµÎ¹Ïα 2" msgid "Button" msgstr "Κουμπί" +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Κίνηση Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï ÏƒÏ„Î· θÎση (%s) με ταχÏτητα (%s)" + +msgid "Unknown Joypad Axis" +msgstr "Άγνωστος άξονας χειÏιστηÏίου" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Κίνηση χειÏιστηÏίου στον άξονα %d (%s) με τιμή %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Κάτω πλήκτÏο, Sony σταυÏός, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Δεξί πλήκτÏο, Sony κÏκλος, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "ΑÏιστεÏÏŒ πλήκτÏο, Sony τετÏάγωνο, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Πάνω πλήκτÏο, Sony Ï„Ïίγωνο, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Πίσω, Sony Select, Xbox Back, Nintendo -" + +msgid "D-pad Up" +msgstr "D-pad πάνω" + +msgid "D-pad Down" +msgstr "D-pad κάτω" + +msgid "D-pad Left" +msgstr "D-pad αÏιστεÏά" + +msgid "D-pad Right" +msgstr "D-pad δεξιά" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox Share, PS5 μικÏόφωνο, Nintendo Capture" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 επιφάνεια αφής" + +msgid "touched" +msgstr "ακουμπήθηκε" + +msgid "released" +msgstr "αφÎθηκε" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Η οθόνη %s στη θÎση (%s) με %s σημεία αφής" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "Η οθόνη σÏÏθηκε με %s σημεία αφής στη θÎση (%s) με ταχÏτητα (%s)" + msgid "Select" msgstr "Επιλογή" @@ -523,6 +609,9 @@ msgstr "Από Σήμα:" msgid "Scene does not contain any script." msgstr "Η σκηνή δεν πεÏιÎχει δÎσμη ενεÏγειών." +msgid "Select Method" +msgstr "Επιλογή μεθόδου" + msgid "Remove" msgstr "ΑφαίÏεση" @@ -580,9 +669,6 @@ msgstr "ΑποσÏνδεση" msgid "Connect a Signal to a Method" msgstr "ΣÏνδεση Σήματος σε ÎœÎθοδο" -msgid "Edit Connection:" -msgstr "ΕπεξεÏγασία ΣÏνδεσης:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Είστε βÎβαιοι πως θÎλετε να καταÏγήσετε όλες τις συνδÎσεις από το σήμα «%s»;" @@ -704,30 +790,15 @@ msgstr "Î Ïοειδοποίηση:" msgid "Error:" msgstr "Σφάλμα:" -msgid "C++ Error" -msgstr "Σφάλμα C++" - -msgid "C++ Error:" -msgstr "Σφάλμα C++:" - -msgid "Source" -msgstr "Πηγή" - -msgid "C++ Source" -msgstr "Πηγή C++" - -msgid "Source:" -msgstr "Πηγή:" - -msgid "C++ Source:" -msgstr "Πηγή C++:" - msgid "Stack Trace" msgstr "Ίχνος ΣωÏός" msgid "Copy Error" msgstr "ΑντιγÏαφή σφάλματος" +msgid "C++ Source" +msgstr "Πηγή C++" + msgid "Video RAM" msgstr "Βίντεο RAM" @@ -1535,12 +1606,12 @@ msgstr "Εμφάνιση Όλων των Τοπικών Ρυθμίσεων" msgid "Show Selected Locales Only" msgstr "Εμφάνιση Μόνο ΕπιλεγμÎνων Τοπικών Ρυθμίσεων" +msgid "Edit Filters" +msgstr "ΕπεξεÏγασία φίλτÏων" + msgid "Language:" msgstr "Γλώσσα:" -msgid "Script" -msgstr "ΓÏαφή" - msgid "Clear Output" msgstr "ΕκκαθάÏιση εξόδου" @@ -2026,24 +2097,6 @@ msgid "Manage Templates" msgstr "ΔιαχείÏιση Î ÏοτÏπων" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Αυτό θα ετοιμάσει το ÎÏγο σας για Ï€ÏοσαÏμοσμÎνες δομήσεις Android " -"εγκαθιστώντας το Ï€Ïότυπο πηγών στο «res://android/build».\n" -"ΜποÏείτε μετά να κάνετε αλλαγÎÏ‚ και να δομήσετε το δικό σας Ï€ÏοσαÏμοσμÎνο " -"APK στην εξαγωγή (Ï€ÏοσθÎτοντας λειτουÏγικÎÏ‚ μονάδες - modules, αλλάζοντας το " -"AndroidManifest.xml, κλπ.).\n" -"Σημειώστε πως για να γίνουν Ï€ÏοσαÏμοσμÎνες δομήσεις αντί της χÏήσεις των " -"Îτοιμων APK, η επιλογή «Use Custom Build» Ï€ÏÎπει να ενεÏγοποιηθεί στο " -"Ï€Ïότυπο εξαγωγής για Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2885,6 +2938,9 @@ msgstr "Επιλογή και μετακίνηση σημείων, Î´Î·Î¼Î¹Î¿Ï…Ï msgid "Enable snap and show grid." msgstr "ΕνεÏγοποίηση κουμπώματος και εμφάνιση πλÎγματος." +msgid "Blend:" +msgstr "Ανάμειξη:" + msgid "Point" msgstr "Σημείο" @@ -2927,12 +2983,6 @@ msgstr "ΔιαγÏαφή σημείων και Ï„Ïιγώνων." msgid "Generate blend triangles automatically (instead of manually)" msgstr "ΔημιουÏγία Ï„Ïιγώνων μίξης αυτόματα (αντι για χειÏοκινητα)" -msgid "Blend:" -msgstr "Ανάμειξη:" - -msgid "Edit Filters" -msgstr "ΕπεξεÏγασία φίλτÏων" - msgid "Output node can't be added to the blend tree." msgstr "Ο κόμβος εξόδου δεν μποÏεί να Ï€Ïοστεθεί στο δÎντÏο μίξης." @@ -3054,9 +3104,6 @@ msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης αν msgid "Play selected animation backwards from end. (Shift+A)" msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης ανάποδα από το Ï„Îλος. (Shift + A)" -msgid "Stop animation playback. (S)" -msgstr "Πάυση αναπαÏγωγής κίνησης. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης από την αÏχή. (Shift + D)" @@ -4083,12 +4130,6 @@ msgstr "Ειδοποιητής Αλλαγής AABB" msgid "Change Particles AABB" msgstr "Αλλαγή AABB σωματιδίων" -msgid "Change Box Shape Extents" -msgstr "Αλλαγή διαστάσεων ÎºÏ…Î²Î¹ÎºÎ¿Ï ÏƒÏ‡Î®Î¼Î±Ï„Î¿Ï‚" - -msgid "Change Probe Extents" -msgstr "Αλλαγή διαστάσεων αισθητήÏα" - msgid "Change Capsule Shape Radius" msgstr "Αλλαγή ακτίνας κάψουλας" @@ -4806,6 +4847,9 @@ msgstr "Τυπική" msgid "Connections to method:" msgstr "ΣÏνδεση σε μÎθοδο:" +msgid "Source" +msgstr "Πηγή" + msgid "Target" msgstr "Στόχος" @@ -5031,12 +5075,6 @@ msgstr "(άδειο)" msgid "Animations:" msgstr "Κινήσεις:" -msgid "Speed:" -msgstr "ΤαχÏτητα:" - -msgid "Loop" -msgstr "Επανάληψη" - msgid "Animation Frames:" msgstr "ΚαÏΠΚίνησης:" @@ -6037,9 +6075,6 @@ msgstr "Î Ïοσθήκη ΕνÎÏγειας Εισόδου" msgid "Change Action deadzone" msgstr "Αλλαγή ÎεκÏής Ζώνης ΕνÎÏγειας" -msgid "Add Input Action Event" -msgstr "Î Ïοσθήκη συμβάντος εισόδου" - msgid "Erase Input Action" msgstr "ΔιαγÏαφή ενÎÏγειας εισόδου" @@ -6064,9 +6099,6 @@ msgstr "Επιλογή ιδιότητας" msgid "Select Virtual Method" msgstr "Επιλογή εικονικής μεθόδου" -msgid "Select Method" -msgstr "Επιλογή μεθόδου" - msgid "Batch Rename" msgstr "Ομαδική Μετονομασία" @@ -6709,10 +6741,6 @@ msgstr "Μη ÎγκυÏο δημόσιο κλειδί (public key) για επΠmsgid "Invalid package name:" msgstr "ΆκυÏο όνομα πακÎτου:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"Η επιλογή «Use Custom Build» Ï€ÏÎπει να ενεÏγοποιηθεί για χÏήση Ï€ÏοσθÎτων." - msgid "Signing release %s..." msgstr "ΥπογÏαφή Îκδοσης %s..." @@ -6723,13 +6751,6 @@ msgstr "" msgid "Unsupported export format!" msgstr "Μη αποδεκτή μοÏφή εξαγωγής!" -msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Δοκιμή δόμησης από Ï€ÏοσαÏμοσμÎνο Ï€Ïότυπο δόμησης, αλλά δεν υπάÏχουν " -"πληÏοφοÏίες Îκδοσης. ΠαÏακαλοÏμε κάντε επανεγκατάσταση από το Î¼ÎµÎ½Î¿Ï Â«ÎˆÏγο»." - msgid "Building Android Project (gradle)" msgstr "Δόμηση ΈÏγου Android (gradle)" diff --git a/editor/translations/editor/eo.po b/editor/translations/editor/eo.po index fc32c8b9dc..bfdce7d034 100644 --- a/editor/translations/editor/eo.po +++ b/editor/translations/editor/eo.po @@ -15,19 +15,20 @@ # Manuel González <mgoopazo@gmail.com>, 2021. # Wang Tseryui <2251439097@qq.com>, 2021. # Kedr <lava20121991@gmail.com>, 2022. +# Isaac Iverson <isaaciverson1024@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-21 06:01+0000\n" -"Last-Translator: Kedr <lava20121991@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:54+0000\n" +"Last-Translator: Isaac Iverson <isaaciverson1024@gmail.com>\n" "Language-Team: Esperanto <https://hosted.weblate.org/projects/godot-engine/" "godot/eo/>\n" "Language: eo\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Button" msgstr "Butono" @@ -531,6 +532,9 @@ msgstr "De Signalo:" msgid "Scene does not contain any script." msgstr "La sceno ne enhavas ajnan skriptojn." +msgid "Select Method" +msgstr "Elekti metodon" + msgid "Remove" msgstr "Forigi" @@ -588,9 +592,6 @@ msgstr "Malkonekti" msgid "Connect a Signal to a Method" msgstr "Konektu la signalo al metodo" -msgid "Edit Connection:" -msgstr "Redakti Konekton:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Ĉu vi certe volas forigi ĉiajn konektojn el la \"%s\" signalo?" @@ -705,30 +706,15 @@ msgstr "Averto:" msgid "Error:" msgstr "Eraro:" -msgid "C++ Error" -msgstr "C++ Eraro" - -msgid "C++ Error:" -msgstr "C++ Eraro:" - -msgid "Source" -msgstr "Fonto" - -msgid "C++ Source" -msgstr "C++ Fonto" - -msgid "Source:" -msgstr "Fonto:" - -msgid "C++ Source:" -msgstr "C++ Fonto:" - msgid "Stack Trace" msgstr "Stakspuro" msgid "Copy Error" msgstr "Kopii eraro" +msgid "C++ Source" +msgstr "C++ Fonto" + msgid "Video RAM" msgstr "Videomemoro" @@ -1347,7 +1333,7 @@ msgid "Make Current" msgstr "Farigi aktuale" msgid "Import" -msgstr "Enporti" +msgstr "Importi" msgid "Export" msgstr "Eksporti" @@ -1625,12 +1611,12 @@ msgstr "Vidigi ĉiajn lokaĵarojn" msgid "Show Selected Locales Only" msgstr "Vidigi nur elektitajn lokaĵarojn" +msgid "Edit Filters" +msgstr "Redakti filtrojn" + msgid "Language:" msgstr "Lingvo:" -msgid "Script" -msgstr "Skripto" - msgid "Clear Output" msgstr "Vakigi eligon" @@ -2822,6 +2808,9 @@ msgstr "Elekti kaj movi punktojn, krei punktojn per dekstra musbutono." msgid "Enable snap and show grid." msgstr "Åœalti kradokapton kaj vidi kradon." +msgid "Blend:" +msgstr "Mikso:" + msgid "Point" msgstr "Punkto" @@ -2864,12 +2853,6 @@ msgstr "Forigi punktojn kaj triangulojn." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Generi miksajn triangulojn aÅtomate (anstataÅ permane)" -msgid "Blend:" -msgstr "Mikso:" - -msgid "Edit Filters" -msgstr "Redakti filtrojn" - msgid "Output node can't be added to the blend tree." msgstr "Ne eblas aldoni eligan nodon al la miksan arbon." @@ -2971,9 +2954,6 @@ msgstr "Ludi elektitan animacion retre el aktuala pozicio. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Ludi elektitan animacion retre el fino. (Majuskliga klavo+A)" -msgid "Stop animation playback. (S)" -msgstr "Halti reproduktadon de animacio. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Ludi elektitan animacion el komenco. (Majuskliga klavo+D)" @@ -3911,6 +3891,9 @@ msgstr "Norma" msgid "Connections to method:" msgstr "Konektoj al metodo:" +msgid "Source" +msgstr "Fonto" + msgid "Target" msgstr "Celo" @@ -4125,9 +4108,6 @@ msgstr "Aldoni enigan faron" msgid "Change Action deadzone" msgstr "ÅœanÄi mortzonon de faro" -msgid "Add Input Action Event" -msgstr "Aldoni eventon de eniga faro" - msgid "Erase Input Action" msgstr "Forigi enigan faron" @@ -4155,9 +4135,6 @@ msgstr "Elekti atributon" msgid "Select Virtual Method" msgstr "Elekti virtualan metodon" -msgid "Select Method" -msgstr "Elekti metodon" - msgid "Batch Rename" msgstr "Renomi staple" diff --git a/editor/translations/editor/es.po b/editor/translations/editor/es.po index b09862420d..276c662c25 100644 --- a/editor/translations/editor/es.po +++ b/editor/translations/editor/es.po @@ -92,13 +92,16 @@ # Luis Miguel Soto Sánchez <luismiguelsoto@jerez.es>, 2022. # Victor Stancioiu <victorstancioiu@gmail.com>, 2022, 2023. # Daniel Miranda <danmiranda@gmail.com>, 2023. +# Alan Arrecis <alan.arrecis@gmail.com>, 2023. +# Fernando Sacó <saco.fernando@gmail.com>, 2023. +# Damien Monasterios <monasterio13septiembre@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: Daniel Miranda <danmiranda@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -106,14 +109,80 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Desactivar" msgid "Physical" msgstr "FÃsica" +msgid "Left Mouse Button" +msgstr "Botón Izquierdo del Mouse" + +msgid "Right Mouse Button" +msgstr "Botón Derecho del Mouse" + +msgid "Middle Mouse Button" +msgstr "Botón Central del Mouse" + +msgid "Mouse Wheel Up" +msgstr "Rueda del Mouse Hacia Arriba" + +msgid "Mouse Wheel Down" +msgstr "Rueda del Mouse Hacia Abajo" + +msgid "Mouse Wheel Left" +msgstr "Rueda del Mouse Hacia Izquierda" + +msgid "Mouse Wheel Right" +msgstr "Rueda del Mouse Hacia Derecha" + +msgid "Mouse Thumb Button 1" +msgstr "Botón 1 de Pulgar del Mouse" + +msgid "Mouse Thumb Button 2" +msgstr "Botón 2 de Pulgar del Mouse" + msgid "Button" msgstr "Botón" +msgid "Double Click" +msgstr "Doble Clic" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Movimiento del ratón en la posición (%s) con velocidad (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Eje X del Stick Izquierdo, Eje X del Joystick 0" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Eje Y del Stick Izquierdo, Eje Y del Joystick 0" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Eje X del Stick Derecho, Eje X del Joystick 1" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Eje Y del Stick Derecho, Eje Y del Joystick 1" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Eje X del Joystick 2, Gatillo Izquierdo, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Eje Y del Joystick 2, Gatillo Derecho, Sony R2, Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "Eje X del Joystick 3" + +msgid "Joystick 3 Y-Axis" +msgstr "Eje Y del Joystick 3" + +msgid "Joystick 4 X-Axis" +msgstr "Eje X del Joystick" + +msgid "Unknown Joypad Axis" +msgstr "Eje de Joypad Desconocido" + msgid "Select" msgstr "Seleccionar" @@ -189,6 +258,12 @@ msgstr "Argumentos inválidos para construir '%s'" msgid "On call to '%s':" msgstr "En llamada a '%s':" +msgid "Built-in script" +msgstr "Script Integrado" + +msgid "Built-in" +msgstr "Integrado" + msgid "B" msgstr "B" @@ -223,6 +298,9 @@ msgstr "Ya existe una acción con el nombre '%s'." msgid "Add Event" msgstr "Añadir Evento" +msgid "Cannot Remove Action" +msgstr "No se Puede Eliminar la Acción" + msgid "Add" msgstr "Añadir" @@ -256,6 +334,9 @@ msgstr "Mover Puntos Bezier" msgid "Focus" msgstr "Foco" +msgid "Animation Change %s" +msgstr "Cambio de Animación %s" + msgid "Change Animation Length" msgstr "Cambiar Duración de la Animación" @@ -338,10 +419,10 @@ msgid "In-Handle:" msgstr "In-Handle:" msgid "Out-Handle:" -msgstr "Out-Handle:" +msgstr "Mango de Salida:" msgid "Stream:" -msgstr "Stream:" +msgstr "Flujo:" msgid "Start (s):" msgstr "Inicio (s):" @@ -478,7 +559,7 @@ msgid "Methods" msgstr "Métodos" msgid "Bezier" -msgstr "Bezier" +msgstr "Bézier" msgid "Audio" msgstr "Audio" @@ -508,7 +589,7 @@ msgid "Group tracks by node or display them as plain list." msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." msgid "Snap:" -msgstr "Snap:" +msgstr "Ajuste o Conector:" msgid "Animation step value." msgstr "Valor de step de animación." @@ -609,6 +690,16 @@ msgstr "Número de LÃnea:" msgid "%d replaced." msgstr "%d reemplazado." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d coincidencia" +msgstr[1] "%d coincidencias" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d de %d coincidencia" +msgstr[1] "%d de %d coincidencias" + msgid "Match Case" msgstr "Coincidir Mayúsculas/Minúsculas" @@ -670,6 +761,9 @@ msgstr "Desde la Señal:" msgid "Scene does not contain any script." msgstr "La escena no contiene ningún script." +msgid "Select Method" +msgstr "Seleccionar Método" + msgid "Remove" msgstr "Eliminar" @@ -679,6 +773,9 @@ msgstr "Añadir Argumento Extra de Llamada:" msgid "Extra Call Arguments:" msgstr "Argumentos extras de llamada:" +msgid "Unbind Signal Arguments:" +msgstr "Desvincular Argumentos de Señal:" + msgid "Receiver Method:" msgstr "Método Receptor:" @@ -712,6 +809,9 @@ msgstr "Conectar" msgid "Signal:" msgstr "Señal:" +msgid "No description." +msgstr "Sin descripción." + msgid "Connect '%s' to '%s'" msgstr "Conectar «%s» a «%s»" @@ -730,9 +830,6 @@ msgstr "Desconectar" msgid "Connect a Signal to a Method" msgstr "Conectar una Señal a un Método" -msgid "Edit Connection:" -msgstr "Editar Conexión:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "¿Estás seguro/a que quieres eliminar todas las conexiones de la señal \"%s\"?" @@ -879,26 +976,23 @@ msgstr "Advertencia:" msgid "Error:" msgstr "Error:" -msgid "C++ Error" -msgstr "Error de C++" - -msgid "C++ Error:" -msgstr "Error de C++:" +msgid "%s Error" +msgstr "Error %s" -msgid "Source" -msgstr "Fuente" +msgid "Stack Trace" +msgstr "Rastreo de Pila" -msgid "C++ Source" -msgstr "Fuente C++" +msgid "Stack Trace:" +msgstr "Rastreo de Pila:" -msgid "Source:" -msgstr "Fuente:" +msgid "Debug session started." +msgstr "Sesión de depuración iniciada." -msgid "C++ Source:" -msgstr "Fuente C++:" +msgid "Debug session closed." +msgstr "Sesión de depuración cerrada." -msgid "Stack Trace" -msgstr "Rastreo de Pila" +msgid "Delete All Breakpoints in:" +msgstr "Eliminar Todos los Puntos de Interrupción en:" msgid "Copy Error" msgstr "Copiar Error" @@ -906,6 +1000,9 @@ msgstr "Copiar Error" msgid "Open C++ Source on GitHub" msgstr "Código Abierto C++ en GitHub" +msgid "C++ Source" +msgstr "Fuente C++" + msgid "Video RAM" msgstr "Memoria de VÃdeo" @@ -1385,6 +1482,12 @@ msgstr "Navegación" msgid "OpenGL" msgstr "OpenGL" +msgid "Navigation, both 2D and 3D." +msgstr "Navigation, tanto en 2D como en 3D." + +msgid "File saving failed." +msgstr "Error al guardar el archivo." + msgid "Nodes and Classes:" msgstr "Clases y Nodos:" @@ -1401,12 +1504,21 @@ msgstr "Nuevo" msgid "Save" msgstr "Guardar" +msgid "Profile:" +msgstr "Perfil:" + msgid "Reset to Defaults" msgstr "Restablecer Valores Predeterminados" +msgid "Please Confirm:" +msgstr "Confirma, por favor:" + msgid "Export Profile" msgstr "Exportar Perfil" +msgid "Edit Build Configuration Profile" +msgstr "Editar Perfil de Configuración de Compilación" + msgid "Paste Params" msgstr "Pegar Parámetros" @@ -1713,6 +1825,15 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "(Re)Importación de Assets" +msgid "Import resources of type: %s" +msgstr "Importar recursos del tipo: %s" + +msgid "No return value." +msgstr "No retorna ningún valor." + +msgid "Error codes returned:" +msgstr "Códigos de error devueltos:" + msgid "Top" msgstr "Superior" @@ -1740,8 +1861,14 @@ msgstr "anula %s:" msgid "default:" msgstr "predeterminado:" +msgid "Constructors" +msgstr "Constructores" + +msgid "Operators" +msgstr "Operadores" + msgid "Theme Properties" -msgstr "Propiedades del Theme" +msgstr "Propiedades del Tema" msgid "Colors" msgstr "Colores" @@ -1774,9 +1901,15 @@ msgstr "" "Actualmente no existe descripción para esta propiedad. Por favor ¡ayúdanos " "[color=$color][url=$url]contribuyendo una[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "Descripciones de Constructor" + msgid "Method Descriptions" msgstr "Descripciones de Métodos" +msgid "Operator Descriptions" +msgstr "Descripciones de Operador" + msgid "%d match." msgstr "%d coincidencia." @@ -1850,24 +1983,51 @@ msgstr "Subir" msgid "Move Down" msgstr "Bajar" +msgid "Clear Array" +msgstr "Limpiar Array" + +msgid "Resize Array..." +msgstr "Redimensionar Array..." + +msgid "Add Element" +msgstr "Añadir Elemento" + msgid "Resize Array" msgstr "Redimensionar Array" +msgid "New Size:" +msgstr "Nuevo Tamaño:" + +msgid "Element %s" +msgstr "Elemento %s" + +msgid "Add Metadata" +msgstr "Añadir Metadatos" + msgid "Set %s" msgstr "Establecer %s" msgid "Set Multiple:" msgstr "Asignar Múltiples:" +msgid "Remove metadata %s" +msgstr "Eliminar Metadatos %s" + msgid "Pinned %s" msgstr "Fijado %s" msgid "Unpinned %s" msgstr "Desfijado %s" +msgid "Add metadata %s" +msgstr "Añadir Metadatos %s" + msgid "Copy Property Path" msgstr "Copiar Ruta de Propiedad" +msgid "Select existing layout:" +msgstr "Selecciona un diseño existente:" + msgid "Changed Locale Filter Mode" msgstr "Cambiar Modo de Filtro Local" @@ -1877,11 +2037,17 @@ msgstr "Mostrar Todos los Idiomas" msgid "Show Selected Locales Only" msgstr "Mostrar Sólo las Localizaciones Seleccionadas" +msgid "Edit Filters" +msgstr "Editar Filtros" + msgid "Language:" msgstr "Lenguaje:" -msgid "Script" -msgstr "Script" +msgid "Country:" +msgstr "PaÃs:" + +msgid "Language" +msgstr "Idioma" msgid "Variant" msgstr "Variante" @@ -2020,12 +2186,18 @@ msgstr "No hay escena definida para ejecutar." msgid "Save scene before running..." msgstr "Guarda escena antes de ejecutar..." +msgid "Reload the played scene." +msgstr "Recargar escena reproducida." + msgid "Play the project." msgstr "Reproducir el proyecto." msgid "Play the edited scene." msgstr "Reproducir la escena editada." +msgid "Play a custom scene." +msgstr "Reproducir escena personalizada." + msgid "Open Base Scene" msgstr "Abrir Escena Base" @@ -2080,12 +2252,18 @@ msgstr "No se puede deshacer mientras se pulsan los botones del mouse." msgid "Nothing to undo." msgstr "No hay nada que deshacer." +msgid "Remote Undo: %s" +msgstr "Deshacer Remoto: %s" + msgid "Can't redo while mouse buttons are pressed." msgstr "No se puede rehacer mientras los botones del mouse están presionados." msgid "Nothing to redo." msgstr "No hay nada que rehacer." +msgid "Remote Redo: %s" +msgstr "Rehacer Remoto: %s" + msgid "Can't reload a scene that was never saved." msgstr "No se puede volver a cargar una escena que nunca se guardó." @@ -2319,6 +2497,9 @@ msgstr "Proyecto" msgid "Project Settings..." msgstr "Configuración del Proyecto..." +msgid "Project Settings" +msgstr "Configuración del Proyecto" + msgid "Version Control" msgstr "Control de Versiones" @@ -2349,6 +2530,9 @@ msgstr "Editor" msgid "Editor Settings..." msgstr "Configuración del Editor..." +msgid "Command Palette..." +msgstr "Paleta de Comandos..." + msgid "Editor Layout" msgstr "Layout del Editor" @@ -2378,6 +2562,9 @@ msgstr "Administrar CaracterÃsticas del Editor..." msgid "Manage Export Templates..." msgstr "Administrar Plantillas de Exportación..." +msgid "Configure FBX Importer..." +msgstr "Configurar Importador FBX..." + msgid "Help" msgstr "Ayuda" @@ -2405,9 +2592,48 @@ msgstr "Sobre Godot" msgid "Support Godot Development" msgstr "Apoyar el desarrollo de Godot" +msgid "Run the project's default scene." +msgstr "Ejecutar la escena predeterminada del proyecto." + msgid "Run Project" msgstr "Reproducir Proyecto" +msgid "Pause the running project's execution for debugging." +msgstr "Pausar la ejecución del proyecto en ejecución para depuración." + +msgid "Pause Running Project" +msgstr "Pausar Proyecto en Ejecución" + +msgid "Stop the currently running project." +msgstr "Detener el proyecto actualmente en ejecución." + +msgid "Stop Running Project" +msgstr "Detener Proyecto en Ejecución" + +msgid "Run the currently edited scene." +msgstr "Ejecutar la escena actualmente editada." + +msgid "Run Current Scene" +msgstr "Ejecutar Escena Actual" + +msgid "Run a specific scene." +msgstr "Ejecutar una escena especÃfica." + +msgid "Run Specific Scene" +msgstr "Ejecutar Escena EspecÃfica" + +msgid "" +"Enable Movie Maker mode.\n" +"The project will run at stable FPS and the visual and audio output will be " +"recorded to a video file." +msgstr "" +"Habilitar modo de Fabricante de PelÃculas.\n" +"El proyecto se ejecutará a FPS estables y la salida visual y de audio se " +"grabará en un archivo de video." + +msgid "Choose a renderer." +msgstr "Elegir un renderizador." + msgid "Compatibility" msgstr "Compatibilidad" @@ -2447,24 +2673,6 @@ msgid "Install from file" msgstr "Instalar desde archivo" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Esto configurará tu proyecto para las compilaciones personalizadas de " -"Android instalando la plantilla base en \"res://android/build\".\n" -"Luego podrás aplicar las modificaciones y compilar tu propio APK " -"personalizado al exportarlo (agregando módulos, cambiando el AndroidManifest." -"xml, etc.).\n" -"Ten en cuenta que para realizar compilaciones personalizadas en lugar de " -"usar APKs predefinidos, la opción \"Usar Compilación Personalizada\" deberÃa " -"estar habilitada en la configuración de exportación de Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2674,6 +2882,9 @@ msgstr "Escribe tu lógica en el método _run()." msgid "There is an edited scene already." msgstr "Ya hay una escena editada." +msgid "Edit Built-in Action" +msgstr "Editar Acción Integrada" + msgid "Common" msgstr "Más información" @@ -2692,8 +2903,21 @@ msgstr "Atajos" msgid "Binding" msgstr "Vinculación" -msgid "%s Error" -msgstr "Error %s" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"Mantén pulsado %s para redondear a enteros.\n" +"Mantén pulsado Shift para cambios más precisos." + +msgid "No notifications." +msgstr "No hay notificaciones." + +msgid "Show notifications." +msgstr "Mostrar notificaciones." + +msgid "Silence the notifications." +msgstr "Silenciar notificaciones." msgid "All Devices" msgstr "Todos los Dispositivos" @@ -2741,6 +2965,9 @@ msgstr "Fallo en la exportación de los archivos del proyecto." msgid "Can't open file to read from path \"%s\"." msgstr "No se puede abrir el archivo a leer de la ruta \"%s\"." +msgid "Can't open encrypted file to write." +msgstr "No se puede abrir el archivo encriptado para escribir." + msgid "Save ZIP" msgstr "Guardar como ZIP" @@ -3102,6 +3329,9 @@ msgstr "Administrar Plantillas de Exportación" msgid "Export With Debug" msgstr "Exportar Con Depuración" +msgid "Path to FBX2glTF executable is invalid." +msgstr "La ruta al ejecutable FBX2glTF es inválida." + msgid "Browse" msgstr "Examinar" @@ -3131,6 +3361,12 @@ msgstr "Error al mover:" msgid "Error duplicating:" msgstr "Error al duplicar:" +msgid "Failed to save resource at %s: %s" +msgstr "Error al guardar recurso en %s: %s" + +msgid "Failed to load resource at %s: %s" +msgstr "Error al cargar el recurso en %s: %s" + msgid "Unable to update dependencies:" msgstr "No se han podido actualizar las dependencias:" @@ -3289,6 +3525,15 @@ msgstr "Reemplazar en Archivos" msgid "Searching..." msgstr "Buscando..." +msgid "%d match in %d file" +msgstr "%d coincidencia en el archivo %d" + +msgid "%d matches in %d file" +msgstr "%d coincidencias en el archivo %d" + +msgid "%d matches in %d files" +msgstr "%d coincidencias en los archivos %d" + msgid "Add to Group" msgstr "Añadir al Grupo" @@ -3328,9 +3573,27 @@ msgstr "Administrar Grupos" msgid "Reimport" msgstr "Reimportar" +msgid "Enable looping." +msgstr "Activar bucle." + msgid "Offset:" msgstr "Offset:" +msgid "Loop:" +msgstr "Bucle:" + +msgid "Beat Count:" +msgstr "Recuento de Tiempos:" + +msgid "Music Playback:" +msgstr "Reproducción de Música:" + +msgid "Pre-render Configurations" +msgstr "Configuraciones de Prerenderizado" + +msgid "Configuration:" +msgstr "Configuración:" + msgid "Importing Scene..." msgstr "Importando Escena..." @@ -3361,18 +3624,46 @@ msgstr "" "compresión de la textura rojo-verde para reducir el uso de memoria (el canal " "azul se descarta)." +msgid "2D/3D (Auto-Detect)" +msgstr "2D/3D (Detección Automática)" + msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" +msgid "Error opening scene" +msgstr "Error al abrir la escena" + +msgid "Select folder to extract material resources" +msgstr "Selecciona una carpeta para extraer los recursos de material" + +msgid "" +"Material has no name nor any other way to identify on re-import.\n" +"Please name it or ensure it is exported with an unique ID." +msgstr "" +"El material no tiene nombre ni ninguna otra forma de identificarse en la " +"reimportación.\n" +"Por favor, dale un nombre o asegúrese de exportarlo con un ID único." + +msgid "Set paths to save animations as resource files on Reimport" +msgstr "" +"Establecer rutas para guardar animaciones como archivos de recursos al " +"Reimportar" + +msgid "Actions..." +msgstr "Acciones..." + msgid "Meshes" -msgstr "Meshes" +msgstr "Mallas" msgid "Materials" msgstr "Materiales" +msgid "Save Extension:" +msgstr "Guardar Extensión:" + msgid "Select Importer" msgstr "Seleccionar Importador" @@ -3407,7 +3698,10 @@ msgid "Import As:" msgstr "Importar como:" msgid "Preset" -msgstr "Preajuste" +msgstr "Preconfigurado" + +msgid "Advanced..." +msgstr "Avanzado..." msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar Escenas, Reimportar y Reiniciar" @@ -3428,6 +3722,9 @@ msgstr "" "Selecciona un archivo de recursos en el sistema de archivos o en el " "inspector para ajustar la configuración de importación." +msgid "Joypad Axes" +msgstr "Ejes del Joypad" + msgid "Device:" msgstr "Dispositivo:" @@ -3530,9 +3827,15 @@ msgstr "Remapeos por idioma:" msgid "Locale" msgstr "Idioma" +msgid "Set %s on %d nodes" +msgstr "Establecer %s en %d nodos" + msgid "Select a single node to edit its signals and groups." msgstr "Selecciona un único nodo para editar sus señales y grupos." +msgid "Subfolder name is not a valid folder name." +msgstr "El nombre de la subcarpeta no es un nombre de carpeta válido." + msgid "Edit a Plugin" msgstr "Editar Plugin" @@ -3638,6 +3941,12 @@ msgstr "Seleccionar y mover puntos, crear puntos con clic derecho." msgid "Enable snap and show grid." msgstr "Activar snap y mostrar cuadrÃcula." +msgid "Sync:" +msgstr "Sincronizar:" + +msgid "Blend:" +msgstr "Mezcla:" + msgid "Point" msgstr "Punto" @@ -3681,15 +3990,9 @@ msgid "Generate blend triangles automatically (instead of manually)" msgstr "" "Generar triángulos combinados automáticamente (en lugar de manualmente)" -msgid "Blend:" -msgstr "Mezcla:" - msgid "Parameter Changed:" msgstr "Parámetro Modificado:" -msgid "Edit Filters" -msgstr "Editar Filtros" - msgid "Output node can't be added to the blend tree." msgstr "El nodo de salida no puede ser agregado al blend tree." @@ -3763,9 +4066,21 @@ msgstr "Agregar Nodo..." msgid "Enable Filtering" msgstr "Habilitar Filtrado" +msgid "Library Name:" +msgstr "Nombre de la LibrerÃa:" + +msgid "Animation name can't be empty." +msgstr "El nombre de la animación no puede estar vacÃo." + msgid "Load Animation" msgstr "Cargar Animación" +msgid "Invalid AnimationLibrary file." +msgstr "Archivo AnimationLibrary inválido." + +msgid "Invalid Animation file." +msgstr "Archivo Animation inválido." + msgid "Animation Name:" msgstr "Nombre de Animación:" @@ -3775,6 +4090,21 @@ msgstr "Animación Pegada" msgid "Open in Inspector" msgstr "Abrir en el Inspector" +msgid "Paste Animation to Library from clipboard" +msgstr "Pegar Animación a la Biblioteca desde el portapapeles" + +msgid "Save animation library to resource on disk" +msgstr "Guardar biblioteca de animaciones como recurso en el disco" + +msgid "Copy animation to clipboard" +msgstr "Copiar animación al portapapeles" + +msgid "Save animation to resource on disk" +msgstr "Guardar animación como recurso en disco" + +msgid "Edit Animation Libraries" +msgstr "Editar LibrerÃas de Animación" + msgid "Storage" msgstr "Almacenamiento" @@ -3808,6 +4138,9 @@ msgstr "Mezclar el Siguiente Cambio" msgid "Change Blend Time" msgstr "Cambiar Tiempo de Mezcla" +msgid "Duplicated Animation Name:" +msgstr "Nombre de Animación Duplicado:" + msgid "Play selected animation backwards from current pos. (A)" msgstr "" "Reproducir hacia atrás la animación seleccionada desde la posición actual (A)" @@ -3816,9 +4149,6 @@ msgid "Play selected animation backwards from end. (Shift+A)" msgstr "" "Reproducir hacia atrás la animación seleccionada desde el final. (Shift + A)" -msgid "Stop animation playback. (S)" -msgstr "Detener la reproducción de la animación. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Reproducir animación seleccionada desde el principio. (Shift + D)" @@ -3958,7 +4288,7 @@ msgid "Root" msgstr "RaÃz" msgid "AnimationTree" -msgstr "AnimationTree" +msgstr "Ãrbol de Animación" msgid "Contents:" msgstr "Contenido:" @@ -4029,6 +4359,9 @@ msgstr "Fallo en la comprobación del hash SHA-256" msgid "Asset Download Error:" msgstr "Error de Descarga de Assets:" +msgid "Ready to install!" +msgstr "¡Listo para instalar!" + msgid "Downloading (%s / %s)..." msgstr "Descargando (%s / %s)..." @@ -4126,6 +4459,9 @@ msgstr "Archivo ZIP de assets" msgid "Audio Preview Play/Pause" msgstr "Previsualización de Audio Reproducir/Pausar" +msgid "Bone Picker:" +msgstr "Selector de Hueso:" + msgid "Preview" msgstr "Vista Previa" @@ -4213,8 +4549,14 @@ msgstr "Agrupado" msgid "Add Node Here" msgstr "Añadir Nodo AquÃ" +msgid "Moving:" +msgstr "Moviendo:" + +msgid "Rotating:" +msgstr "Rotando:" + msgid "Scaling:" -msgstr "Escala:" +msgstr "Escalando:" msgid "" "Project Camera Override\n" @@ -4718,6 +5060,9 @@ msgstr "" "Cuando se utiliza de forma remota en un dispositivo, esto es más eficiente " "cuando la opción de sistema de archivos en red está activada." +msgid " - Variation" +msgstr " - Variación" + msgid "Convert to CPUParticles2D" msgstr "Convertir a CPUParticles2D" @@ -4855,8 +5200,20 @@ msgstr "No hay mallas para depurar." msgid "Mesh has no UV in layer %d." msgstr "La malla no tiene UV en la capa %d." +msgid "MeshInstance3D lacks a Mesh." +msgstr "MeshInstance3D carece de Malla." + +msgid "Mesh has no surface to create outlines from." +msgstr "La malla no tiene superficie para crear contornos." + +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES." +msgstr "El tipo de primitiva de malla no es PRIMITIVE_TRIANGLES." + +msgid "Could not create outline." +msgstr "No se pudo crear el contorno." + msgid "Create Outline" -msgstr "Crear Outline" +msgstr "Crear Contorno" msgid "Mesh" msgstr "Malla" @@ -5064,12 +5421,6 @@ msgstr "Cambiar Notificador AABB" msgid "Change Particles AABB" msgstr "Cambiar partÃculas AABB" -msgid "Change Box Shape Extents" -msgstr "Cambiar Extensión de la Forma de la Caja" - -msgid "Change Probe Extents" -msgstr "Cambiar Alcance de la Sonda" - msgid "Change Capsule Shape Radius" msgstr "Cambiar Radio de la Forma de la Cápsula" @@ -5148,6 +5499,36 @@ msgstr "Insertar claves está desactivado (no se insertaron claves)." msgid "Animation Key Inserted." msgstr "Clave de animación insertada." +msgid "X: %s\n" +msgstr "X: %s\n" + +msgid "Y: %s\n" +msgstr "Y: %s\n" + +msgid "Z: %s\n" +msgstr "Z: %s\n" + +msgid "Size: %s (%.1fMP)\n" +msgstr "Tamaño: %s (%.1fMP)\n" + +msgid "Objects: %d\n" +msgstr "Objetos: %d\n" + +msgid "Primitive Indices: %d\n" +msgstr "Ãndices Primitivos: %d\n" + +msgid "Draw Calls: %d" +msgstr "Llamadas de Dibujado: %d" + +msgid "CPU Time: %s ms" +msgstr "Tiempo de CPU: %s ms" + +msgid "GPU Time: %s ms" +msgstr "Tiempo de GPU: %s ms" + +msgid "FPS: %d" +msgstr "FPS: %d" + msgid "Top View." msgstr "Vista Superior." @@ -5893,6 +6274,9 @@ msgstr "Estándar" msgid "Connections to method:" msgstr "Conexiones al método:" +msgid "Source" +msgstr "Fuente" + msgid "Target" msgstr "Objetivo" @@ -6056,6 +6440,9 @@ msgstr "Crear LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "Vista Previa de LightOccluder2D" +msgid "Can't convert a Sprite2D from a foreign scene." +msgstr "No se puede convertir un Sprite2D de una escena externa." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "No se puede convertir en malla un sprite usando fotogramas de animación." @@ -6138,15 +6525,15 @@ msgstr "(vacÃo)" msgid "Animations:" msgstr "Animaciones:" -msgid "Speed:" -msgstr "Velocidad:" - -msgid "Loop" -msgstr "Bucle" +msgid "Delete Animation" +msgstr "Eliminar Animación" msgid "Animation Frames:" msgstr "Fotogramas de Animación:" +msgid "Frame Duration:" +msgstr "Duración del Fotograma:" + msgid "Zoom Reset" msgstr "Resetear Zoom" @@ -6195,21 +6582,46 @@ msgstr "Paso:" msgid "Styleboxes" msgstr "Cajas de estilo" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "1 color" +msgstr[1] "{num} colores" + msgid "No colors found." msgstr "No se encontraron colores." +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "1 constante" +msgstr[1] "{num} constantes" + msgid "No constants found." msgstr "No se encontraron constants." msgid "No fonts found." msgstr "No se han encontrado fonts." +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "1 tamaño de fuente" +msgstr[1] "{num} tamaño de fuentes" + msgid "No icons found." msgstr "No se han encontrado icons." +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "1 caja de estilo" +msgstr[1] "{num} cajas de estilo" + msgid "No styleboxes found." msgstr "No se encontraron styleboxes." +msgid "{num} currently selected" +msgid_plural "{num} currently selected" +msgstr[0] "{num} seleccionado actualmente" +msgstr[1] "{num} seleccionados actualmente" + msgid "Nothing was selected for the import." msgstr "No se ha seleccionado nada para la importación." @@ -6492,6 +6904,9 @@ msgstr "Establecer tipo de base de variación" msgid "Set Base Type" msgstr "Establer tipo de base" +msgid "Add a type from a list of available types or create a new one." +msgstr "Añade un tipo de una lista de tipos disponibles o crea uno nuevo." + msgid "Show Default" msgstr "Mostrar por Defecto" @@ -6634,15 +7049,36 @@ msgstr "Voltear Horizontalmente" msgid "Flip Vertically" msgstr "Voltear Verticalmente" +msgid "Painting:" +msgstr "Pintando:" + +msgid "Place Random Tile" +msgstr "Colocar Tile Aleatorio" + +msgid "Scattering:" +msgstr "Dispersión:" + msgid "Tiles" msgstr "Tiles" +msgid "Global actions:" +msgstr "Acciones Globales:" + msgid "Atlas" msgstr "Atlas" +msgid "Paint Properties:" +msgstr "Propiedades de Pintura:" + msgid "Yes" msgstr "SÃ" +msgid "Scenes collection properties:" +msgstr "Propiedades de la Colección de Escenas:" + +msgid "Tile properties:" +msgstr "Propiedades del Tile:" + msgid "TileSet" msgstr "TileSet" @@ -6679,9 +7115,15 @@ msgstr "¿Quieres eliminar la rama %s?" msgid "Do you want to remove the %s remote?" msgstr "¿Quieres eliminar el %s remoto?" +msgid "Create VCS metadata files for:" +msgstr "Crear archivos de metadatos VCS para:" + msgid "Apply" msgstr "Aplicar" +msgid "Connect to VCS" +msgstr "Conectar a VCS" + msgid "Remote Login" msgstr "Inicio de Sesión Remoto" @@ -6829,6 +7271,9 @@ msgstr "Booleano" msgid "Sampler" msgstr "Sampler" +msgid "[default]" +msgstr "[default]" + msgid "Add Input Port" msgstr "Añadir Puerto de Entrada" @@ -6841,6 +7286,9 @@ msgstr "Eliminar Puerto de Entrada" msgid "Remove Output Port" msgstr "Eliminar Puerto de Salida" +msgid "Set Parameter Name" +msgstr "Establecer Nombre de Parámetro" + msgid "Set Input Default Port" msgstr "Establecer Puerto Predeterminado de Entrada" @@ -6853,6 +7301,12 @@ msgstr "Nodo(s) Movido(s)" msgid "Visual Shader Input Type Changed" msgstr "Cambiar Tipo de Entrada del Visual Shader" +msgid "ParameterRef Name Changed" +msgstr "Nombre de ParameterRef Cambiado" + +msgid "Varying Name Changed" +msgstr "Cambio de Nombre" + msgid "Vertex" msgstr "Vértice" @@ -7444,6 +7898,9 @@ msgstr "Ruta de Instalación del Proyecto:" msgid "Renderer:" msgstr "Renderizador:" +msgid "Version Control Metadata:" +msgstr "Metadatos de Control de Versión:" + msgid "Missing Project" msgstr "Proyecto Faltante" @@ -7463,6 +7920,65 @@ msgid "Can't open project at '%s'." msgstr "No se puede abrir el proyecto en '%s'." msgid "" +"The selected project \"%s\" does not specify its supported Godot version in " +"its configuration file (\"project.godot\").\n" +"\n" +"Project path: %s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"El proyecto seleccionado \"%s\" no especifica la versión de Godot soportada " +"en su archivo de configuración (\"project.godot\").\n" +"\n" +"Ruta del proyecto: %s\n" +"\n" +"Si procedes a abrirlo, se convertirá al formato de fichero de configuración " +"actual de Godot.\n" +"\n" +"Advertencia: Ya no podrás abrir el proyecto con versiones anteriores del " +"motor." + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"El proyecto seleccionado \"%s\" fue generado en una versión anterior del " +"motor, y necesita ser convertido a esta versión.\n" +"\n" +"Ruta del proyecto: %s\n" +"\n" +"¿Quieres convertirlo?\n" +"\n" +"Advertencia: Ya no podrás abrir el proyecto con versiones anteriores del " +"motor." + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"No se puede abrir el proyecto \"%s\" en la siguiente ruta:\n" +"\n" +"%s\n" +"\n" +"La configuración del proyecto fue creada por una versión más reciente del " +"motor, cuya configuración no es compatible con esta versión." + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." @@ -7582,9 +8098,6 @@ msgstr "Añadir acción de entrada" msgid "Change Action deadzone" msgstr "Cambiar zona muerta de la acción" -msgid "Add Input Action Event" -msgstr "Añadir Evento de Acción de Entrada" - msgid "Erase Input Action" msgstr "Eliminar Acción de Entrada" @@ -7594,6 +8107,9 @@ msgstr "Renombrar evento de acción de entrada" msgid "Project Settings (project.godot)" msgstr "Configuración del Proyecto (project.godot)" +msgid "Select a Setting or Type its Name" +msgstr "Selecciona un Ajuste o Escribe su Nombre" + msgid "Input Map" msgstr "Mapa de Entrada" @@ -7612,9 +8128,6 @@ msgstr "Seleccionar Propiedad" msgid "Select Virtual Method" msgstr "Seleccionar Método Virtual" -msgid "Select Method" -msgstr "Seleccionar Método" - msgid "Batch Rename" msgstr "Renombrar por lote" @@ -7693,12 +8206,18 @@ msgstr "En el carácter %s" msgid "Reparent Node" msgstr "Reemparentar nodo" +msgid "Select new parent:" +msgstr "Seleccionar nuevo padre:" + msgid "Keep Global Transform" msgstr "Mantener transformación global" msgid "Reparent" msgstr "Reemparentar" +msgid "Root Type:" +msgstr "Tipo de RaÃz:" + msgid "2D Scene" msgstr "Escena 2D" @@ -7708,6 +8227,12 @@ msgstr "Escena 3D" msgid "User Interface" msgstr "Interfaz de usuario" +msgid "Scene Name:" +msgstr "Nombre de Escena:" + +msgid "Root Name:" +msgstr "Nombre de RaÃz:" + msgid "Error loading scene from %s" msgstr "Error al cargar escena desde %s" @@ -7960,6 +8485,19 @@ msgstr "" "el prefijo '%s' en una ruta de nodo.\n" "Haz clic para desactivar esto." +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "El nodo tiene una conexión." +msgstr[1] "El nodo tiene {num} conexiones." + +msgid "Node is in this group:" +msgid_plural "Node is in the following groups:" +msgstr[0] "El nodo está en este grupo:" +msgstr[1] "El nodo está en los siguientes grupos:" + +msgid "Click to show signals dock." +msgstr "Haz clic para mostrar el dock de señales." + msgid "Open Script:" msgstr "Abrir Script:" @@ -8029,6 +8567,12 @@ msgstr "Abrir Script / Seleccionar Ubicación" msgid "Open Script" msgstr "Abrir Script" +msgid "Inherit %s" +msgstr "Heredar %s" + +msgid "Inherit" +msgstr "Heredar" + msgid "File exists, it will be reused." msgstr "El archivo ya existe, será reutilizado." @@ -8091,6 +8635,12 @@ msgstr "Ruta base incorrecta." msgid "Wrong extension chosen." msgstr "Se ha elegido una extensión incorrecta." +msgid "Mode:" +msgstr "Modo:" + +msgid "Global shader parameter '%s' already exists'" +msgstr "El parámetro de shader global '%s' ya existe" + msgid "Change Cylinder Radius" msgstr "Cambiar Radio de Cylinder" @@ -8258,6 +8808,9 @@ msgstr "Tamaño" msgid "Network Profiler" msgstr "Profiler de Red" +msgid "Delete Property?" +msgstr "¿Eliminar Propiedad?" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "Se debe crear o establecer un recurso NavigationMesh para que este nodo " @@ -8308,6 +8861,9 @@ msgstr "Analizando geometrÃa..." msgid "Done!" msgstr "¡Hecho!" +msgid "Error loading %s: %s." +msgstr "Error al cargar %s: %s." + msgid "Pose" msgstr "Pose" @@ -8421,24 +8977,9 @@ msgstr "Clave pública inválida para la expansión de APK." msgid "Invalid package name:" msgstr "Nombre de paquete inválido:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"\"Usar Compilación Personalizada\" debe estar activado para usar los plugins." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "\"Passthrough\" solo es válido cuando el \"Modo XR\" es \"OpenXR\"." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Exportar AAB\" solo es válido cuando \"Usar Compilación Personalizada\" " -"está activado." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Min SDK\" solo puede sobrescribirse cuando está activada la opción \"Usar " -"Compilación Personalizada\"." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Min SDK\" deberÃa ser un entero válido, pero obtuvo \"%s\" que es inválido." @@ -8451,12 +8992,6 @@ msgstr "" "librerÃa de Godot." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"SDK de Destino\" solo se puede sobrescribir cuando \"Usar Compilación " -"Personalizada\" está activado." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"SDK de Destino\" deberÃa ser un entero válido, pero obtuvo \"%s\" inválido." @@ -8499,6 +9034,13 @@ msgstr "No se ha podido iniciar el ejecutable apksigner." msgid "'apksigner' returned with error #%d" msgstr "'apksigner' ha retornado con error #%d" +msgid "" +"output: \n" +"%s" +msgstr "" +"salida: \n" +"%s" + msgid "Verifying %s..." msgstr "Verificando %s..." @@ -8522,14 +9064,6 @@ msgid "Unsupported export format!" msgstr "¡Formato de exportación no compatible!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Se intentó construir a partir de una plantilla personalizada, pero no existe " -"información de la versión para ello. Por favor, reinstala desde el menú " -"'Proyecto'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -8623,6 +9157,9 @@ msgstr "Falta el identificador." msgid "The character '%s' is not allowed in Identifier." msgstr "El carácter '% s' no está permitido en el Identificador." +msgid "Debug Script Export" +msgstr "Exportación de Script de Depuración" + msgid "Failed to open executable file \"%s\"." msgstr "Fallo al abrir el archivo ejecutable \"%s\"." @@ -8635,6 +9172,9 @@ msgstr "Los ejecutables de 32 bits no pueden tener datos embebidos >= 4 GiB." msgid "Executable \"pck\" section not found." msgstr "No se encuentra la sección ejecutable \"pck\"." +msgid "Could not create temp directory:" +msgstr "No se ha podido crear el directorio temporal:" + msgid "Can't get filesystem access." msgstr "No se puede obtener acceso al sistema de archivos." @@ -9132,6 +9672,13 @@ msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "" "PathFollow2D solo funciona cuando está colocado como hijo de un nodo Path2D." +msgid "" +"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a " +"parent node!" +msgstr "" +"¡Un PhysicalBone2D sólo funciona con un Skeleton2D u otro PhysicalBone2D " +"como nodo padre!" + msgid "Path property must point to a valid Node2D node to work." msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar." @@ -9148,6 +9695,17 @@ msgstr "" "Este hueso no tiene una pose de DESCANSO adecuada. Ve al nodo Skeleton2D y " "asÃgnale una." +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon3D solo sirve para proporcionar una forma de colisión a un " +"nodo derivado de CollisionObject3D.\n" +"Por favor, úsalo solo como hijo de Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. para darles una forma." + msgid "Nothing is visible because no mesh has been assigned." msgstr "No hay nada visible porque no se ha asignado ninguna malla." @@ -9157,6 +9715,9 @@ msgstr "" "No hay nada visible porque no se han asignado mallas para los pases de " "dibujo." +msgid "Generating Probe Volumes" +msgstr "Generando Volúmenes de Sonda" + msgid "This body will be ignored until you set a mesh." msgstr "Este cuerpo será ignorado hasta que se establezca una malla." @@ -9211,9 +9772,19 @@ msgstr "" "Clic izq: Aplicar color\n" "Clic der: Borrar configuración predeterminada" +msgid "" +"Color: #%s\n" +"LMB: Apply color" +msgstr "" +"Color: #%s\n" +"Clic izq: Aplicar color" + msgid "Pick a color from the editor window." msgstr "Selecciona un color de la ventana del editor." +msgid "Select a picker shape." +msgstr "Selecciona una forma de selección." + msgid "Switch between hexadecimal and code values." msgstr "Cambiar entre valores hexadecimales y de código." @@ -9269,6 +9840,15 @@ msgid "(Other)" msgstr "(Otros)" msgid "" +"Setting node name '%s' to be unique within scene for '%s', but it's already " +"claimed by '%s'.\n" +"'%s' is no longer set as having a unique name." +msgstr "" +"Se está estableciendo el nombre del nodo '%s' para que sea único dentro de " +"la escena para '%s', pero ya está reclamado por '%s'.\n" +"'%s' ya no está establecido como un nombre único." + +msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" @@ -9295,6 +9875,16 @@ msgstr "" "El tamaño del Viewport debe ser mayor o igual a 2 pÃxeles en ambas " "dimensiones para renderizar cualquier cosa." +msgid "Unsupported BMFont texture format." +msgstr "Formato de textura BMFont no compatible." + +msgid "" +"Shader keywords cannot be used as parameter names.\n" +"Choose another name." +msgstr "" +"Las palabras clave de shader no se pueden usar como nombres de parámetro.\n" +"Elige otro nombre." + msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." @@ -9331,3 +9921,24 @@ msgstr "Asignación a uniform." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." + +msgid "Invalid variable type (samplers are not allowed)." +msgstr "Tipo de variable inválido (los samplers no están permitidos)." + +msgid "Expected data type." +msgstr "Tipo de datos esperado." + +msgid "Invalid constant type (samplers are not allowed)." +msgstr "Tipo de constante inválido (los samplers no están permitidos)." + +msgid "Invalid function type (samplers are not allowed)." +msgstr "Tipo de función inválido (los samplers no están permitidos)." + +msgid "Expected a '%s'." +msgstr "Se esperaba un '%s'." + +msgid "Invalid argument name." +msgstr "Nombre de argumento inválido." + +msgid "Invalid macro argument count." +msgstr "Contador de argumentos de macro inválido." diff --git a/editor/translations/editor/es_AR.po b/editor/translations/editor/es_AR.po index a5e4079b72..964b6858b9 100644 --- a/editor/translations/editor/es_AR.po +++ b/editor/translations/editor/es_AR.po @@ -552,6 +552,9 @@ msgstr "Desde la Señal:" msgid "Scene does not contain any script." msgstr "La escena no contiene ningún script." +msgid "Select Method" +msgstr "Seleccionar Método" + msgid "Remove" msgstr "Quitar" @@ -609,9 +612,6 @@ msgstr "Desconectar" msgid "Connect a Signal to a Method" msgstr "Conectar una Señal a un Método" -msgid "Edit Connection:" -msgstr "Editar Conexión:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "¿Estás seguro/a que querés quitar todas las conexiones de la señal \"%s\"?" @@ -754,23 +754,8 @@ msgstr "Advertencia:" msgid "Error:" msgstr "Error:" -msgid "C++ Error" -msgstr "Error de C++" - -msgid "C++ Error:" -msgstr "Error de C++:" - -msgid "Source" -msgstr "Fuente" - -msgid "C++ Source" -msgstr "Fuente C++" - -msgid "Source:" -msgstr "Fuente:" - -msgid "C++ Source:" -msgstr "Fuente C++:" +msgid "%s Error" +msgstr "Error de %s" msgid "Stack Trace" msgstr "Stack Trace" @@ -781,6 +766,9 @@ msgstr "Copiar Error" msgid "Open C++ Source on GitHub" msgstr "Abrir Fuente C++ en GitHub" +msgid "C++ Source" +msgstr "Fuente C++" + msgid "Video RAM" msgstr "Mem. de Video" @@ -1737,12 +1725,12 @@ msgstr "Mostrar Todas las Localizaciones" msgid "Show Selected Locales Only" msgstr "Mostrar Sólo las Localizaciones Seleccionadas" +msgid "Edit Filters" +msgstr "Editar Filtros" + msgid "Language:" msgstr "Lenguaje:" -msgid "Script" -msgstr "Script" - msgid "Clear Output" msgstr "Limpiar Salida" @@ -2285,24 +2273,6 @@ msgid "Install from file" msgstr "Instalar desde archivo" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Esto va a inicializar tu proyecto para builds de Android personalizados, " -"instalando la plantilla de origen en \"res://android/build\".\n" -"Una vez hecho ésto podés aplicar modificaciones y generar tu propio APK " -"personalizado al exportar (agregar módulos, cambiar el AndroidManifest.xml, " -"etc.).\n" -"Tené en cuenta que para generar builds personalizados en vez de usar los " -"APKs pregenerados, la opcion \"Usar Build Personalizado\" deberÃa estar " -"activada en el preset de exportación de Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2523,9 +2493,6 @@ msgstr "Atajos" msgid "Binding" msgstr "Binding" -msgid "%s Error" -msgstr "Error de %s" - msgid "All Devices" msgstr "Todos los Dispositivos" @@ -3367,6 +3334,9 @@ msgstr "Seleccionar y mover puntos, crear puntos con click derecho." msgid "Enable snap and show grid." msgstr "Activar ajuste y mostrar grilla." +msgid "Blend:" +msgstr "Blend:" + msgid "Point" msgstr "Punto" @@ -3409,15 +3379,9 @@ msgstr "Borrar puntos y triángulos." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Generar triángulos de blending automáticamente (en vez de manualmente)" -msgid "Blend:" -msgstr "Blend:" - msgid "Parameter Changed:" msgstr "Parámetro Modificado:" -msgid "Edit Filters" -msgstr "Editar Filtros" - msgid "Output node can't be added to the blend tree." msgstr "El nodo de salida no puede ser agregado al blend tree." @@ -3541,9 +3505,6 @@ msgid "Play selected animation backwards from end. (Shift+A)" msgstr "" "Reproducir hacia atrás la animación seleccionada desde el final. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Detener la reproducción de la animación. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Reproducir animación seleccinada desde el principio. (Shift + D)" @@ -4708,12 +4669,6 @@ msgstr "Cambiar Notificador AABB" msgid "Change Particles AABB" msgstr "Cambiar Particulas AABB" -msgid "Change Box Shape Extents" -msgstr "Cambiar Radio de Shape Caja" - -msgid "Change Probe Extents" -msgstr "Cambiar Extensión de Sonda" - msgid "Change Capsule Shape Radius" msgstr "Cambiar Radio de Shape Cápsula" @@ -5519,6 +5474,9 @@ msgstr "Estándar" msgid "Connections to method:" msgstr "Conexiones al método:" +msgid "Source" +msgstr "Fuente" + msgid "Target" msgstr "Objetivo" @@ -5751,12 +5709,6 @@ msgstr "(vacÃo)" msgid "Animations:" msgstr "Animaciones:" -msgid "Speed:" -msgstr "Velocidad:" - -msgid "Loop" -msgstr "Loop" - msgid "Animation Frames:" msgstr "Fotogramas de animación:" @@ -7138,9 +7090,6 @@ msgstr "Agregar Acción de Entrada" msgid "Change Action deadzone" msgstr "Cambiar zona muerta de la Acción" -msgid "Add Input Action Event" -msgstr "Agregar Evento de Acción de Entrada" - msgid "Erase Input Action" msgstr "Borrar Acción de Entrada" @@ -7168,9 +7117,6 @@ msgstr "Seleccionar Propiedad" msgid "Select Virtual Method" msgstr "Seleccionar Método Virtual" -msgid "Select Method" -msgstr "Seleccionar Método" - msgid "Batch Rename" msgstr "Renombrar en Masa" @@ -7937,13 +7883,6 @@ msgstr "Clave pública inválida para la expansión de APK." msgid "Invalid package name:" msgstr "Nombre de paquete inválido:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Use Custom Build\" debe estar activado para usar los plugins." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Export AAB\" sólo es válido cuando \"Use Custom Build\" está activado." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -7987,14 +7926,6 @@ msgid "Unsupported export format!" msgstr "¡Formato de exportación no soportado!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Intentando construir a partir de una plantilla personalizada, pero no existe " -"información de la versión para ello. Por favor, reinstalá desde el menú " -"'Proyecto'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/fi.po b/editor/translations/editor/fi.po index 96f066c8bd..559817673a 100644 --- a/editor/translations/editor/fi.po +++ b/editor/translations/editor/fi.po @@ -533,6 +533,9 @@ msgstr "Signaalista:" msgid "Scene does not contain any script." msgstr "Kohtaus ei sisällä skriptiä." +msgid "Select Method" +msgstr "Valitse metodi" + msgid "Remove" msgstr "Poista" @@ -589,9 +592,6 @@ msgstr "Katkaise yhteys" msgid "Connect a Signal to a Method" msgstr "Yhdistä signaali metodiin" -msgid "Edit Connection:" -msgstr "Muokkaa yhteyttä:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Oletko varma, että haluat poistaa kaikki kytkennät signaalilta \"%s\"?" @@ -734,23 +734,8 @@ msgstr "Varoitus:" msgid "Error:" msgstr "Virhe:" -msgid "C++ Error" -msgstr "C++ virhe" - -msgid "C++ Error:" -msgstr "C++ virhe:" - -msgid "Source" -msgstr "Lähde" - -msgid "C++ Source" -msgstr "C++ lähdekoodi" - -msgid "Source:" -msgstr "Lähdekoodi:" - -msgid "C++ Source:" -msgstr "C++ lähdekoodi:" +msgid "%s Error" +msgstr "%s virhe" msgid "Stack Trace" msgstr "Pinojäljitys" @@ -761,6 +746,9 @@ msgstr "Kopioi virhe" msgid "Open C++ Source on GitHub" msgstr "Avaa C++ lähdekoodi GitHubissa" +msgid "C++ Source" +msgstr "C++ lähdekoodi" + msgid "Video RAM" msgstr "Näyttömuisti" @@ -1714,12 +1702,12 @@ msgstr "Näytä kaikki kielialueet" msgid "Show Selected Locales Only" msgstr "Näytä vain valitut kielialueet" +msgid "Edit Filters" +msgstr "Muokkaa suodattimia" + msgid "Language:" msgstr "Kieli:" -msgid "Script" -msgstr "Skripti" - msgid "Clear Output" msgstr "Tyhjennä tuloste" @@ -2252,23 +2240,6 @@ msgid "Install from file" msgstr "Asenna tiedostosta" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Tämä valmistelee projektisi mukautettuja Android-käännöksiä varten " -"asentamalla lähdemallin hakemistoon \"res://android/build\".\n" -"Voit sen jälkeen soveltaa muunnoksia ja kääntää oman räätälöidyn APK:n " -"vientiin (lisäten moduuleja, muuttaen AndroidManifest.xml tiedostoa, jne.)\n" -"Huomaa, että tehdäksesi mukautettuja käännöksiä esikäännetyn APK:n " -"käyttämisen sijaan, \"Use Custom Build\" valinnan tulee olla päällä Android-" -"viennin esiasetuksissa." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2488,9 +2459,6 @@ msgstr "Pikanäppäimet" msgid "Binding" msgstr "Sidonta" -msgid "%s Error" -msgstr "%s virhe" - msgid "All Devices" msgstr "Kaikki laitteet" @@ -3352,6 +3320,9 @@ msgstr "Valitse ja siirrä pisteitä, luo pisteitä hiiren oikealla napilla." msgid "Enable snap and show grid." msgstr "Aseta tarttuminen ja näytä ruudukko." +msgid "Blend:" +msgstr "Sulautus:" + msgid "Point" msgstr "Piste" @@ -3394,15 +3365,9 @@ msgstr "Poista pisteet ja kolmiot." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Luo sulautuskolmiot automaattisesti (manuaalisen sijaan)" -msgid "Blend:" -msgstr "Sulautus:" - msgid "Parameter Changed:" msgstr "Parametri muutettu:" -msgid "Edit Filters" -msgstr "Muokkaa suodattimia" - msgid "Output node can't be added to the blend tree." msgstr "Lähtösolmua ei voida lisätä sulautuspuuhun." @@ -3521,9 +3486,6 @@ msgstr "Toista valittu animaatio takaperin nykyisestä kohdasta. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Toista valittu animaatio takaperin lopusta. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Lopeta animaation toisto. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Toista valittu animaatio alusta. (Shift+D)" @@ -4695,12 +4657,6 @@ msgstr "Muuta ilmoittajan AABB" msgid "Change Particles AABB" msgstr "Muuta partikkelien AABB" -msgid "Change Box Shape Extents" -msgstr "Muuta laatikkomuodon ulottuvuuksia" - -msgid "Change Probe Extents" -msgstr "Muuta Proben ulottuvuuksia" - msgid "Change Capsule Shape Radius" msgstr "Muuta kapselimuodon sädettä" @@ -5505,6 +5461,9 @@ msgstr "Standardi" msgid "Connections to method:" msgstr "Yhteydet metodiin:" +msgid "Source" +msgstr "Lähde" + msgid "Target" msgstr "Kohde" @@ -5745,12 +5704,6 @@ msgstr "(tyhjä)" msgid "Animations:" msgstr "Animaatiot:" -msgid "Speed:" -msgstr "Nopeus:" - -msgid "Loop" -msgstr "Toista" - msgid "Animation Frames:" msgstr "Animaatioruudut:" @@ -7143,9 +7096,6 @@ msgstr "Lisää syötetapahtuma" msgid "Change Action deadzone" msgstr "Vaihda toiminnon katvealue" -msgid "Add Input Action Event" -msgstr "Lisää syötetoiminnon tapahtuma" - msgid "Erase Input Action" msgstr "Tyhjennä syötetoiminto" @@ -7173,9 +7123,6 @@ msgstr "Valitse ominaisuus" msgid "Select Virtual Method" msgstr "Valitse virtuaalinen metodi" -msgid "Select Method" -msgstr "Valitse metodi" - msgid "Batch Rename" msgstr "Niputettu uudelleennimeäminen" @@ -7931,16 +7878,6 @@ msgstr "Virheellinen julkinen avain APK-laajennosta varten." msgid "Invalid package name:" msgstr "Virheellinen paketin nimi:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"\"Use Custom Build\" asetuksen täytyy olla päällä, jotta liittännäisiä voi " -"käyttää." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Export AAB\" on käyttökelpoinen vain, kun \"Use Custom Build\" asetus on " -"päällä." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -7989,13 +7926,6 @@ msgid "Unsupported export format!" msgstr "Vientiformaatti ei ole tuettu!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Yritetään kääntää mukautetulla käännösmallilla, mutta sillä ei ole " -"versiotietoa. Ole hyvä ja uudelleenasenna se 'Projekti'-valikosta." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/fr.po b/editor/translations/editor/fr.po index bd3d516a44..acb33aecf6 100644 --- a/editor/translations/editor/fr.po +++ b/editor/translations/editor/fr.po @@ -101,7 +101,7 @@ # Arnaud Lier <arnaud@ric-rac.org>, 2022. # Jérémie Guegain <mirejai@orange.fr>, 2022. # cwulveryck <cwulveryck@online.fr>, 2022. -# Helix Sir <vincentbarkmann@gmail.com>, 2022. +# Helix Sir <vincentbarkmann@gmail.com>, 2022, 2023. # SCHUTZ Lucas <lucas.schutz0954@gmail.com>, 2022. # EGuillemot <Elouen.Guillemot@gmail.com>, 2022. # Entiz <maxime.salido@gmail.com>, 2022. @@ -109,13 +109,17 @@ # Hugo Berthet-Rambaud <hugoberthetrambaud@outlook.com>, 2023. # Nathan Chambrette <n.chambrette@gmail.com>, 2023. # slundi <slundi@gmail.com>, 2023. +# Elouan MAILLY <leloupandco@gmail.com>, 2023. +# nuclehon <benjamin.deslandes1@gmail.com>, 2023. +# Siandfrance <Siandfrance@gmail.com>, 2023. +# Thalya Gauvrit <skar0ps.dev@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-14 00:01+0000\n" -"Last-Translator: slundi <slundi@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Siandfrance <Siandfrance@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -123,20 +127,191 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Vider" msgid "Physical" msgstr "Physique" +msgid "Left Mouse Button" +msgstr "Bouton de souris gauche" + +msgid "Right Mouse Button" +msgstr "Bouton de souris droit" + +msgid "Middle Mouse Button" +msgstr "Clic molette de souris" + +msgid "Mouse Wheel Up" +msgstr "Molette vers le haut" + +msgid "Mouse Wheel Down" +msgstr "Molette vers le bas" + +msgid "Mouse Wheel Left" +msgstr "Molette vers la gauche" + +msgid "Mouse Wheel Right" +msgstr "Molette vers la droite" + +msgid "Mouse Thumb Button 1" +msgstr "Bouton latéral de souris 1" + +msgid "Mouse Thumb Button 2" +msgstr "Bouton latéral de souris 2" + msgid "Button" msgstr "Bouton" +msgid "Double Click" +msgstr "Double clic" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Mouvement de souris vers la position (%s) avec une vélocité de (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Axe X stick gauche , Axe X Joystick 0" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Axe Y stick gauche, Axe Y Joystick 0" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Axe X stick droit, Axe X Joystick 1" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Axe Y stick droit, Axe Y Joystick 1" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Axe X Joystick 2, Gâchette gauche, L2 Sony, LT Xbox" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Axe Y Joystick 2, Gâchette droite, R2 Sony, RT Xbox" + +msgid "Joystick 3 X-Axis" +msgstr "Axe X du Joystick 3" + +msgid "Joystick 3 Y-Axis" +msgstr "Axe Y du Joystick 3" + +msgid "Joystick 4 X-Axis" +msgstr "Axe X du Joystick 4" + +msgid "Joystick 4 Y-Axis" +msgstr "Axe Y du Joystick 4" + +msgid "Unknown Joypad Axis" +msgstr "Axe de contrôleur inconnu" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Mouvement du contrôleur sur l'axe %d (%s) d'une valeur de %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Action du bas, Croix Sony, A Xbox, B Nintendo" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Action droite, Rond Sony, B Xbox, A Nintendo" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Action gauche, Carré Sony, X Xbox, Y Nintendo" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Action du haut, Triangle Sony, Y Xbox, X Nintendo" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Retour, Select Sony, Back Xbox, - Nintendo" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "Guide, PS Sony, Home Xbox" + +msgid "Start, Nintendo +" +msgstr "Start, + Nintendo" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "Stick gauche, L3 Sony, L/LS Xbox" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "Stick droit, R3 Sony, R/RS Xbox" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "Gâchette haute gauche, L1 Sony, LB Xbox" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "Gâchette haute droite, R1 Sony, RB Xbox" + +msgid "D-pad Up" +msgstr "Flèche du haut" + +msgid "D-pad Down" +msgstr "Flèche du bas" + +msgid "D-pad Left" +msgstr "Flèche gauche" + +msgid "D-pad Right" +msgstr "Flèche droite" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Share Xbox, Microphone PS5, Capture Nintendo" + +msgid "Xbox Paddle 1" +msgstr "Palette Xbox 1" + +msgid "Xbox Paddle 2" +msgstr "Palette Xbox 2" + +msgid "Xbox Paddle 3" +msgstr "Palette Xbox 3" + +msgid "Xbox Paddle 4" +msgstr "Palette Xbox 4" + +msgid "PS4/5 Touchpad" +msgstr "Pavé tactile PS4/5" + +msgid "touched" +msgstr "Touché" + +msgid "released" +msgstr "Relâché" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Écran %s à (%s) avec %s points de contact" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "" +"Écran glissé avec %s points de contact vers la position (%s) avec une " +"vélocité de (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Geste d’agrandissement à (%s) avec un facteur de %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Geste de mouvement panoramique à (%s) avec un delta de (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "Entrée MIDI sur le canal=%s Message=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Événement d’entrée avec raccourci=%s" + +msgid "Accept" +msgstr "Accepter" + msgid "Select" msgstr "Sélectionner" msgid "Cancel" msgstr "Annuler" +msgid "Focus Next" +msgstr "Cibler suivant" + +msgid "Focus Prev" +msgstr "Cibler précédent" + msgid "Left" msgstr "Gauche" @@ -149,6 +324,15 @@ msgstr "Monter" msgid "Down" msgstr "Descendre" +msgid "Page Up" +msgstr "Page Haut" + +msgid "Page Down" +msgstr "Page Bas" + +msgid "Home" +msgstr "Accueil" + msgid "End" msgstr "Fin" @@ -167,24 +351,75 @@ msgstr "Annuler" msgid "Redo" msgstr "Refaire" +msgid "Completion Query" +msgstr "Requête de complétion" + +msgid "New Line" +msgstr "Nouvelle ligne" + +msgid "New Blank Line" +msgstr "Nouvelle ligne vide" + +msgid "New Line Above" +msgstr "Nouvelle ligne au dessus" + msgid "Indent" msgstr "Indentation" +msgid "Dedent" +msgstr "Désindenter" + +msgid "Backspace" +msgstr "Effacer" + +msgid "Backspace Word" +msgstr "Effacer mot" + +msgid "Backspace all to Left" +msgstr "Effacer tout à gauche" + msgid "Delete" msgstr "Supprimer" +msgid "Delete Word" +msgstr "Supprimer mot" + +msgid "Delete all to Right" +msgstr "Tout supprimer à droite" + +msgid "Scroll Up" +msgstr "Défilement vers le haut" + +msgid "Scroll Down" +msgstr "Défilement vers le bas" + msgid "Select All" msgstr "Tout sélectionner" +msgid "Select Word Under Caret" +msgstr "Sélectionner les mots sous le caret" + +msgid "Add Selection for Next Occurrence" +msgstr "Ajouter la Sélection pour la Prochaine Occurence" + +msgid "Text Submitted" +msgstr "Texte Proposé" + msgid "Duplicate Nodes" msgstr "Dupliquer le(s) nÅ“ud(s)" msgid "Delete Nodes" -msgstr "Supprimer des nÅ“uds" +msgstr "Supprimer le(s) nÅ“ud(s)" + +msgid "Go Up One Level" +msgstr "Monter d'un Niveau" msgid "Refresh" msgstr "Rafraîchir" +msgid "Swap Input Direction" +msgstr "Échanger les Directions d'Entrée" + msgid "Invalid input %d (not passed) in expression" msgstr "Entrée non valide %d (non transmise) dans l’expression" @@ -206,6 +441,12 @@ msgstr "Arguments invalides pour construire '%s'" msgid "On call to '%s':" msgstr "Lors de l’appel à '%s' :" +msgid "Built-in script" +msgstr "Script intégré" + +msgid "Built-in" +msgstr "Intégré" + msgid "B" msgstr "o" @@ -227,27 +468,59 @@ msgstr "Pio" msgid "EiB" msgstr "Eio" +msgid "Example: %s" +msgstr "Exemple : %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d élément" +msgstr[1] "%d éléments" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" msgstr "" -"Nom d'action invalide. Il ne peut être vide ni contenir « / », « : », « = », " -"« \\ » ou « \" »" +"Nom d'action invalide. Elle ne peut être vide ni contenir «/», «:», «=», " +"«\\» ou «\"»" msgid "An action with the name '%s' already exists." msgstr "Une action avec le nom « %s » existe déjà ." msgid "Add Event" -msgstr "Ajouter évènement" +msgstr "Ajouter un évènement" + +msgid "Remove Action" +msgstr "Supprimer l'action" + +msgid "Cannot Remove Action" +msgstr "Impossible de Retirer l'Action" + +msgid "Edit Event" +msgstr "Editer l'Évènement" + +msgid "Remove Event" +msgstr "Supprimer l'Évènement" + +msgid "Filter by name..." +msgstr "Filtrer par nom..." + +msgid "Clear All" +msgstr "Tout Effacer" + +msgid "Add New Action" +msgstr "Ajouter une Action" msgid "Add" msgstr "Ajouter" +msgid "Show Built-in Actions" +msgstr "Afficher les Actions Intégrées" + msgid "Action" msgstr "Action" msgid "Deadzone" -msgstr "Zone morte" +msgstr "Zone Morte" msgid "Time:" msgstr "Temps :" @@ -255,6 +528,9 @@ msgstr "Temps :" msgid "Value:" msgstr "Valeur :" +msgid "Update Selected Key Handles" +msgstr "Dupliquer la(les) clé(s) sélectionnée(s)" + msgid "Insert Key Here" msgstr "Insérer la clé ici" @@ -691,6 +967,9 @@ msgstr "Depuis le signal :" msgid "Scene does not contain any script." msgstr "La scène ne comprend pas de script." +msgid "Select Method" +msgstr "Sélectionner une méthode" + msgid "Remove" msgstr "Supprimer" @@ -751,9 +1030,6 @@ msgstr "Déconnecter" msgid "Connect a Signal to a Method" msgstr "Connecter un signal à une méthode" -msgid "Edit Connection:" -msgstr "Modifier la connexion :" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?" @@ -820,6 +1096,9 @@ msgstr "Instance :" msgid "Toggle Visibility" msgstr "Basculer la visibilité" +msgid "ms" +msgstr "ms" + msgid "Monitors" msgstr "Moniteurs" @@ -900,23 +1179,8 @@ msgstr "Avertissement :" msgid "Error:" msgstr "Erreur :" -msgid "C++ Error" -msgstr "Erreur C++" - -msgid "C++ Error:" -msgstr "Erreur C++ :" - -msgid "Source" -msgstr "Source" - -msgid "C++ Source" -msgstr "Source C++" - -msgid "Source:" -msgstr "Source :" - -msgid "C++ Source:" -msgstr "Source C++ :" +msgid "%s Error" +msgstr "Erreur %s" msgid "Stack Trace" msgstr "Pile des appels" @@ -927,6 +1191,9 @@ msgstr "Copier l'erreur" msgid "Open C++ Source on GitHub" msgstr "Ouvrir les sources C++ sur GitHub" +msgid "C++ Source" +msgstr "Source C++" + msgid "Video RAM" msgstr "Mémoire vidéo" @@ -1413,6 +1680,9 @@ msgstr "Navigation" msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + msgid "Nodes and Classes:" msgstr "NÅ“uds et classes :" @@ -1742,6 +2012,9 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "Ré-importation des assets" +msgid "Experimental" +msgstr "Expérimental" + msgid "Top" msgstr "Dessus" @@ -1908,12 +2181,12 @@ msgstr "Afficher toutes les langues" msgid "Show Selected Locales Only" msgstr "Afficher uniquement les langues sélectionnées" +msgid "Edit Filters" +msgstr "Modifier les filtres" + msgid "Language:" msgstr "Langage :" -msgid "Script" -msgstr "Script" - msgid "Variant" msgstr "Variant" @@ -2483,24 +2756,6 @@ msgid "Install from file" msgstr "Installer depuis un fichier" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Ceci configurera votre projet pour des compilations Android personnalisées " -"en installant le modèle source dans \"res://android/build\".\n" -"Vous pouvez ensuite appliquer des modifications et créer votre propre APK " -"personnalisé à l'exportation (ajout de modules, modification du fichier " -"AndroidManifest.xml, etc.).\n" -"Notez que pour faire des compilations personnalisées au lieu d'utiliser des " -"APKs préconstruits, l'option \"Use Custom Build\" doit être activée dans le " -"Preset d'exportation Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2725,9 +2980,6 @@ msgstr "Raccourcis" msgid "Binding" msgstr "Liaison" -msgid "%s Error" -msgstr "Erreur %s" - msgid "All Devices" msgstr "Tous les périphérique" @@ -3676,6 +3928,9 @@ msgstr "" msgid "Enable snap and show grid." msgstr "Activer l'aimantation et afficher la grille." +msgid "Blend:" +msgstr "Mélange :" + msgid "Point" msgstr "Point" @@ -3719,15 +3974,9 @@ msgid "Generate blend triangles automatically (instead of manually)" msgstr "" "Générer des triangles de mélange automatiquement (au lieu de manuellement)" -msgid "Blend:" -msgstr "Mélange :" - msgid "Parameter Changed:" msgstr "Paramètre modifié :" -msgid "Edit Filters" -msgstr "Modifier les filtres" - msgid "Output node can't be added to the blend tree." msgstr "Un nÅ“ud de sortie ne peut être ajouté à l'arborescence du mélange." @@ -3853,9 +4102,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Lire l'animation sélectionnée à rebours depuis la fin. (Maj+A)" -msgid "Stop animation playback. (S)" -msgstr "Arrêter la lecture de l'animation. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Lire l'animation sélectionnée depuis le début. (Maj+D)" @@ -5107,12 +5353,6 @@ msgstr "Changer le notificateur AABB" msgid "Change Particles AABB" msgstr "Changer particules AABB" -msgid "Change Box Shape Extents" -msgstr "Changer l'étendue de la forme rectangulaire" - -msgid "Change Probe Extents" -msgstr "Changer les ampleurs de la sonde" - msgid "Change Capsule Shape Radius" msgstr "Changer le rayon de la forme capsule" @@ -5935,6 +6175,9 @@ msgstr "Standard" msgid "Connections to method:" msgstr "Connexions à la méthode :" +msgid "Source" +msgstr "Source" + msgid "Target" msgstr "Cible" @@ -6182,12 +6425,6 @@ msgstr "(vide)" msgid "Animations:" msgstr "Animations :" -msgid "Speed:" -msgstr "Vitesse :" - -msgid "Loop" -msgstr "Boucle" - msgid "Animation Frames:" msgstr "Trames d'animation :" @@ -7639,9 +7876,6 @@ msgstr "Ajouter une action d'entrée" msgid "Change Action deadzone" msgstr "Modifier la zone morte de l'action" -msgid "Add Input Action Event" -msgstr "Ajouter un événement d'action d'entrée" - msgid "Erase Input Action" msgstr "Effacer l'action d'entrée" @@ -7669,9 +7903,6 @@ msgstr "Sélectionnez une propriété" msgid "Select Virtual Method" msgstr "Sélectionner une méthode virtuelle" -msgid "Select Method" -msgstr "Sélectionner une méthode" - msgid "Batch Rename" msgstr "Renommer par lot" @@ -7936,6 +8167,9 @@ msgstr "Enfants modifiables" msgid "Load As Placeholder" msgstr "Charger en tant qu'instance temporaire" +msgid "Auto Expand to Selected" +msgstr "Étirement auto à la sélection" + msgid "Filters" msgstr "Filtres" @@ -8480,24 +8714,10 @@ msgstr "Clé publique invalide pour l'expansion APK." msgid "Invalid package name:" msgstr "Nom de paquet invalide :" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "« Use Custom Build » doit être activé pour utiliser les plugins." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "" "« Passthrough » est valide uniquement lorsque le « Mode XR » est « OpenXR »." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"« Export AAB » est valide uniquement lorsque l'option « Use Custom Build » " -"est activée." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"Changer « Min SDK » est valide uniquement lorsque l'option « Use Custom " -"Build » est activée." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Min SDK\" devrait être un nombre entier valide, mais \"%s\" n'est pas " @@ -8511,12 +8731,6 @@ msgstr "" "de Godot." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"Changer « Target SDK » est valide uniquement lorsque l'option « Use Custom " -"Build » est activée." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "« SDK Cible » devrait être un nombre entier valide, mais « %s » n'en est pas " @@ -8588,14 +8802,6 @@ msgid "Unsupported export format!" msgstr "Format d'export non supporté !" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"A essayé de construire à partir d'un modèle personnalisé, mais aucune " -"information de version n'existe pour lui. Veuillez réinstaller à partir du " -"menu 'Projet'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/gl.po b/editor/translations/editor/gl.po index e6983b7ca9..1617bb9759 100644 --- a/editor/translations/editor/gl.po +++ b/editor/translations/editor/gl.po @@ -559,9 +559,6 @@ msgstr "Desconectar" msgid "Connect a Signal to a Method" msgstr "Conectar unha Sinal a un Método" -msgid "Edit Connection:" -msgstr "Editar Conexión:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Está seguro de que quere eliminar tódalas conexións da sinal '%s'?" @@ -670,24 +667,9 @@ msgstr "Aviso:" msgid "Error:" msgstr "Erro:" -msgid "C++ Error" -msgstr "Erro de C++" - -msgid "C++ Error:" -msgstr "Erro de C++:" - -msgid "Source" -msgstr "Fonte" - msgid "C++ Source" msgstr "Fonte C++" -msgid "Source:" -msgstr "Fonte:" - -msgid "C++ Source:" -msgstr "Fonte C++:" - msgid "Continue" msgstr "Continuar" @@ -1395,12 +1377,12 @@ msgstr "Amosar Tódolos Linguaxes" msgid "Show Selected Locales Only" msgstr "Amosar só os Linguaxes Seleccionados" +msgid "Edit Filters" +msgstr "Editar Flitros" + msgid "Language:" msgstr "Linguaxe:" -msgid "Script" -msgstr "Script" - msgid "Clear Output" msgstr "Limpar SaÃda" @@ -2440,6 +2422,9 @@ msgstr "" msgid "Enable snap and show grid." msgstr "Activar axuste de cuadrÃcula e amosar cuadrÃcula." +msgid "Blend:" +msgstr "Mezcla:" + msgid "Point" msgstr "Punto" @@ -2449,12 +2434,6 @@ msgstr "Abrir Editor" msgid "Add Triangle" msgstr "Engadir Triángulo" -msgid "Blend:" -msgstr "Mezcla:" - -msgid "Edit Filters" -msgstr "Editar Flitros" - msgid "Node Moved" msgstr "Nodo Movido" @@ -3436,6 +3415,9 @@ msgstr "Resultados de Búsqueda" msgid "Standard" msgstr "Estándar" +msgid "Source" +msgstr "Fonte" + msgid "Target" msgstr "Obxectivo" @@ -3574,12 +3556,6 @@ msgstr "(baleiro)" msgid "Animations:" msgstr "Animacións:" -msgid "Speed:" -msgstr "Velocidade:" - -msgid "Loop" -msgstr "Bucle" - msgid "Zoom Reset" msgstr "Restablecer Zoom" @@ -3918,9 +3894,6 @@ msgstr "Eliminar Elemento" msgid "Add Input Action" msgstr "Engadir Acción de Entrada" -msgid "Add Input Action Event" -msgstr "Engadir Evento de Entrada" - msgid "Erase Input Action" msgstr "Eliminar Acción de Entrada" @@ -4137,11 +4110,6 @@ msgstr "" "O Keystore Release non está configurado correctamente nos axustes de " "exportación." -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"\"Use Custom Build\" debe estar activado para usar estas caracterÃsticas " -"adicionais (plugins)." - msgid "Building Android Project (gradle)" msgstr "Construir Proxecto Android (gradle)" diff --git a/editor/translations/editor/he.po b/editor/translations/editor/he.po index 35c9a664f8..69c13a071d 100644 --- a/editor/translations/editor/he.po +++ b/editor/translations/editor/he.po @@ -19,7 +19,7 @@ # Guy Dadon <guydadon14@gmail.com>, 2020. # bruvzg <bruvzg13@gmail.com>, 2020. # Omer I.S. <omeritzicschwartz@gmail.com>, 2021. -# Ram Tourgeman <ramtorgeman@gmail.com>, 2021. +# Ram Tourgeman <ramtorgeman@gmail.com>, 2021, 2023. # Shailee Eliyahu <dev.sle.il@gmail.com>, 2021. # Mati Borlak <matiborlak@gmail.com>, 2022. # Tamir Livneh <fkeyzuwu@gmail.com>, 2022. @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-01 05:48+0000\n" -"Last-Translator: Yoni m <yoni.meirov08@gmail.com>\n" +"PO-Revision-Date: 2023-02-08 07:34+0000\n" +"Last-Translator: Ram Tourgeman <ramtorgeman@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -42,11 +42,20 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "ביטול הגדרה" msgid "Physical" msgstr "פיזי" +msgid "Left Mouse Button" +msgstr "לחצן עכבר שמ×לי" + +msgid "Right Mouse Button" +msgstr "כפתור עכבר ×™×ž× ×™" + msgid "Button" msgstr "כפתור" @@ -587,9 +596,6 @@ msgstr "× ×™×ª×•×§" msgid "Connect a Signal to a Method" msgstr "חבר ×ות לשיטה (מתודה)" -msgid "Edit Connection:" -msgstr "עריכת חיבור:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "×”×× ×תה בטוח ש×תה רוצה להסיר ×ת כל ×”×—×™×‘×•×¨×™× ×ž×”×ות \"%s\"?" @@ -704,27 +710,15 @@ msgstr "×זהרה:" msgid "Error:" msgstr "שגי××”:" -msgid "C++ Error" -msgstr "שגי×ת C++" - -msgid "C++ Error:" -msgstr "שגי×ת C++ :" - -msgid "C++ Source" -msgstr "מקור C++" - -msgid "Source:" -msgstr "מקור:" - -msgid "C++ Source:" -msgstr "מקור C++ :" - msgid "Stack Trace" msgstr "×ž×—×¡× ×™×ª מעקב" msgid "Copy Error" msgstr "שגי×ת העתקה" +msgid "C++ Source" +msgstr "מקור C++" + msgid "Video RAM" msgstr "זיכרון ויד×ו" @@ -1617,8 +1611,8 @@ msgstr "הוצמד %s" msgid "Unpinned %s" msgstr "בוטלה ההצמדה של %s" -msgid "Script" -msgstr "סקריפט" +msgid "Edit Filters" +msgstr "עריכת ×ž×¡× × ×™×" msgid "Clear Output" msgstr "× ×™×§×•×™ פלט" @@ -2069,22 +2063,6 @@ msgstr "חסרה ×ª×‘× ×™×ª ×‘× ×™×™×” ל×× ×“×¨×•×יד, × × ×œ×”×ª×§×™×Ÿ ×ª× msgid "Manage Templates" msgstr "× ×™×”×•×œ ×ª×‘× ×™×•×ª" -msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"פעולה זו תגדיר ×ת ×”×ž×™×–× ×©×œ×š ×œ×‘× ×™×™×ª ×× ×“×¨×•×יד מות×מת ×ישית על ידי ×”×ª×§× ×ª ×ª×‘× ×™×ª " -"המקור ל- \"res://android/build\".\n" -"ל×חר מכן ×פשר להחיל ×©×™× ×•×™×™× ×•×œ×‘× ×•×ª APK מות×× ×ישית ×‘×™×™×¦×•× (הוספת מודולי×, " -"×©×™× ×•×™ AndroidManifest.xml, וכו').\n" -"כדי לערוך ×‘× ×™×™×” מות×מת ×ישית ×‘×ž×§×•× ×©×™×ž×•×© ×‘×ª×‘× ×™×ª קיימת, יש ל×פשר ×ת \"השתמש " -"×‘×‘× ×™×” מות×מת ×ישית\" בהגדרות ×”×™×™×¦×•× ×œ×× ×“×¨×•×יד." - msgid "Import Templates From ZIP File" msgstr "×™×™×‘×•× ×ª×‘× ×™×•×ª מקובץ ZIP" @@ -2449,9 +2427,6 @@ msgstr "×œ× × ×™×ª×Ÿ להשתמש בסוג מפרק ×–×”. רק מפרקי ×©×•× msgid "Triangle already exists." msgstr "המשולש כבר קיי×." -msgid "Edit Filters" -msgstr "עריכת ×ž×¡× × ×™×" - msgid "Set Animation" msgstr "קביעת ×”× ×¤×©×”" @@ -2530,9 +2505,6 @@ msgstr "× ×™×’×•×Ÿ ל×חור של ×”×”× ×¤×©×” ×©× ×‘×—×¨×” ×ž×”×ž×™×§×•× ×”× msgid "Play selected animation backwards from end. (Shift+A)" msgstr "× ×™×’×•×Ÿ ל×חור של ×”×”× ×¤×©×” ×©× ×‘×—×¨×” מהסוף. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "עצירת × ×™×’×•×Ÿ ×”×”× ×¤×©×”. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "× ×™×’×•×Ÿ ×”×”× ×¤×©×” ×©× ×‘×—×¨×” מההתחלה. (Shift+D)" @@ -2881,12 +2853,6 @@ msgstr "×©×™× ×•×™ מודיע AABB" msgid "Change Particles AABB" msgstr "×©×™× ×•×™ ×—×œ×§×™×§×™× AABB" -msgid "Change Box Shape Extents" -msgstr "×©×™× ×•×™ הרחבות של צורת תיבה" - -msgid "Change Probe Extents" -msgstr "×©×™× ×•×™ הרחבות בדיקה" - msgid "Change Capsule Shape Radius" msgstr "×©×™× ×•×™ רדיוס לצורת קפסולה" @@ -3221,9 +3187,6 @@ msgstr "הסרת כל × ×§×•×“×•×ª העצירה" msgid "Delete Animation?" msgstr "מחיקת ×× ×™×ž×¦×™×”?" -msgid "Loop" -msgstr "לול××”" - msgid "Zoom Reset" msgstr "×יפוס התקריב" @@ -3825,16 +3788,6 @@ msgstr "מפתח ציבורי ×œ× ×—×•×§×™ להרחבת APK." msgid "Invalid package name:" msgstr "×©× ×—×‘×™×œ×” ×œ× ×—×•×§×™:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "חובה ל×פשר ״שימוש ×‘×‘× ×™×” מות×מת ×ישית״ כדי להשתמש בתוספי×." - -msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"×ž× ×¡×” ×œ×‘× ×•×ª ×ž×ª×‘× ×™×ª מות×מת ×ישית, ×ך ×œ× ×§×™×™× ×ž×™×“×¢ על גירסת ×”×‘× ×™×”. × × ×œ×”×ª×§×™×Ÿ " -"מחדש מתפריט 'Project'." - msgid "Building Android Project (gradle)" msgstr "×‘× ×™×™×ª ×ž×™×–× ×× ×“×¨×•×יד (gradle)" diff --git a/editor/translations/editor/hu.po b/editor/translations/editor/hu.po index d0fb2d0226..9736973adc 100644 --- a/editor/translations/editor/hu.po +++ b/editor/translations/editor/hu.po @@ -509,6 +509,9 @@ msgstr "JelzésbÅ‘l:" msgid "Scene does not contain any script." msgstr "A jelenet nem tartalmaz szkriptet." +msgid "Select Method" +msgstr "Metódus kiválasztása" + msgid "Remove" msgstr "EltávolÃtás" @@ -565,9 +568,6 @@ msgstr "Leválasztás" msgid "Connect a Signal to a Method" msgstr "Jelzés csatlakoztatása metódushoz" -msgid "Edit Connection:" -msgstr "Kapcsolat szerkesztése:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Biztosan eltávolÃtja az összes kapcsolatot a(z) \"%s\" jelzésrÅ‘l?" @@ -664,27 +664,12 @@ msgstr "HÃvások" msgid "Error:" msgstr "Hiba:" -msgid "C++ Error" -msgstr "C++ hiba" - -msgid "C++ Error:" -msgstr "C++ hiba:" - -msgid "Source" -msgstr "Forrás" +msgid "Copy Error" +msgstr "Hiba Másolása" msgid "C++ Source" msgstr "C++ forrás" -msgid "Source:" -msgstr "Forrás:" - -msgid "C++ Source:" -msgstr "C++ forrás:" - -msgid "Copy Error" -msgstr "Hiba Másolása" - msgid "Skip Breakpoints" msgstr "Töréspontok kihagyása" @@ -1474,12 +1459,12 @@ msgstr "Tömb átméretezése" msgid "Set Multiple:" msgstr "Többszörös beállÃtása:" +msgid "Edit Filters" +msgstr "SzűrÅ‘k Szerkesztése" + msgid "Language:" msgstr "Nyelv:" -msgid "Script" -msgstr "Szkript" - msgid "Clear Output" msgstr "Kimenet törlése" @@ -2536,6 +2521,9 @@ msgstr "Betöltés..." msgid "Enable snap and show grid." msgstr "Illesztés engedélyezése és rács megjelenÃtése." +msgid "Blend:" +msgstr "Keverés:" + msgid "Point" msgstr "Pont" @@ -2557,12 +2545,6 @@ msgstr "Automatikus háromszögek be- és kikapcsolása" msgid "Erase points and triangles." msgstr "Pontok és háromszögek törlése." -msgid "Blend:" -msgstr "Keverés:" - -msgid "Edit Filters" -msgstr "SzűrÅ‘k Szerkesztése" - msgid "Set Animation" msgstr "Animáció beállÃtása" @@ -2642,9 +2624,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "A kiválasztott animáció lejátszása visszafelé a végétÅ‘l. (Shift + A)" -msgid "Stop animation playback. (S)" -msgstr "Animáció lejátszásának leállÃtása. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "A kiválasztott animáció lejátszása az elejétÅ‘l. (Shift + D)" @@ -3862,6 +3841,9 @@ msgstr "Alapértelmezett" msgid "Connections to method:" msgstr "Kapcsolatok a metódushoz:" +msgid "Source" +msgstr "Forrás" + msgid "Go to Function" msgstr "Ugrás függvényre" @@ -3973,9 +3955,6 @@ msgstr "Animáció Törlése?" msgid "Animations:" msgstr "Animációk:" -msgid "Loop" -msgstr "Ciklus" - msgid "Animation Frames:" msgstr "Animációs Képkockák:" @@ -4159,9 +4138,6 @@ msgstr "BÅ‘vÃtmények" msgid "Select Virtual Method" msgstr "Virtuális metódus kiválasztása" -msgid "Select Method" -msgstr "Metódus kiválasztása" - msgid "Batch Rename" msgstr "Csoportos átnevezés" diff --git a/editor/translations/editor/id.po b/editor/translations/editor/id.po index 9bc669b7d2..bfed9e654b 100644 --- a/editor/translations/editor/id.po +++ b/editor/translations/editor/id.po @@ -24,7 +24,7 @@ # Modeus Darksono <garuga17@gmail.com>, 2019. # Akhmad Zulfikar <azuldegratz@gmail.com>, 2020. # Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020. -# zephyroths <ridho.hikaru@gmail.com>, 2020, 2021, 2022. +# zephyroths <ridho.hikaru@gmail.com>, 2020, 2021, 2022, 2023. # Richard Urban <redasuio1@gmail.com>, 2020. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2020, 2022. # Habib Rohman <revolusi147id@gmail.com>, 2020. @@ -42,13 +42,14 @@ # FellowMustard <rachmawanng33@gmail.com>, 2022. # Muhammad Zainal Abidin <eviepk12@gmail.com>, 2022. # adfriz <aditiyaafrizal2@gmail.com>, 2023. +# Taufiq Rahman <pxpiksy@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-04 10:47+0000\n" -"Last-Translator: adfriz <aditiyaafrizal2@gmail.com>\n" +"PO-Revision-Date: 2023-02-09 09:37+0000\n" +"Last-Translator: zephyroths <ridho.hikaru@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -56,14 +57,68 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Batal disetel" msgid "Physical" msgstr "(Secara fisik)" +msgid "Left Mouse Button" +msgstr "Tombol kiri Mouse" + +msgid "Right Mouse Button" +msgstr "Tombol kanan Mouse" + msgid "Button" msgstr "Tombol" +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Stick Kiri Sumbu X, Joystick 0 Sumbu X" + +msgid "Joystick 3 X-Axis" +msgstr "Joystick 3 Sumbu X" + +msgid "Joystick 3 Y-Axis" +msgstr "Joystick 3 Sumbu Y" + +msgid "Joystick 4 X-Axis" +msgstr "Joystick 4 Sumbu X" + +msgid "Joystick 4 Y-Axis" +msgstr "Joystick 4 Sumbu Y" + +msgid "Unknown Joypad Axis" +msgstr "Sumbu Joypad Tidak Dikenal" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Gerakan Joypad pada Sumbu %d (%s) dengan Nilai %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Aksi Bawah, Sony Cross, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Tindakan Benar, Sony Circle, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Aksi Kiri, Sony Square, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Aksi Teratas, Segitiga Sony, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Kembali, Sony Select, Xbox Kembali, Nintendo -" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "Panduan, Sony PS, Xbox Home" + +msgid "Start, Nintendo +" +msgstr "Mulai, Nintendo +" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "Bahu Kanan, Sony R1, Xbox RB" + msgid "Select" msgstr "Pilih" @@ -577,6 +632,9 @@ msgstr "Dari Sinyal:" msgid "Scene does not contain any script." msgstr "Skena tidak berisi skrip apapun." +msgid "Select Method" +msgstr "Pilih Method/Fungsi" + msgid "Remove" msgstr "Hapus" @@ -633,9 +691,6 @@ msgstr "Putuskan" msgid "Connect a Signal to a Method" msgstr "Hubungkan Sinyal ke Method" -msgid "Edit Connection:" -msgstr "Sunting Koneksi:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal '%s'?" @@ -777,23 +832,8 @@ msgstr "Peringatan:" msgid "Error:" msgstr "Error:" -msgid "C++ Error" -msgstr "Error C++" - -msgid "C++ Error:" -msgstr "Error C++ :" - -msgid "Source" -msgstr "Sumber" - -msgid "C++ Source" -msgstr "Kode Sumber C++" - -msgid "Source:" -msgstr "Sumber:" - -msgid "C++ Source:" -msgstr "Sumber C++ :" +msgid "%s Error" +msgstr "%s Error" msgid "Stack Trace" msgstr "Jejak Tumpukan" @@ -804,6 +844,9 @@ msgstr "Salin Error" msgid "Open C++ Source on GitHub" msgstr "Buka Sumber C++ di GitHub" +msgid "C++ Source" +msgstr "Kode Sumber C++" + msgid "Video RAM" msgstr "RAM Video" @@ -1608,6 +1651,9 @@ msgstr "Properti" msgid "default:" msgstr "baku:" +msgid "Operators" +msgstr "Operato." + msgid "Theme Properties" msgstr "Properti Tema" @@ -1630,9 +1676,15 @@ msgstr "" "Untuk saat ini tidak ada deskripsi properti ini. Tolong bantu kita " "dengan[color=$color][url=$url]kontribusi[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "Deskripsi Konstruktor" + msgid "Method Descriptions" msgstr "Deskripsi Method" +msgid "Operator Descriptions" +msgstr "Deskripsi Operator" + msgid "%d match." msgstr "Ditemukan %d kecocokan." @@ -1735,12 +1787,12 @@ msgstr "Tampilkan Semua Pelokalan" msgid "Show Selected Locales Only" msgstr "Tampilkan Hanya Pelokalan yang Dipilih" +msgid "Edit Filters" +msgstr "Sunting Filter" + msgid "Language:" msgstr "Bahasa:" -msgid "Script" -msgstr "Skrip" - msgid "Variant" msgstr "Varian" @@ -2160,6 +2212,9 @@ msgstr "Proyek" msgid "Project Settings..." msgstr "Pengaturan Proyek…" +msgid "Project Settings" +msgstr "Pengaturan Proyek" + msgid "Version Control" msgstr "Kontrol Versi" @@ -2278,24 +2333,6 @@ msgid "Install from file" msgstr "Install dari file" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Ini akan mengatur proyek Anda untuk build Android khusus dengan memasang " -"templat sumber ke \"res://android/build\".\n" -"Anda kemudian dapat menerapkan modifikasi dan membangun APK khusus Anda " -"sendiri pada saat ekspor (menambahkan modul, mengubah AndroidManifest.xml, " -"dll.).\n" -"Perhatikan bahwa untuk membuat build khusus alih-alih menggunakan APK yang " -"sudah dibuat sebelumnya, opsi \"Use Custom Build\" harus diaktifkan di " -"preset ekspor Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2514,9 +2551,6 @@ msgstr "Tombol Pintasan" msgid "Binding" msgstr "Mengikat" -msgid "%s Error" -msgstr "%s Error" - msgid "All Devices" msgstr "Semua Perangkat" @@ -3344,6 +3378,9 @@ msgstr "Pilih dan gerakkan titik-titik, buat titik dengan RMB." msgid "Enable snap and show grid." msgstr "Izinkan snap dan tampilkan garis-garis kotak." +msgid "Blend:" +msgstr "Campur:" + msgid "Point" msgstr "Titik" @@ -3386,15 +3423,9 @@ msgstr "Hapus titik-titik dan segi tiga." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Buat segi tiga pembauran secara otomatis (sebagai ganti cara manual)" -msgid "Blend:" -msgstr "Campur:" - msgid "Parameter Changed:" msgstr "Parameter Berubah:" -msgid "Edit Filters" -msgstr "Sunting Filter" - msgid "Output node can't be added to the blend tree." msgstr "Node keluaran tidak bisa ditambahkan ke pohon campur." @@ -3513,9 +3544,6 @@ msgstr "Mainkan mundur animasi terpilih dari lokasi sekarang. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Mainkan mundur animasi terpilih dari akhir. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Hentikan playback animasi. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Mainkan animasi terpilih dari awal. (Shift+D)" @@ -4664,12 +4692,6 @@ msgstr "Ubah AABB Notifier" msgid "Change Particles AABB" msgstr "Ubah Partikel AABB" -msgid "Change Box Shape Extents" -msgstr "Ubah Batas Box Shape" - -msgid "Change Probe Extents" -msgstr "Ubah Batas Probe" - msgid "Change Capsule Shape Radius" msgstr "Ubah Radius Shape Kapsul" @@ -5470,6 +5492,9 @@ msgstr "Standar" msgid "Connections to method:" msgstr "Hubungan dengan fungsi:" +msgid "Source" +msgstr "Sumber" + msgid "Target" msgstr "Sasaran" @@ -5701,12 +5726,6 @@ msgstr "(kosong)" msgid "Animations:" msgstr "Animasi:" -msgid "Speed:" -msgstr "Kecepatan:" - -msgid "Loop" -msgstr "Pengulangan" - msgid "Animation Frames:" msgstr "Frame Animasi:" @@ -6833,6 +6852,28 @@ msgstr "Hapus semua" msgid "Also delete project contents (no undo!)" msgstr "Hapus juga konten proyek (tidak dapat dibatalkan!)" +msgid "" +"This option will perform full project conversion, updating scenes, resources " +"and scripts from Godot 3.x to work in Godot 4.0.\n" +"\n" +"Note that this is a best-effort conversion, i.e. it makes upgrading the " +"project easier, but it will not open out-of-the-box and will still require " +"manual adjustments.\n" +"\n" +"IMPORTANT: Make sure to backup your project before converting, as this " +"operation makes it impossible to open it in older versions of Godot." +msgstr "" +"Opsi ini akan melakukan konversi proyek menyeluruh, pembaharuan scene, " +"resource, dan script dari Godot 3.x agar dapat bekerja di Godot 4.0.\n" +"\n" +"Catat bahwa ini adalah usaha terbaik untuk mengonversi, seperti mempermudah " +"upgrade proyek, tapi tidak berarti out-of-the-box dan masih memerlukan " +"pengaturan manual.\n" +"\n" +"PENTING: Pastikan untuk membackup proyek anda sebelum konversi, karena " +"tindakan ini akan membuat proyek tidak dapat dibuka pada versi Godot yang " +"lebih lama." + msgid "Can't run project" msgstr "Tidak dapat menjalankan proyek" @@ -6843,18 +6884,21 @@ msgstr "" "Saat ini Anda tidak memiliki proyek apa pun.\n" "Apakah Anda ingin menjelajahi contoh proyek resmi di Perpustakaan Aset?" +msgid "Add Project Setting" +msgstr "Tambahkan Setelan Proyek" + msgid "Delete Item" msgstr "Hapus Item" +msgid "(All)" +msgstr "(Semua)" + msgid "Add Input Action" msgstr "Tampah Aksi Input" msgid "Change Action deadzone" msgstr "Ubah deadzone Aksi" -msgid "Add Input Action Event" -msgstr "Tambah Input Action Event" - msgid "Erase Input Action" msgstr "Hapus Aksi Input" @@ -6882,9 +6926,6 @@ msgstr "Pilih Properti" msgid "Select Virtual Method" msgstr "Pilih Method/Fungsi Virtual" -msgid "Select Method" -msgstr "Pilih Method/Fungsi" - msgid "Batch Rename" msgstr "Ubah Nama Massal" @@ -7625,13 +7666,6 @@ msgstr "Kunci Publik untuk ekspansi APK tidak valid." msgid "Invalid package name:" msgstr "Nama paket tidak valid:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Gunakan Build Custom\" harus diaktifkan untuk menggunakan plugin." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Expor AAB\" hanya bisa valid ketika \"Gunakan Build Custom\" diaktifkan." - msgid "Signing release %s..." msgstr "Menandatangani rilis %s..." @@ -7654,13 +7688,6 @@ msgid "Unsupported export format!" msgstr "Format ekspor tidak didukung!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Mencoba untuk membangun dari templat build khusus, tapi tidak ada informasi " -"versinya. Silakan pasang ulang dari menu 'Proyek'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/it.po b/editor/translations/editor/it.po index bae2ce1159..87c578b8d1 100644 --- a/editor/translations/editor/it.po +++ b/editor/translations/editor/it.po @@ -37,9 +37,9 @@ # Stefano Merazzi <asso99@hotmail.com>, 2019. # Sinapse X <sinapsex13@gmail.com>, 2019. # Micila Micillotto <micillotto@gmail.com>, 2019, 2020, 2021, 2022. -# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022. +# Mirko Soppelsa <miknsop@gmail.com>, 2019, 2020, 2021, 2022, 2023. # No <kingofwizards.kw7@gmail.com>, 2019. -# StarFang208 <polaritymanx@yahoo.it>, 2019. +# StarFang208 <polaritymanx@yahoo.it>, 2019, 2023. # Katia Piazza <gydey@ridiculousglitch.com>, 2019, 2021. # nickfla1 <lanterniniflavio@gmail.com>, 2019. # Fabio Iotti <fabiogiopla@gmail.com>, 2020. @@ -77,13 +77,16 @@ # Silvia Scaglione <sissisoad@gmail.com>, 2022. # Cosimo Davide Viggiano <cosimod089@gmail.com>, 2022. # Francesco Cammarata <francescocammarata.fr@gmail.com>, 2022. +# enzo cocca <enzo.ccc@gmail.com>, 2023. +# Andrea Migliaccio <andrea.migliaccio@gmail.com>, 2023. +# gianmarco malandra <giamminho12@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-15 13:34+0000\n" -"Last-Translator: Damiano Guida <damiano.guida22@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:54+0000\n" +"Last-Translator: gianmarco malandra <giamminho12@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -91,14 +94,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Non Impostato" msgid "Physical" msgstr "Fisico" +msgid "Left Mouse Button" +msgstr "Tasto sinistro Mouse" + +msgid "Right Mouse Button" +msgstr "Tasto Destro Mouse" + +msgid "Middle Mouse Button" +msgstr "Tasto centrale Mouse" + +msgid "Mouse Wheel Up" +msgstr "Rotellina Mouse Su." + +msgid "Mouse Wheel Down" +msgstr "Rotellina Mouse Giù." + +msgid "Mouse Wheel Left" +msgstr "Pulsante Rotellina a Sinistra" + +msgid "Mouse Wheel Right" +msgstr "Pulsante Rotellina a Destra" + +msgid "Mouse Thumb Button 1" +msgstr "Pulsante Laterale del Mouse 1" + +msgid "Mouse Thumb Button 2" +msgstr "Pulsante Laterale del Mouse 2" + msgid "Button" msgstr "Pulsante" +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Movimento del mouse in posizione (%s) con velocità (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Levetta sinistra asse X, joystick 0 asse X" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Levetta sinistra asse Y, joystick 0 asse y" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Levetta destra asse X, joystick 1 asse x" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Levetta destra Asse-Y, Joystick 1 Asse-Y" + msgid "Select" msgstr "Seleziona" @@ -648,6 +696,9 @@ msgstr "Dal segnale:" msgid "Scene does not contain any script." msgstr "La scena non contiene alcuno script." +msgid "Select Method" +msgstr "Seleziona Metodo" + msgid "Remove" msgstr "Rimuovi" @@ -705,9 +756,6 @@ msgstr "Disconnetti" msgid "Connect a Signal to a Method" msgstr "Connetti un segnale a un metodo" -msgid "Edit Connection:" -msgstr "Modifica una connessione:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Sei sicuro di voler rimuovere tutte le connessioni dal segnale \"%s\"?" @@ -852,23 +900,8 @@ msgstr "Attenzione:" msgid "Error:" msgstr "Errore:" -msgid "C++ Error" -msgstr "Errore C++" - -msgid "C++ Error:" -msgstr "Errore C++:" - -msgid "Source" -msgstr "Sorgente" - -msgid "C++ Source" -msgstr "Sorgente C++" - -msgid "Source:" -msgstr "Sorgente:" - -msgid "C++ Source:" -msgstr "Sorgente C++:" +msgid "%s Error" +msgstr "Errore %s" msgid "Stack Trace" msgstr "Analisi dello stack" @@ -879,6 +912,9 @@ msgstr "Copia Errore" msgid "Open C++ Source on GitHub" msgstr "Apri Sorgente C++ su Github" +msgid "C++ Source" +msgstr "Sorgente C++" + msgid "Video RAM" msgstr "RAM Video" @@ -1705,6 +1741,12 @@ msgstr "sovrascrive %s:" msgid "default:" msgstr "predefinito:" +msgid "Constructors" +msgstr "Costruttori" + +msgid "Operators" +msgstr "Operatori" + msgid "Theme Properties" msgstr "Proprietà del tema" @@ -1739,9 +1781,15 @@ msgstr "" "Al momento non esiste alcuna descrizione per questa proprietà . Aiutaci " "[color=$color][url=$url]aggiungendone una[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "Descrizione del costruttore" + msgid "Method Descriptions" msgstr "Descrizioni del metodo" +msgid "Operator Descriptions" +msgstr "Descrizione degli operatori" + msgid "%d match." msgstr "%d corrispondenze." @@ -1844,12 +1892,12 @@ msgstr "Mostra tutte le lingue" msgid "Show Selected Locales Only" msgstr "Mostra solo le lingue selezionate" +msgid "Edit Filters" +msgstr "Modifica Filtri" + msgid "Language:" msgstr "Lingua:" -msgid "Script" -msgstr "Script" - msgid "Variant" msgstr "Variante" @@ -2413,24 +2461,6 @@ msgid "Install from file" msgstr "Installa da un file" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Questo predisporrà il progetto alle costruzioni personalizzate per Android " -"installando il modello di sorgente in \"res://android/build\".\n" -"Sarà allora possibile applicare delle modifiche e costruire un APK " -"personalizzato durante l'esportazione (aggiungere moduli, cambiare " -"l'AndroidManifest.xml, eccetera).\n" -"Va notato che per creare delle costruzioni personalizzate, invece di usare " -"gli APK pre-costruiti, va attivata l'opzione \"Use Custom Build\" nella " -"preimpostazione d'esportazione per Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2657,9 +2687,6 @@ msgstr "Scorciatoie" msgid "Binding" msgstr "Associazione" -msgid "%s Error" -msgstr "Errore %s" - msgid "All Devices" msgstr "Tutti i Dispositivi" @@ -3600,6 +3627,9 @@ msgstr "" msgid "Enable snap and show grid." msgstr "Abilita lo scatto e mostra la griglia." +msgid "Blend:" +msgstr "Blend:" + msgid "Point" msgstr "Punto" @@ -3642,15 +3672,9 @@ msgstr "Cancella punti e triangoli." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Genera i triangoli di fusione automaticamente (anziché manualmente)" -msgid "Blend:" -msgstr "Blend:" - msgid "Parameter Changed:" msgstr "Parametro modificato:" -msgid "Edit Filters" -msgstr "Modifica Filtri" - msgid "Output node can't be added to the blend tree." msgstr "Il nodo in output non può essere aggiunto al BlendTree." @@ -3776,9 +3800,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Esegui la seguente animazione al contrario dalla fine. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Ferma il playback dell'animazione. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Esegui la seguente l'animazione dall'inizio. (Shift+D)" @@ -5011,12 +5032,6 @@ msgstr "Cambia notificatore AABB" msgid "Change Particles AABB" msgstr "Cambia AABB Particelle" -msgid "Change Box Shape Extents" -msgstr "Cambia Ampiezza Box Shape" - -msgid "Change Probe Extents" -msgstr "Cambia Estensione Probe" - msgid "Change Capsule Shape Radius" msgstr "Cambia Raggio Capsule Shape" @@ -5828,6 +5843,9 @@ msgstr "Standard" msgid "Connections to method:" msgstr "Connessioni al metodo:" +msgid "Source" +msgstr "Sorgente" + msgid "Target" msgstr "Target" @@ -6075,12 +6093,6 @@ msgstr "(vuoto)" msgid "Animations:" msgstr "Animazioni:" -msgid "Speed:" -msgstr "Velocità :" - -msgid "Loop" -msgstr "Loop" - msgid "Animation Frames:" msgstr "Frame Animazione:" @@ -6795,6 +6807,9 @@ msgstr "Luce" msgid "Process" msgstr "Processa" +msgid "Sky" +msgstr "Cielo" + msgid "Fog" msgstr "Nebbia" @@ -7503,9 +7518,6 @@ msgstr "Aggiungi Azione di Input" msgid "Change Action deadzone" msgstr "Cambia la zona morta d'azione" -msgid "Add Input Action Event" -msgstr "Aggiungi Evento di Azione Input" - msgid "Erase Input Action" msgstr "Cancella Azione di Input" @@ -7533,9 +7545,6 @@ msgstr "Seleziona Proprietà " msgid "Select Virtual Method" msgstr "Seleziona Metodo Virtuale" -msgid "Select Method" -msgstr "Seleziona Metodo" - msgid "Batch Rename" msgstr "Rinomina in blocco" @@ -8324,24 +8333,11 @@ msgstr "Chiave pubblica non valida per l'espansione dell'APK." msgid "Invalid package name:" msgstr "Nome del pacchetto non valido:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "Per utilizzare i plugin \"Use Custom Build\" deve essere abilitato." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "" "\"Oltrepassaggio\" è valido solo quando \"Modalità XR\" è impostato su " "\"OpenXR\"." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Export AAB\" è valido soltanto quanto \"Use Custom Build\" è abilitato." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Min SDK\" può essere sovrascritto solo se \"Utilizza Build " -"Personalizzata\" è abilitato." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Min SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che è " @@ -8355,12 +8351,6 @@ msgstr "" "dalla libreria Godot." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Target SDK\" può essere sovrascritto solo se \"Utilizza Build " -"Personalizzata\" è abilitato." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Target SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che " @@ -8426,14 +8416,6 @@ msgid "Unsupported export format!" msgstr "Formato d'esportazione non supportato!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Tentato di costruire da un template build personalizzato, ma nessuna " -"informazione sulla sua versione esiste. Per favore, reinstallalo dal menu " -"\"Progetto\"." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/ja.po b/editor/translations/editor/ja.po index b580b05f44..f24c55d10f 100644 --- a/editor/translations/editor/ja.po +++ b/editor/translations/editor/ja.po @@ -4,7 +4,7 @@ # This file is distributed under the same license as the Godot source code. # akirakido <achts.y@gmail.com>, 2016-2017, 2018, 2019. # D_first <dntk.daisei@gmail.com>, 2017, 2018. -# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018. +# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018, 2023. # h416 <shinichiro.hirama@gmail.com>, 2017. # hopping tappy (ãŸã£ã´ã•ã‚“) <hopping.tappy@gmail.com>, 2016-2017, 2018. # Jun Shiozawa <haresecret@gmail.com>, 2017, 2018, 2020. @@ -47,13 +47,15 @@ # Narazaki Shuji <shujinarazaki@protonmail.com>, 2022. # ta ko <neji.cion@gmail.com>, 2022. # T K <kidaaam@gmail.com>, 2022, 2023. +# MizunagiKB <mizukb@live.jp>, 2023. +# Saitos <purifyzombie@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: T K <kidaaam@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:54+0000\n" +"Last-Translator: Saitos <purifyzombie@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -61,20 +63,189 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "未è¨å®š" msgid "Physical" msgstr "物ç†" +msgid "Left Mouse Button" +msgstr "マウス左ボタン" + +msgid "Right Mouse Button" +msgstr "マウスå³ãƒœã‚¿ãƒ³" + +msgid "Middle Mouse Button" +msgstr "マウスä¸å¤®ãƒœã‚¿ãƒ³" + +msgid "Mouse Wheel Up" +msgstr "マウス上ホイール" + +msgid "Mouse Wheel Down" +msgstr "マウス下ホイール" + +msgid "Mouse Wheel Left" +msgstr "マウス左ホイール" + +msgid "Mouse Wheel Right" +msgstr "マウスå³ãƒ›ã‚¤ãƒ¼ãƒ«" + +msgid "Mouse Thumb Button 1" +msgstr "マウスボタン1" + +msgid "Mouse Thumb Button 2" +msgstr "マウスボタン2" + msgid "Button" msgstr "Button" +msgid "Double Click" +msgstr "ダブルクリック" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "速度 (%s) ã§ã®ä½ç½® (%s) ã§ã®ãƒžã‚¦ã‚¹ã®å‹•ã" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "左スティック X軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯0 X軸" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "左スティック Y軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯0 Y軸" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ X軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯1 X軸" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ Y軸ã€ã‚¸ãƒ§ã‚¤ã‚¹ãƒ†ã‚£ãƒƒã‚¯1 Y軸" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "ジョイスティック2 X軸ã€å·¦ãƒˆãƒªã‚¬ãƒ¼ã€Sony L2ã€Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "ジョイスティック2 Y軸ã€å³ãƒˆãƒªã‚¬ãƒ¼ã€Sony R2ã€Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "ジョイスティック3 X軸" + +msgid "Joystick 3 Y-Axis" +msgstr "ジョイスティック3 Y軸" + +msgid "Joystick 4 X-Axis" +msgstr "ジョイスティック4 X軸" + +msgid "Joystick 4 Y-Axis" +msgstr "ジョイスティック4 Y軸" + +msgid "Unknown Joypad Axis" +msgstr "ä¸æ˜Žãªã‚¸ãƒ§ã‚¤ãƒ‘ッド軸" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "値 %.2f ã®è»¸ %d (%s) ã®ã‚¸ãƒ§ã‚¤ãƒ‘ッド モーション" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "下アクションã€ã‚½ãƒ‹ãƒ¼âœ•ã€Xbox Aã€Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "å³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã€ã‚½ãƒ‹ãƒ¼â—‹ã€Xbox B,Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "左アクションã€ã‚½ãƒ‹ãƒ¼â–¡ã€Xbox Xã€Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "上アクション, ソニー△, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Back, ソニー Select, Xbox Back, Nintendo -" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "ガイド, Sony PS, Xbox Home" + +msgid "Start, Nintendo +" +msgstr "スタート, Nintendo +" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "左スティック, ソニー L3, Xbox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯, ソニー R3, Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "左ショルダー, ソニー L1, Xbox LB" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "å³ã‚·ãƒ§ãƒ«ãƒ€ãƒ¼, ソニー R1, Xbox RB" + +msgid "D-pad Up" +msgstr "D-pad 上" + +msgid "D-pad Down" +msgstr "D-pad 下" + +msgid "D-pad Left" +msgstr "D-pad å·¦" + +msgid "D-pad Right" +msgstr "D-pad å³" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox シェア, PS5 マイク, Nintendo ã‚ャプãƒãƒ£" + +msgid "Xbox Paddle 1" +msgstr "Xbox パドル 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox パドル 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox パドル 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox パドル 4" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 タッãƒãƒ‘ッド" + +msgid "touched" +msgstr "タッãƒ" + +msgid "released" +msgstr "リリース" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "ç”»é¢ %s (%s) 㧠%s 個ã®ã‚¿ãƒƒãƒãƒã‚¤ãƒ³ãƒˆ" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "ä½ç½® (%s) ã§é€Ÿåº¦ (%s) ã® %s 個ã®ã‚¿ãƒƒãƒãƒã‚¤ãƒ³ãƒˆã§ç”»é¢ã‚’ドラッグã—ã¾ã—ãŸ" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "拡大ジェスãƒãƒ£ãƒ¼(%s)ã§å€çŽ‡ %sã«ã—ã¾ã™" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "パンジェスãƒãƒ£ãƒ¼ (%s) 㧠デルタを (%s)ã«ã—ã¾ã™" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "MIDI入力 ãƒãƒ£ãƒ³ãƒãƒ«=%s メッセージ=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "入力イベント ショートカット=%s" + +msgid "Accept" +msgstr "決定" + msgid "Select" msgstr "é¸æŠž" msgid "Cancel" msgstr "ã‚ャンセル" +msgid "Focus Next" +msgstr "次ã«ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" + +msgid "Focus Prev" +msgstr "å‰ã¸ãƒ•ã‚©ãƒ¼ã‚«ã‚¹" + msgid "Left" msgstr "å·¦" @@ -87,6 +258,15 @@ msgstr "上り" msgid "Down" msgstr "下り" +msgid "Page Up" +msgstr "Page Up" + +msgid "Page Down" +msgstr "Page Down" + +msgid "Home" +msgstr "Home" + msgid "End" msgstr "終り" @@ -105,24 +285,126 @@ msgstr "å…ƒã«æˆ»ã™" msgid "Redo" msgstr "ã‚„ã‚Šç›´ã™" +msgid "Completion Query" +msgstr "自動補完" + +msgid "New Line" +msgstr "改行" + +msgid "New Blank Line" +msgstr "æ–°ã—ã„空白行" + +msgid "New Line Above" +msgstr "上ã«æ”¹è¡Œ" + msgid "Indent" msgstr "インデント" +msgid "Dedent" +msgstr "デデント" + +msgid "Backspace" +msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹" + +msgid "Backspace Word" +msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹æ–‡å—" + +msgid "Backspace all to Left" +msgstr "ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’ã™ã¹ã¦å·¦ã«" + msgid "Delete" msgstr "削除" +msgid "Delete Word" +msgstr "æ–‡å—を削除" + +msgid "Delete all to Right" +msgstr "å³å´ã‚’ã™ã¹ã¦å‰Šé™¤" + +msgid "Caret Left" +msgstr "ã‚ャレット・レフト" + +msgid "Caret Word Left" +msgstr "ã‚ャレットワードレフト" + +msgid "Caret Right" +msgstr "ã‚ャレットライト" + +msgid "Caret Word Right" +msgstr "ã‚ャレットワードライト" + +msgid "Caret Up" +msgstr "ã‚ャレットアップ" + +msgid "Caret Down" +msgstr "ã‚ャレットダウン" + +msgid "Caret Line Start" +msgstr "ã‚ャレット行ã®é–‹å§‹" + +msgid "Caret Line End" +msgstr "ã‚ャレット行末" + +msgid "Caret Page Up" +msgstr "ã‚ャレット Page Up" + +msgid "Caret Page Down" +msgstr "ã‚ャレット Page Down" + +msgid "Caret Document Start" +msgstr "ã‚ャレット ドã‚ュメントã®é–‹å§‹" + +msgid "Caret Document End" +msgstr "ã‚ャレット ドã‚ュメント終了" + +msgid "Caret Add Below" +msgstr "ã‚ャレットを下ã«è¿½åŠ " + +msgid "Caret Add Above" +msgstr "ã‚ャレットã®ä¸Šã«è¿½åŠ " + +msgid "Scroll Up" +msgstr "上スクãƒãƒ¼ãƒ«" + +msgid "Scroll Down" +msgstr "下スクãƒãƒ¼ãƒ«" + msgid "Select All" msgstr "ã™ã¹ã¦é¸æŠž" +msgid "Select Word Under Caret" +msgstr "ã‚ャレットã®ä¸‹ã«ã‚ã‚‹æ–‡å—ã‚’é¸æŠž" + +msgid "Add Selection for Next Occurrence" +msgstr "次ã®ã‚ªã‚«ãƒ¬ãƒ³ã‚¹ã®é¸æŠžé …ç›®ã‚’è¿½åŠ " + +msgid "Clear Carets and Selection" +msgstr "ã‚ャレットã¨é¸æŠžã‚’クリア" + +msgid "Toggle Insert Mode" +msgstr "インサートモードを切り替ãˆã‚‹" + +msgid "Text Submitted" +msgstr "é€ä¿¡ã•ã‚ŒãŸãƒ†ã‚スト" + msgid "Duplicate Nodes" msgstr "ノードを複製" msgid "Delete Nodes" msgstr "ノードを削除" +msgid "Go Up One Level" +msgstr "レベルを1ã¤ä¸Šã’ã‚‹" + msgid "Refresh" msgstr "å†èªã¿è¾¼ã¿" +msgid "Show Hidden" +msgstr "éžè¡¨ç¤ºã‚’表示" + +msgid "Swap Input Direction" +msgstr "入力方å‘ã®å…¥ã‚Œæ›¿ãˆ" + msgid "Invalid input %d (not passed) in expression" msgstr "å¼ã«ç„¡åŠ¹å…¥åŠ› %d (渡ã•ã‚Œã¦ã„ã¾ã›ã‚“)" @@ -144,6 +426,12 @@ msgstr "'%s' を構築ã™ã‚‹ãŸã‚ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™" msgid "On call to '%s':" msgstr "'%s' ã®å‘¼ã³å‡ºã—時:" +msgid "Built-in script" +msgstr "組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—ト" + +msgid "Built-in" +msgstr "ビルトイン" + msgid "B" msgstr "B" @@ -165,6 +453,13 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "例: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d é …ç›®" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -178,9 +473,33 @@ msgstr "'%s' ã¨ã„ã†åå‰ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚" msgid "Add Event" msgstr "ã‚¤ãƒ™ãƒ³ãƒˆã‚’è¿½åŠ " +msgid "Remove Action" +msgstr "アクションã®é™¤åŽ»" + +msgid "Cannot Remove Action" +msgstr "アクションを除去ã§ãã¾ã›ã‚“" + +msgid "Edit Event" +msgstr "イベントã®ç·¨é›†" + +msgid "Remove Event" +msgstr "イベントã®é™¤åŽ»" + +msgid "Filter by name..." +msgstr "åå‰ã§ãƒ•ã‚£ãƒ«ã‚¿..." + +msgid "Clear All" +msgstr "ã™ã¹ã¦ã‚¯ãƒªã‚¢" + +msgid "Add New Action" +msgstr "æ–°ã—ã„アクションã®è¿½åŠ " + msgid "Add" msgstr "è¿½åŠ " +msgid "Show Built-in Actions" +msgstr "組ã¿è¾¼ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’表示" + msgid "Action" msgstr "アクション(Action)" @@ -193,6 +512,9 @@ msgstr "時間:" msgid "Value:" msgstr "値:" +msgid "Update Selected Key Handles" +msgstr "é¸æŠžã—ãŸã‚ーãƒãƒ³ãƒ‰ãƒ«ã®æ›´æ–°" + msgid "Insert Key Here" msgstr "ã“ã“ã«ã‚ーを挿入" @@ -202,21 +524,98 @@ msgstr "é¸æŠžä¸ã®ã‚ーを複製" msgid "Delete Selected Key(s)" msgstr "é¸æŠžä¸ã®ã‚ーを削除" +msgid "Make Handles Free" +msgstr "フリーãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ" + +msgid "Make Handles Linear" +msgstr "ç·šå½¢ãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ" + +msgid "Make Handles Balanced" +msgstr "ãƒãƒ©ãƒ³ã‚¹ãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ" + +msgid "Make Handles Mirrored" +msgstr "ミラーãƒãƒ³ãƒ‰ãƒ«ã‚’作æˆ" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "ãƒãƒ©ãƒ³ã‚¹ãƒãƒ³ãƒ‰ãƒ«ã‚’ä½œæˆ (自動タンジェント)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "ミラーãƒãƒ³ãƒ‰ãƒ«ã‚’ä½œæˆ (自動タンジェント)" + msgid "Add Bezier Point" msgstr "ベジェãƒã‚¤ãƒ³ãƒˆã‚’è¿½åŠ " msgid "Move Bezier Points" msgstr "ベジェãƒã‚¤ãƒ³ãƒˆã‚’移動" +msgid "Animation Duplicate Keys" +msgstr "アニメーションã®ã‚ーを複製" + +msgid "Animation Delete Keys" +msgstr "アニメーションã®ã‚ーを削除" + +msgid "Focus" +msgstr "フォーカス" + +msgid "Select All Keys" +msgstr "ã™ã¹ã¦ã®ã‚ーをé¸æŠž" + +msgid "Deselect All Keys" +msgstr "ã™ã¹ã¦ã®ã‚ーã®é¸æŠžã‚’解除" + +msgid "Animation Change Transition" +msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’変更" + +msgid "Animation Change %s" +msgstr "アニメーション %s ã«å¤‰æ›´" + +msgid "Animation Change Keyframe Value" +msgstr "アニメーションã‚ーフレームã®å€¤ã‚’変更" + +msgid "Animation Change Call" +msgstr "アニメーション呼ã³å‡ºã—ã®å¤‰æ›´" + +msgid "Animation Multi Change Transition" +msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’複数変更" + +msgid "Animation Multi Change %s" +msgstr "アニメーション%sã«è¤‡æ•°å¤‰æ›´" + +msgid "Animation Multi Change Keyframe Value" +msgstr "アニメーションã‚ーフレームã®å€¤ã‚’複数変更" + +msgid "Animation Multi Change Call" +msgstr "アニメーション呼ã³å‡ºã—を複数変更" + msgid "Change Animation Length" msgstr "アニメーションã®é•·ã•ã‚’変更" msgid "Change Animation Loop" msgstr "アニメーションã®ãƒ«ãƒ¼ãƒ—を変更" +msgid "Can't change loop mode on animation instanced from imported scene." +msgstr "" +"インãƒãƒ¼ãƒˆã—ãŸã‚·ãƒ¼ãƒ³ã‹ã‚‰ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ«ãƒ¼ãƒ—モードãŒå¤‰æ›´" +"ã§ãã¾ã›ã‚“。" + +msgid "Can't change loop mode on animation embedded in another scene." +msgstr "別ã®ã‚·ãƒ¼ãƒ³ã«åŸ‹ã‚è¾¼ã¾ã‚ŒãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ«ãƒ¼ãƒ—モードを変更ã§ãã¾ã›ã‚“。" + msgid "Property Track" msgstr "プãƒãƒ‘ティトラック" +msgid "3D Position Track" +msgstr "3Dãƒã‚¸ã‚·ãƒ§ãƒ³ãƒˆãƒ©ãƒƒã‚¯" + +msgid "3D Rotation Track" +msgstr "3D 回転トラック" + +msgid "3D Scale Track" +msgstr "3Dスケールトラック" + +msgid "Blend Shape Track" +msgstr "ブレンドシェイプトラック" + msgid "Call Method Track" msgstr "メソッド呼ã³å‡ºã—トラック" @@ -247,6 +646,9 @@ msgstr "関数:" msgid "Audio Clips:" msgstr "オーディオクリップ:" +msgid "Animation Clips:" +msgstr "アニメーションクリップ:" + msgid "Change Track Path" msgstr "トラックパスを変更" @@ -277,6 +679,9 @@ msgstr "回転:" msgid "Scale:" msgstr "スケール:" +msgid "Blend Shape:" +msgstr "形状ã®ãƒ–レンド:" + msgid "Type:" msgstr "åž‹:" @@ -292,6 +697,18 @@ msgstr "インãƒãƒ³ãƒ‰ãƒ«:" msgid "Out-Handle:" msgstr "アウトãƒãƒ³ãƒ‰ãƒ«:" +msgid "Handle mode: Free\n" +msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: フリー\n" + +msgid "Handle mode: Linear\n" +msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ç·šå½¢\n" + +msgid "Handle mode: Balanced\n" +msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ãƒãƒ©ãƒ³ã‚¹\n" + +msgid "Handle mode: Mirrored\n" +msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ¢ãƒ¼ãƒ‰: ミラー\n" + msgid "Stream:" msgstr "ストリーム:" @@ -325,6 +742,12 @@ msgstr "リニア" msgid "Cubic" msgstr "ã‚ュービック" +msgid "Linear Angle" +msgstr "直線角" + +msgid "Cubic Angle" +msgstr "立方角" + msgid "Clamp Loop Interp" msgstr "ループ補間をクランプ" @@ -352,12 +775,28 @@ msgstr "アニメーション補間モードã®å¤‰æ›´" msgid "Change Animation Loop Mode" msgstr "アニメーションã®ãƒ«ãƒ¼ãƒ—モードを変更" +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"圧縮ã•ã‚ŒãŸãƒˆãƒ©ãƒƒã‚¯ã¯ã€ç·¨é›†ã‚„削除ã¯ã§ãã¾ã›ã‚“。編集ã™ã‚‹ã«ã¯ã€åœ§ç¸®ã‚’無効ã«ã—ã¦" +"アニメーションをå†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。" + msgid "Remove Anim Track" msgstr "アニメーショントラックを除去" +msgid "Create new track for %s and insert key?" +msgstr "%s ã®æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚ーを挿入ã—ã¾ã™ã‹ï¼Ÿ" + +msgid "Create %d new tracks and insert keys?" +msgstr "%d æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚ーを挿入ã—ã¾ã™ã‹ï¼Ÿ" + msgid "Create" msgstr "作æˆ" +msgid "Animation Insert Key" +msgstr "アニメーションã‚ーを挿入" + msgid "node '%s'" msgstr "ノード '%s'" @@ -378,6 +817,13 @@ msgstr "アニメーションã®ã‚¹ãƒ†ãƒƒãƒ—を変更" msgid "Rearrange Tracks" msgstr "トラックã®ä¸¦ã¹æ›¿ãˆ" +msgid "Blend Shape tracks only apply to MeshInstance3D nodes." +msgstr "Blend Shapeトラックã¯ã€MeshInstance3Dノードã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚" + +msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." +msgstr "" +"ä½ç½®/回転/スケール 3D トラックã¯ã€3D ベースã®ãƒŽãƒ¼ãƒ‰ã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚" + msgid "" "Audio tracks can only point to nodes of type:\n" "-AudioStreamPlayer\n" @@ -404,6 +850,18 @@ msgstr "ãƒ™ã‚¸ã‚§ãƒˆãƒ©ãƒƒã‚¯ã‚’è¿½åŠ " msgid "Track path is invalid, so can't add a key." msgstr "トラックã®ãƒ‘スãŒç„¡åŠ¹ãªãŸã‚ã€ã‚ãƒ¼ã‚’è¿½åŠ ã§ãã¾ã›ã‚“。" +msgid "Track is not of type Node3D, can't insert key" +msgstr "トラックã®åž‹ãŒ Node3D ã§ã¯ãªã„ãŸã‚ã€ã‚ーを挿入ã§ãã¾ã›ã‚“" + +msgid "Add Position Key" +msgstr "ä½ç½®ã‚ãƒ¼ã‚’è¿½åŠ " + +msgid "Add Rotation Key" +msgstr "回転ã‚ãƒ¼ã‚’è¿½åŠ " + +msgid "Add Scale Key" +msgstr "スケールã‚ãƒ¼ã‚’è¿½åŠ " + msgid "Add Track Key" msgstr "トラックã‚ãƒ¼ã‚’è¿½åŠ " @@ -416,6 +874,9 @@ msgstr "メソッドトラックã‚ーã®è¿½åŠ " msgid "Method not found in object:" msgstr "オブジェクト内ã«ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:" +msgid "Animation Move Keys" +msgstr "アニメーション ã‚ーã®ç§»å‹•" + msgid "Position" msgstr "ä½ç½®" @@ -425,6 +886,9 @@ msgstr "回転" msgid "Scale" msgstr "スケール" +msgid "BlendShape" +msgstr "ブレンドシェイプ" + msgid "Methods" msgstr "メソッド" @@ -440,10 +904,41 @@ msgstr "クリップボードã¯ç©ºã§ã™ï¼" msgid "Paste Tracks" msgstr "トラックを貼り付ã‘" +msgid "Animation Scale Keys" +msgstr "アニメーション ã‚ーã®ã‚¹ã‚±ãƒ¼ãƒ«" + +msgid "Make Easing Keys" +msgstr "イージングã‚ーã®ä½œæˆ" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "ã“ã®ã‚ªãƒ—ションã¯å˜ä¸€ãƒˆãƒ©ãƒƒã‚¯ã§ã®ãƒ™ã‚¸ã‚§ç·¨é›†ã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。" +msgid "Animation Add RESET Keys" +msgstr "RESETã‚ーã®è¿½åŠ " + +msgid "Bake Animation as Linear keys." +msgstr "アニメーションをリニア ã‚ーã¨ã—ã¦ãƒ™ã‚¤ã‚¯ã—ã¾ã™ã€‚" + +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To modify this animation, navigate to the scene's Advanced Import settings " +"and select the animation.\n" +"Some options, including looping, are available here. To add custom tracks, " +"enable \"Save To File\" and\n" +"\"Keep Custom Tracks\"." +msgstr "" +"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã‚‹ãŸã‚ã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸ" +"トラックã¸ã®å¤‰æ›´ã¯ä¿å˜ã•ã‚Œã¾ã›ã‚“。\n" +"\n" +"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’変更ã™ã‚‹ã«ã¯ã€ã‚·ãƒ¼ãƒ³ã®é«˜åº¦ãªã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨å®šã«ç§»å‹•ã—ã€ã‚¢ãƒ‹" +"メーションをé¸æŠžã—ã¾ã™ã€‚\n" +"ループをå«ã‚€ã„ãã¤ã‹ã®ã‚ªãƒ—ションãŒã‚ã‚Šã¾ã™ã€‚\n" +"ã‚«ã‚¹ã‚¿ãƒ ãƒˆãƒ©ãƒƒã‚¯ã‚’è¿½åŠ ã™ã‚‹ã«ã¯ã€ã€Œãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å˜ã€ã¨ã€Œã‚«ã‚¹ã‚¿ãƒ トラックをä¿æŒ" +"ã™ã‚‹ã€ã‚’有効ã«ã—ã¦ãã ã•ã„。" + msgid "Warning: Editing imported animation" msgstr "è¦å‘Š:インãƒãƒ¼ãƒˆã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’編集ã—ã¦ã„ã¾ã™" @@ -452,6 +947,12 @@ msgstr "" "アニメーションを作ã£ã¦ç·¨é›†ã™ã‚‹ã«ã¯ã€ AnimationPlayer ノードをé¸æŠžã—ã¦ãã ã•" "ã„。" +msgid "Imported Scene" +msgstr "インãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚·ãƒ¼ãƒ³" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "ベジェ曲線エディタã¨ãƒˆãƒ©ãƒƒã‚¯ã‚¨ãƒ‡ã‚£ã‚¿ã‚’切り替ãˆã¾ã™ã€‚" + msgid "Only show tracks from nodes selected in tree." msgstr "ツリーã§é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®ãƒˆãƒ©ãƒƒã‚¯ã®ã¿ã‚’表示ã—ã¾ã™ã€‚" @@ -486,6 +987,9 @@ msgstr "スケールã®é¸æŠž" msgid "Scale From Cursor" msgstr "カーソル基準ã§ã‚¹ã‚±ãƒ¼ãƒ«" +msgid "Make Easing Selection" +msgstr "イージングé¸æŠžã‚’作æˆ" + msgid "Duplicate Selection" msgstr "é¸æŠžç¯„囲を複製" @@ -504,6 +1008,18 @@ msgstr "å‰ã®ã‚¹ãƒ†ãƒƒãƒ—ã¸" msgid "Apply Reset" msgstr "リセット" +msgid "Bake Animation" +msgstr "アニメーションをベイク" + +msgid "Optimize Animation (no undo)" +msgstr "アニメーションã®æœ€é©åŒ–(アンドゥãªã—)" + +msgid "Clean-Up Animation (no undo)" +msgstr "アニメーションをクリーンアップ(アンドゥãªã—)" + +msgid "Pick a node to animate:" +msgstr "アニメーションã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž:" + msgid "Use Bezier Curves" msgstr "ベジェ曲線を使用" @@ -513,9 +1029,15 @@ msgstr "RESETトラックを作æˆ" msgid "Anim. Optimizer" msgstr "アニメーションã®ã‚ªãƒ—ティマイザー" +msgid "Max. Velocity Error:" +msgstr "最大ベãƒã‚·ãƒ†ã‚£ã‚¨ãƒ©ãƒ¼:" + msgid "Max. Angular Error:" msgstr "最大。角度エラー:" +msgid "Max. Precision Error:" +msgstr "最大精度エラー:" + msgid "Optimize" msgstr "最é©åŒ–" @@ -537,12 +1059,21 @@ msgstr "クリーンアップ" msgid "Scale Ratio:" msgstr "スケール比:" +msgid "Select Transition and Easing" +msgstr "トランジションã¨ã‚¤ãƒ¼ã‚¸ãƒ³ã‚°ã‚’é¸æŠž" + +msgid "Anim. Baker" +msgstr "アニメーションベイカー" + msgid "Select Tracks to Copy" msgstr "コピーã™ã‚‹ãƒˆãƒ©ãƒƒã‚¯ã‚’é¸æŠž" msgid "Select All/None" msgstr "ã™ã¹ã¦ã‚’é¸æŠž/解除" +msgid "Animation Change Keyframe Time" +msgstr "アニメーションã‚ーフレームã®æ™‚間を変更" + msgid "Add Audio Track Clip" msgstr "オーディオトラッククリップã®è¿½åŠ " @@ -561,6 +1092,14 @@ msgstr "行番å·:" msgid "%d replaced." msgstr "%d件を置æ›ã—ã¾ã—ãŸã€‚" +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%dä»¶ä¸ %d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" + msgid "Match Case" msgstr "大文å—å°æ–‡å—を区別ã™ã‚‹" @@ -619,9 +1158,15 @@ msgstr "スクリプトã«æŽ¥ç¶š:" msgid "From Signal:" msgstr "シグナルã‹ã‚‰:" +msgid "Filter Nodes" +msgstr "ノードをフィルタ" + msgid "Scene does not contain any script." msgstr "シーンã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" +msgid "Select Method" +msgstr "メソッドã®é¸æŠž" + msgid "Remove" msgstr "除去" @@ -631,6 +1176,12 @@ msgstr "呼ã³å‡ºã—å¼•æ•°ã‚’è¿½åŠ :" msgid "Extra Call Arguments:" msgstr "è¿½åŠ ã®å‘¼ã³å‡ºã—引数:" +msgid "Allows to drop arguments sent by signal emitter." +msgstr "シグナルエミッターã‹ã‚‰é€ä¿¡ã•ã‚ŒãŸå¼•æ•°ã‚’ドãƒãƒƒãƒ—ã§ãるよã†ã«ã—ã¾ã™ã€‚" + +msgid "Unbind Signal Arguments:" +msgstr "シグナルã®å¼•æ•°ã‚’変更:" + msgid "Receiver Method:" msgstr "å—ä¿¡å´ãƒ¡ã‚½ãƒƒãƒ‰:" @@ -662,6 +1213,9 @@ msgstr "接続" msgid "Signal:" msgstr "シグナル:" +msgid "No description." +msgstr "説明ãŒã‚ã‚Šã¾ã›ã‚“。" + msgid "Connect '%s' to '%s'" msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š" @@ -680,27 +1234,33 @@ msgstr "切æ–" msgid "Connect a Signal to a Method" msgstr "メソッドã«ã‚·ã‚°ãƒŠãƒ«ã‚’接続" -msgid "Edit Connection:" -msgstr "接続を編集:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "シグナル %s ã‹ã‚‰ã™ã¹ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" msgid "Signals" msgstr "シグナル" +msgid "Filter Signals" +msgstr "シグナルを絞り込む" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "ã“ã®ã‚·ã‚°ãƒŠãƒ«ã‹ã‚‰ã™ã¹ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ" msgid "Disconnect All" msgstr "ã™ã¹ã¦åˆ‡æ–" +msgid "Copy Name" +msgstr "åå‰ã‚’コピー" + msgid "Edit..." msgstr "編集..." msgid "Go to Method" msgstr "メソッドã¸ç§»å‹•" +msgid "Change Type of \"%s\"" +msgstr "\"%s\" ã®åž‹ã‚’変更ã™ã‚‹" + msgid "Change" msgstr "変更" @@ -710,6 +1270,12 @@ msgstr "%s ã‚’æ–°è¦ä½œæˆ" msgid "No results for \"%s\"." msgstr "\"%s\" ã®çµæžœã¯ã‚ã‚Šã¾ã›ã‚“。" +msgid "This class is marked as deprecated." +msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã¯éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚" + +msgid "This class is marked as experimental." +msgstr "ã“ã®ã‚¯ãƒ©ã‚¹ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚" + msgid "No description available for %s." msgstr "%s ã«ã¤ã„ã¦ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。" @@ -719,6 +1285,9 @@ msgstr "ãŠæ°—ã«å…¥ã‚Š:" msgid "Recent:" msgstr "最近:" +msgid "(Un)favorite selected item." +msgstr "é¸æŠžä¸ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹ / ã—ãªã„" + msgid "Search:" msgstr "検索:" @@ -746,9 +1315,21 @@ msgstr "ノードã®ãƒ‘スをコピー" msgid "Instance:" msgstr "インスタンス:" +msgid "" +"This node has been instantiated from a PackedScene file:\n" +"%s\n" +"Click to open the original file in the Editor." +msgstr "" +"ã“ã®ãƒŽãƒ¼ãƒ‰ã¯ä»¥ä¸‹ã®PackedSceneファイルã‹ã‚‰ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•ã‚Œã¾ã—ãŸã€‚\n" +"%s\n" +"クリックã™ã‚‹ã¨å…ƒã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚¨ãƒ‡ã‚£ã‚¿ã§é–‹ã‹ã‚Œã¾ã™ã€‚" + msgid "Toggle Visibility" msgstr "å¯è¦–性ã®åˆ‡ã‚Šæ›¿ãˆ" +msgid "ms" +msgstr "ミリ秒" + msgid "Monitors" msgstr "モニター" @@ -818,6 +1399,21 @@ msgstr "時間" msgid "Calls" msgstr "呼ã³å‡ºã—" +msgid "Fit to Frame" +msgstr "フレームã«åˆã‚ã›ã‚‹" + +msgid "Linked" +msgstr "連動" + +msgid "CPU" +msgstr "CPU" + +msgid "GPU" +msgstr "GPU" + +msgid "Execution resumed." +msgstr "実行ãŒå†é–‹ã•ã‚Œã¾ã—ãŸã€‚" + msgid "Bytes:" msgstr "ãƒã‚¤ãƒˆ:" @@ -827,26 +1423,32 @@ msgstr "è¦å‘Š:" msgid "Error:" msgstr "エラー:" -msgid "C++ Error" -msgstr "C++ エラー" +msgid "%s Error" +msgstr "%s エラー" -msgid "C++ Error:" -msgstr "C++ エラー:" +msgid "Stack Trace" +msgstr "スタックトレース" -msgid "Source" -msgstr "ソース" +msgid "Stack Trace:" +msgstr "スタックトレース:" -msgid "C++ Source" -msgstr "C++ ソース" +msgid "Debug session started." +msgstr "デãƒãƒƒã‚°ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’開始ã—ã¾ã—ãŸã€‚" -msgid "Source:" -msgstr "ソース:" +msgid "Debug session closed." +msgstr "デãƒãƒƒã‚°ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã—ãŸã€‚" -msgid "C++ Source:" -msgstr "C++ ソース:" +msgid "Line %d" +msgstr "è¡Œç•ªå· %d" -msgid "Stack Trace" -msgstr "スタックトレース" +msgid "Delete Breakpoint" +msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã®å‰Šé™¤" + +msgid "Delete All Breakpoints in:" +msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’消去:" + +msgid "Delete All Breakpoints" +msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã®å‰Šé™¤" msgid "Copy Error" msgstr "エラーをコピー" @@ -854,6 +1456,9 @@ msgstr "エラーをコピー" msgid "Open C++ Source on GitHub" msgstr "C++ã®ã‚½ãƒ¼ã‚¹ã‚’GitHubã§é–‹ã" +msgid "C++ Source" +msgstr "C++ ソース" + msgid "Video RAM" msgstr "ビデオRAM" @@ -875,6 +1480,9 @@ msgstr "続行" msgid "Stack Frames" msgstr "スタックフレーム" +msgid "Filter Stack Variables" +msgstr "スタック変数ã§ãƒ•ã‚£ãƒ«ã‚¿" + msgid "Breakpoints" msgstr "ブレークãƒã‚¤ãƒ³ãƒˆ" @@ -887,6 +1495,9 @@ msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€" msgid "Profiler" msgstr "プãƒãƒ•ã‚¡ã‚¤ãƒ©ãƒ¼" +msgid "Visual Profiler" +msgstr "ビジュアルプãƒãƒ•ã‚¡ã‚¤ãƒ©ãƒ¼" + msgid "List of Video Memory Usage by Resource:" msgstr "リソースã«ã‚ˆã‚‹ãƒ“デオメモリーã®æ¶ˆè²»é‡ä¸€è¦§:" @@ -976,6 +1587,12 @@ msgstr "シーンを開ã" msgid "Owners of: %s (Total: %d)" msgstr "%s ã®ã‚ªãƒ¼ãƒŠãƒ¼ (åˆè¨ˆ: %d)" +msgid "Localization remap" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®å†ãƒžãƒƒãƒ—" + +msgid "Localization remap for path '%s' and locale '%s'." +msgstr "パス '%s' ã¨ãƒã‚±ãƒ¼ãƒ« '%s' ã®ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®å†ãƒžãƒƒãƒ—。" + msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " @@ -1192,6 +1809,12 @@ msgstr "ãƒã‚¤ãƒ‘ス" msgid "Bus Options" msgstr "ãƒã‚¹ オプション" +msgid "Duplicate Bus" +msgstr "オーディオãƒã‚¹ã‚’複製" + +msgid "Delete Bus" +msgstr "オーディオãƒã‚¹ã‚’削除" + msgid "Reset Volume" msgstr "音é‡ã‚’リセット" @@ -1279,18 +1902,27 @@ msgstr "有効ãªæ–‡å—:" msgid "Must not collide with an existing engine class name." msgstr "æ—¢å˜ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹åã¨é‡è¤‡ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。" +msgid "Must not collide with an existing global script class name." +msgstr "æ—¢å˜ã®ã‚°ãƒãƒ¼ãƒãƒ«ã‚¹ã‚¯ãƒªãƒ—トクラスåã¨ç«¶åˆã—ãªã„よã†ã«ã—ã¦ãã ã•ã„。" + msgid "Must not collide with an existing built-in type name." msgstr "æ—¢å˜ã®çµ„ã¿è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" msgid "Must not collide with an existing global constant name." msgstr "æ—¢å˜ã®ã‚°ãƒãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。" +msgid "Keyword cannot be used as an Autoload name." +msgstr "ã‚ーワードã¯è‡ªå‹•èªã¿è¾¼ã¿ã®åå‰ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。" + msgid "Autoload '%s' already exists!" msgstr "自動èªã¿è¾¼ã¿ '%s' ã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ï¼" msgid "Rename Autoload" msgstr "自動èªã¿è¾¼ã¿ã®åå‰å¤‰æ›´" +msgid "Toggle Autoload Globals" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã®è‡ªå‹•èªè¾¼ã¿ã‚’切り替ãˆ" + msgid "Move Autoload" msgstr "自動èªã¿è¾¼ã¿ã‚’移動" @@ -1303,12 +1935,18 @@ msgstr "有効" msgid "Rearrange Autoloads" msgstr "自動èªã¿è¾¼ã¿ã®ä¸¦ã¹æ›¿ãˆ" +msgid "Can't add Autoload:" +msgstr "自動èªã¿è¾¼ã¿ã‚’è¿½åŠ å‡ºæ¥ã¾ã›ã‚“:" + msgid "%s is an invalid path. File does not exist." msgstr "%s ã¯ç„¡åŠ¹ãªãƒ‘スã§ã™ã€‚ファイルãŒå˜åœ¨ã—ã¾ã›ã‚“。" msgid "%s is an invalid path. Not in resource path (res://)." msgstr "%s ã¯ç„¡åŠ¹ãªãƒ‘スã§ã™ã€‚リソースパス (res://) ã«å˜åœ¨ã—ã¾ã›ã‚“。" +msgid "Add Autoload" +msgstr "自動èªã¿è¾¼ã¿ã‚’è¿½åŠ " + msgid "Path:" msgstr "パス:" @@ -1318,6 +1956,9 @@ msgstr "ノードå:" msgid "Global Variable" msgstr "ã‚°ãƒãƒ¼ãƒãƒ«å¤‰æ•°" +msgid "3D Engine" +msgstr "3Dエンジン" + msgid "2D Physics" msgstr "2D物ç†" @@ -1327,9 +1968,115 @@ msgstr "3D物ç†" msgid "Navigation" msgstr "ナビゲーション" +msgid "XR" +msgstr "XR" + +msgid "RenderingDevice" +msgstr "レンダリングデãƒã‚¤ã‚¹" + msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Text Server: Fallback" +msgstr "テã‚ストサーãƒãƒ¼: フォールãƒãƒƒã‚¯" + +msgid "Text Server: Advanced" +msgstr "テã‚ストサーãƒãƒ¼: 詳細" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "TTF, OTF, Type 1, WOFF1 フォント" + +msgid "WOFF2 Fonts" +msgstr "WOFF2 フォント" + +msgid "SIL Graphite Fonts" +msgstr "SILグラファイトフォント" + +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "マルãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãƒ•ã‚©ãƒ³ãƒˆæç”»" + +msgid "3D Nodes as well as RenderingServer access to 3D features." +msgstr "3DノードãŠã‚ˆã³3D機能ã¸ã®RenderingServerã®ã‚¢ã‚¯ã‚»ã‚¹ã€‚" + +msgid "2D Physics nodes and PhysicsServer2D." +msgstr "2D物ç†ãƒŽãƒ¼ãƒ‰ã¨ PhysicsServer2D" + +msgid "3D Physics nodes and PhysicsServer3D." +msgstr "3D物ç†ãƒŽãƒ¼ãƒ‰ã¨PhysicsServer3D" + +msgid "Navigation, both 2D and 3D." +msgstr "2Dã¨3Dã®ãƒŠãƒ“ゲーション。" + +msgid "XR (AR and VR)." +msgstr "XR (AR 㨠VR)." + +msgid "" +"RenderingDevice based rendering (if disabled, the OpenGL back-end is " +"required)." +msgstr "" +"レンダリングデãƒã‚¤ã‚¹ãƒ™ãƒ¼ã‚¹ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ï¼ˆç„¡åŠ¹ã®å ´åˆã€OpenGLãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒå¿…" +"è¦ã§ã™ï¼‰" + +msgid "" +"OpenGL back-end (if disabled, the RenderingDevice back-end is required)." +msgstr "" +"OpenGLãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ï¼ˆç„¡åŠ¹ã®å ´åˆã€RenderingDeviceãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒå¿…è¦ã§ã™ï¼‰" + +msgid "Vulkan back-end of RenderingDevice." +msgstr "レンダリングデãƒã‚¤ã‚¹ã®Vulkanãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰" + +msgid "" +"Fallback implementation of Text Server\n" +"Supports basic text layouts." +msgstr "" +"Text Server ã®ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯å®Ÿè£…\n" +"基本的ãªãƒ†ã‚ストレイアウトをサãƒãƒ¼ãƒˆ" + +msgid "" +"Text Server implementation powered by ICU and HarfBuzz libraries.\n" +"Supports complex text layouts, BiDi, and contextual OpenType font features." +msgstr "" +"ICUã¨HarfBuzzライブラリã«ã‚ˆã‚‹ãƒ†ã‚ストサーãƒãƒ¼ã®å®Ÿè£…。\n" +"複雑ãªãƒ†ã‚ストレイアウトã€BiDiã€ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆOpenTypeフォント機能をサãƒãƒ¼ãƒˆã—" +"ã¾ã™ã€‚" + +msgid "" +"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType " +"library (if disabled, WOFF2 support is also disabled)." +msgstr "" +"FreeTypeライブラリを使用ã—ãŸTrueTypeã€OpenTypeã€Type1ã€WOFF1フォントフォー" +"マット対応(無効ã®å ´åˆã€WOFF2対応も無効ã¨ãªã‚Šã¾ã™ï¼‰" + +msgid "WOFF2 font format support using FreeType and Brotli libraries." +msgstr "" +"FreeType ãŠã‚ˆã³ Brotli ライブラリを使用ã—㟠WOFF2 フォント形å¼ã®ã‚µãƒãƒ¼ãƒˆ" + +msgid "" +"SIL Graphite smart font technology support (supported by Advanced Text " +"Server only)." +msgstr "" +"SIL Graphiteスマートフォントテクノãƒã‚¸ãƒ¼å¯¾å¿œï¼ˆAdvanced Text Serverã®ã¿å¯¾å¿œï¼‰" + +msgid "" +"Multi-channel signed distance field font rendering support using msdfgen " +"library (pre-rendered MSDF fonts can be used even if this option disabled)." +msgstr "" +"msdfgenライブラリを用ã„ãŸãƒžãƒ«ãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãƒ•ã‚©ãƒ³ãƒˆã®ãƒ¬ãƒ³" +"ダリングã«å¯¾å¿œï¼ˆã“ã®ã‚ªãƒ—ションを無効ã«ã—ã¦ã‚‚ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°æ¸ˆã¿ã®MSDFフォント" +"ã¯ä½¿ç”¨å¯èƒ½ã§ã™ï¼‰" + +msgid "General Features:" +msgstr "主è¦æ©Ÿèƒ½:" + +msgid "Text Rendering and Font Options:" +msgstr "テã‚ストã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã¨ãƒ•ã‚©ãƒ³ãƒˆã®ã‚ªãƒ—ション:" + +msgid "File saving failed." +msgstr "ファイルä¿å˜ã‚¨ãƒ©ãƒ¼" + msgid "Nodes and Classes:" msgstr "ノードã¨ã‚¯ãƒ©ã‚¹:" @@ -1345,12 +2092,42 @@ msgstr "æ–°è¦" msgid "Save" msgstr "ä¿å˜" +msgid "Profile:" +msgstr "プãƒãƒ•ã‚¡ã‚¤ãƒ«:" + msgid "Reset to Defaults" msgstr "デフォルトã«æˆ»ã™" +msgid "Detect from Project" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‹ã‚‰æ¤œå‡º" + +msgid "Actions:" +msgstr "アクション:" + +msgid "Configure Engine Build Profile:" +msgstr "エンジンビルドプãƒãƒ•ã‚¡ã‚¤ãƒ«ã®è¨å®š:" + +msgid "Please Confirm:" +msgstr "確èª:" + +msgid "Engine Build Profile" +msgstr "エンジンビルドプãƒãƒ•ã‚¡ã‚¤ãƒ«" + +msgid "Load Profile" +msgstr "プãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒãƒ¼ãƒ‰" + msgid "Export Profile" msgstr "プãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" +msgid "Forced classes on detect:" +msgstr "検出時ã®å¼·åˆ¶ã‚¯ãƒ©ã‚¹:" + +msgid "Edit Build Configuration Profile" +msgstr "ビルド構æˆãƒ—ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ç·¨é›†" + +msgid "Filter Commands" +msgstr "コマンドã§ãƒ•ã‚£ãƒ«ã‚¿" + msgid "Paste Params" msgstr "パラメーターを貼り付ã‘" @@ -1372,6 +2149,10 @@ msgstr "[未ä¿å˜]" msgid "Please select a base directory first." msgstr "ã¯ã˜ã‚ã«ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。" +msgid "Could not create folder. File with that name already exists." +msgstr "" +"フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãã®åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã™ã§ã«å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚" + msgid "Choose a Directory" msgstr "ディレクトリをé¸æŠž" @@ -1408,6 +2189,9 @@ msgstr "ファイルシステムドック" msgid "Import Dock" msgstr "インãƒãƒ¼ãƒˆãƒ‰ãƒƒã‚¯" +msgid "History Dock" +msgstr "å±¥æ´ãƒ‰ãƒƒã‚¯" + msgid "Allows to view and edit 3D scenes." msgstr "3Dシーンã®è¡¨ç¤ºã¨ç·¨é›†ãŒã§ãã¾ã™ã€‚" @@ -1435,6 +2219,9 @@ msgstr "" "å„アセットã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆè¨å®šã‚’構æˆã§ãã¾ã™ã€‚動作ã«ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ドッグãŒå¿…" "è¦ã§ã™ã€‚" +msgid "Provides an overview of the editor's and each scene's undo history." +msgstr "エディターã¨å„シーンã®ã‚¢ãƒ³ãƒ‰ã‚¥å±¥æ´ã®æ¦‚è¦ã‚’æä¾›ã—ã¾ã™ã€‚" + msgid "(current)" msgstr "(ç¾åœ¨)" @@ -1575,6 +2362,9 @@ msgstr "ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ã" msgid "Save a File" msgstr "ファイルをä¿å˜" +msgid "Favorited folder does not exist anymore and will be removed." +msgstr "ãŠæ°—ã«å…¥ã‚Šãƒ•ã‚©ãƒ«ãƒ€ã¯å˜åœ¨ã—ãªã„ãŸã‚ã€å‰Šé™¤ã•ã‚Œã¾ã™ã€‚" + msgid "Go Back" msgstr "戻る" @@ -1635,6 +2425,20 @@ msgstr "プレビュー:" msgid "File:" msgstr "ファイル:" +msgid "" +"Remove the selected files? For safety only files and empty directories can " +"be deleted from here. (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"é¸æŠžã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¾ã™ã‹ï¼Ÿå®‰å…¨ã®ãŸã‚ã€ã“ã“ã‹ã‚‰å‰Šé™¤ã§ãã‚‹ã®ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨" +"空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã ã‘ã§ã™ã€‚(å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“)\n" +"ファイルシステムã®è¨å®šã«ã‚ˆã£ã¦ã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚·ã‚¹ãƒ†ãƒ ã®ã‚´ãƒŸç®±ã«ç§»å‹•ã•ã‚Œã‚‹ã‹ã€æ°¸" +"ä¹…ã«å‰Šé™¤ã•ã‚Œã¾ã™ã€‚" + +msgid "Some extensions need the editor to restart to take effect." +msgstr "一部ã®æ‹¡å¼µæ©Ÿèƒ½ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚" + msgid "Restart" msgstr "å†èµ·å‹•" @@ -1654,6 +2458,55 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "アセットを(å†)インãƒãƒ¼ãƒˆä¸" +msgid "Import resources of type: %s" +msgstr "次ã®ã‚¿ã‚¤ãƒ—ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’インãƒãƒ¼ãƒˆ: %s" + +msgid "No return value." +msgstr "戻り値ã¯ã‚ã‚Šã¾ã›ã‚“ã€" + +msgid "Deprecated" +msgstr "é‡è¤‡" + +msgid "Experimental" +msgstr "実験的" + +msgid "This method supports a variable number of arguments." +msgstr "ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€å¯å¤‰æ•°ã®å¼•æ•°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚" + +msgid "" +"This method is called by the engine.\n" +"It can be overridden to customize built-in behavior." +msgstr "" +"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã‚¨ãƒ³ã‚¸ãƒ³ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚\n" +"オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ã§ã€çµ„ã¿è¾¼ã¿ã®å‹•ä½œã‚’カスタマイズã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" + +msgid "" +"This method has no side effects.\n" +"It does not modify the object in any way." +msgstr "" +"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã¯å‰¯ä½œç”¨ã¯ã‚ã‚Šã¾ã›ã‚“。\n" +"ã¾ãŸã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã‚ªãƒ–ジェクトを一切変更ã—ã¾ã›ã‚“。" + +msgid "" +"This method does not need an instance to be called.\n" +"It can be called directly using the class name." +msgstr "" +"ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€å‘¼ã³å‡ºã™ãŸã‚ã«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’å¿…è¦ã¨ã—ã¾ã›ã‚“。\n" +"クラスåを使ã£ã¦ç›´æŽ¥å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚" + +msgid "Error codes returned:" +msgstr "è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰:" + +msgid "There is currently no description for this %s." +msgstr "ã“ã® %s ã«ã¯ç¾åœ¨èª¬æ˜ŽãŒã‚ã‚Šã¾ã›ã‚“。" + +msgid "" +"There is currently no description for this %s. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/" +"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼" + msgid "Top" msgstr "トップ" @@ -1666,9 +2519,32 @@ msgstr "継承元:" msgid "Inherited by:" msgstr "継承先:" +msgid "" +"This class is marked as deprecated. It will be removed in future versions." +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã¯ã€éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å‰Šé™¤ã•ã‚Œã‚‹äºˆ" +"定ã§ã™ã€‚" + +msgid "" +"This class is marked as experimental. It is subject to likely change or " +"possible removal in future versions. Use at your own discretion." +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚å°†æ¥ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§å¤‰æ›´ã¾ãŸã¯å‰Šé™¤ã•ã‚Œ" +"ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã”自身ã®åˆ¤æ–ã§ä½¿ç”¨ã—ã¦ãã ã•ã„。" + msgid "Description" msgstr "説明" +msgid "There is currently no description for this class." +msgstr "ç¾åœ¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。" + +msgid "" +"There is currently no description for this class. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/" +"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼" + msgid "Online Tutorials" msgstr "オンラインãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«" @@ -1681,6 +2557,15 @@ msgstr "%s を上書ã:" msgid "default:" msgstr "デフォルト:" +msgid "property:" +msgstr "プãƒãƒ‘ティ:" + +msgid "Constructors" +msgstr "定数" + +msgid "Operators" +msgstr "オペレーター" + msgid "Theme Properties" msgstr "テーマ プãƒãƒ‘ティ" @@ -1693,6 +2578,9 @@ msgstr "定数" msgid "Fonts" msgstr "フォント" +msgid "Font Sizes" +msgstr "フォントサイズ" + msgid "Icons" msgstr "アイコン" @@ -1702,12 +2590,28 @@ msgstr "スタイル" msgid "Enumerations" msgstr "列挙型" +msgid "Annotations" +msgstr "アノテーション" + +msgid "There is currently no description for this annotation." +msgstr "ç¾åœ¨ã€ã“ã®ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。" + +msgid "" +"There is currently no description for this annotation. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/" +"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼" + msgid "Property Descriptions" msgstr "プãƒãƒ‘ティã®èª¬æ˜Ž" msgid "(value)" msgstr "(値)" +msgid "There is currently no description for this property." +msgstr "ç¾åœ¨ã€ã“ã®ãƒ—ãƒãƒ‘ティã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。" + msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" @@ -1715,9 +2619,15 @@ msgstr "" "ç¾åœ¨ã€ã“ã®ãƒ—ãƒãƒ‘ティã®èª¬æ˜Žã¯ã‚ã‚Šã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/" "color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼" +msgid "Constructor Descriptions" +msgstr "定数ã®èª¬æ˜Ž" + msgid "Method Descriptions" msgstr "メソッドã®èª¬æ˜Ž" +msgid "Operator Descriptions" +msgstr "オペレーターã®èª¬æ˜Ž" + msgid "%d match." msgstr "%d件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" @@ -1739,12 +2649,21 @@ msgstr "ã™ã¹ã¦è¡¨ç¤º" msgid "Classes Only" msgstr "クラスã®ã¿" +msgid "Constructors Only" +msgstr "定数ã®ã¿" + msgid "Methods Only" msgstr "メソッドã®ã¿" +msgid "Operators Only" +msgstr "演算åã®ã¿" + msgid "Signals Only" msgstr "シグナルã®ã¿" +msgid "Annotations Only" +msgstr "アノテーションã®ã¿" + msgid "Constants Only" msgstr "定数ã®ã¿" @@ -1757,6 +2676,9 @@ msgstr "テーマプãƒãƒ‘ティã®ã¿" msgid "Member Type" msgstr "メンãƒãƒ¼ã‚¿ã‚¤ãƒ—" +msgid "(constructors)" +msgstr "(定数)" + msgid "Class" msgstr "クラス" @@ -1766,6 +2688,9 @@ msgstr "メソッド" msgid "Signal" msgstr "シグナル" +msgid "Annotation" +msgstr "アノテーション" + msgid "Constant" msgstr "コンスタント" @@ -1775,9 +2700,21 @@ msgstr "プãƒãƒ‘ティ" msgid "Theme Property" msgstr "テーマプãƒãƒ‘ティ" +msgid "This member is marked as deprecated." +msgstr "ã“ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯éžæŽ¨å¥¨ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚" + +msgid "This member is marked as experimental." +msgstr "ã“ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯å®Ÿé¨“用ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚" + msgid "Property:" msgstr "プãƒãƒ‘ティ:" +msgid "Pin Value" +msgstr "値をピン留ã‚ã™ã‚‹" + +msgid "Pin Value [Disabled because '%s' is editor-only]" +msgstr "値をピン留ã‚ã™ã‚‹ ['%s' 㯠editor-only ã®ãŸã‚無効]" + msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" @@ -1786,44 +2723,131 @@ msgstr "" msgid "Open Documentation" msgstr "ドã‚ュメントを開ã" +msgid "Element %d: %s%d*" +msgstr "è¦ç´ %d: %s%d*" + msgid "Move Up" msgstr "上ã«ç§»å‹•" msgid "Move Down" msgstr "下ã«ç§»å‹•" +msgid "Insert New Before" +msgstr "空を挿入 (å‰)" + +msgid "Insert New After" +msgstr "空を挿入 (後)" + +msgid "Clear Array" +msgstr "é…列をクリア" + +msgid "Resize Array..." +msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更..." + +msgid "Add Element" +msgstr "è¦ç´ ã‚’è¿½åŠ " + msgid "Resize Array" msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更" +msgid "New Size:" +msgstr "æ–°ã—ã„サイズ:" + +msgid "Element %s" +msgstr "è¦ç´ %s" + +msgid "Add Metadata" +msgstr "ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’è¿½åŠ " + msgid "Set %s" msgstr "%s ã‚’è¨å®š" msgid "Set Multiple:" msgstr "複数è¨å®š:" +msgid "Remove metadata %s" +msgstr "メタデータ %s を削除" + msgid "Pinned %s" msgstr "%s をピン留ã‚" msgid "Unpinned %s" msgstr "%s をピン留ã‚解除" +msgid "Add metadata %s" +msgstr "メタデータ %s ã‚’è¿½åŠ " + +msgid "Metadata name can't be empty." +msgstr "メタデータåを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" + +msgid "Metadata name must be a valid identifier." +msgstr "メタデータåã¯æœ‰åŠ¹ãªè˜åˆ¥åã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" + +msgid "Metadata with name \"%s\" already exists." +msgstr "\"%s\" ã¨ã„ã†åå‰ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¯æ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" + +msgid "Names starting with _ are reserved for editor-only metadata." +msgstr "_ ã§å§‹ã¾ã‚‹åå‰ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼å°‚用ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ç”¨ã«äºˆç´„ã•ã‚Œã¦ã„ã¾ã™ã€‚" + +msgid "Metadata name is valid." +msgstr "メタデータåã¯æœ‰åŠ¹ã§ã™ã€‚" + +msgid "Add Metadata Property for \"%s\"" +msgstr "\"%s\" ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ プãƒãƒ‘ãƒ†ã‚£ã‚’è¿½åŠ " + +msgid "Copy Value" +msgstr "値をコピー" + +msgid "Paste Value" +msgstr "値を貼り付ã‘" + msgid "Copy Property Path" msgstr "プãƒãƒ‘ティã®ãƒ‘スをコピー" +msgid "Select existing layout:" +msgstr "æ—¢å˜ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é¸æŠž:" + +msgid "Changed Locale Language Filter" +msgstr "ãƒã‚±ãƒ¼ãƒ«è¨€èªžãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’変更" + +msgid "Changed Locale Script Filter" +msgstr "ãƒã‚±ãƒ¼ãƒ«ã‚¹ã‚¯ãƒªãƒ—トフィルタを変更" + +msgid "Changed Locale Country Filter" +msgstr "ãƒã‚±ãƒ¼ãƒ«å›½ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’変更" + msgid "Changed Locale Filter Mode" -msgstr "ãƒã‚±ãƒ¼ãƒ«ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã®å¤‰æ›´" +msgstr "ãƒã‚±ãƒ¼ãƒ«ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã‚’変更" + +msgid "Select a Locale" +msgstr "ãƒã‚±ãƒ¼ãƒ«ã‚’é¸æŠž" msgid "Show All Locales" -msgstr "ã™ã¹ã¦ã®è¨€èªžã‚’表示" +msgstr "ã™ã¹ã¦ã®ãƒã‚±ãƒ¼ãƒ«ã‚’表示" msgid "Show Selected Locales Only" msgstr "é¸æŠžã—ãŸè¨€èªžã®ã¿è¡¨ç¤º" +msgid "Edit Filters" +msgstr "フィルターã®ç·¨é›†" + msgid "Language:" msgstr "言語:" -msgid "Script" -msgstr "スクリプト" +msgid "Country:" +msgstr "国:" + +msgid "Language" +msgstr "言語:" + +msgid "Country" +msgstr "国" + +msgid "Variant" +msgstr "ãƒãƒªã‚¢ãƒ³ãƒˆ" + +msgid "Filter Messages" +msgstr "メッセージã§ãƒ•ã‚£ãƒ«ã‚¿" msgid "Clear Output" msgstr "出力をクリア" @@ -1831,6 +2855,29 @@ msgstr "出力をクリア" msgid "Copy Selection" msgstr "é¸æŠžç¯„囲をコピー" +msgid "" +"Collapse duplicate messages into one log entry. Shows number of occurrences." +msgstr "" +"é‡è¤‡ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’1ã¤ã®ãƒã‚°ã‚¨ãƒ³ãƒˆãƒªã«æŠ˜ã‚ŠãŸãŸã¿ã¾ã™ã€‚発生回数を表示ã—ã¾ã™ã€‚" + +msgid "Focus Search/Filter Bar" +msgstr "フォーカス 検索/フィルターãƒãƒ¼" + +msgid "Toggle visibility of standard output messages." +msgstr "標準出力メッセージã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" + +msgid "Toggle visibility of errors." +msgstr "エラーã®è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" + +msgid "Toggle visibility of warnings." +msgstr "è¦å‘Šã®è¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" + +msgid "Toggle visibility of editor messages." +msgstr "エディタメッセージã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" + +msgid "Native Shader Source Inspector" +msgstr "ãƒã‚¤ãƒ†ã‚£ãƒ– シェーダー ソース インスペクター" + msgid "New Window" msgstr "æ–°è¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" @@ -1865,6 +2912,13 @@ msgstr "" "ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ç·¨é›†ã—ãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ãªã„ãŸã‚ä¿å˜ã§ãã¾ã›ã‚“。ã¾ãšãƒ¦ãƒ‹ãƒ¼ã‚¯åŒ–" "ã—ã¦ãã ã•ã„。" +msgid "" +"This resource can't be saved because it was imported from another file. Make " +"it unique first." +msgstr "" +"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯åˆ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸãŸã‚ã€ä¿å˜ã§ãã¾ã›ã‚“。最åˆã«ã" +"れをユニークã«ã—ã¾ã™ã€‚" + msgid "Save Resource As..." msgstr "リソースを別åã§ä¿å˜..." @@ -1877,6 +2931,23 @@ msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã¯ä¸æ˜Žã§ã™:" msgid "Error while saving." msgstr "ä¿å˜ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" +msgid "Can't open file '%s'. The file could have been moved or deleted." +msgstr "" +"'ï¼…s' ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。ファイルãŒç§»å‹•ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾" +"ã™ã€‚" + +msgid "Error while parsing file '%s'." +msgstr "ファイル '%s' ã®è§£æžä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" + +msgid "Scene file '%s' appears to be invalid/corrupt." +msgstr "シーン ファイル '%s' ãŒç„¡åŠ¹ã¾ãŸã¯å£Šã‚Œã¦ã„るよã†ã§ã™ã€‚" + +msgid "Missing file '%s' or one its dependencies." +msgstr "'%s' ã¾ãŸã¯ãã®ä¾å˜é–¢ä¿‚ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" + +msgid "Error while loading file '%s'." +msgstr "ファイル '%s' ã‚’èªã¿è¾¼ã‚“ã§ã„ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" + msgid "Saving Scene" msgstr "シーンをä¿å˜ä¸" @@ -1890,6 +2961,13 @@ msgid "This operation can't be done without a tree root." msgstr "ã“ã®æ“作ã¯ã€ãƒ„リーã®ãƒ«ãƒ¼ãƒˆãªã—ã§å®Ÿè¡Œã§ãã¾ã›ã‚“。" msgid "" +"This scene can't be saved because there is a cyclic instance inclusion.\n" +"Please resolve it and then attempt to save again." +msgstr "" +"ã“ã®ã‚·ãƒ¼ãƒ³ã«ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®å¾ªç’°å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ä¿å˜ã§ãã¾ã›ã‚“。\n" +"ã¾ãšãれを解消ã—ã¦ã‹ã‚‰ã€å†åº¦ä¿å˜ã—ã¦ã¿ã¦ãã ã•ã„。" + +msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" @@ -1933,6 +3011,10 @@ msgstr "レイアウトåãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼" msgid "Restored the Default layout to its base settings." msgstr "既定ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’基本è¨å®šã«æˆ»ã—ã¾ã—ãŸã€‚" +msgid "This object is marked as read-only, so it's not editable." +msgstr "" +"ã“ã®ã‚ªãƒ–ジェクトã¯ã€èªã¿å–り専用ã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ç·¨é›†ã§ãã¾ã›ã‚“。" + msgid "" "This resource belongs to a scene that was imported, so it's not editable.\n" "Please read the documentation relevant to importing scenes to better " @@ -1943,27 +3025,74 @@ msgstr "" "ントをãŠèªã¿ãã ã•ã„。" msgid "" +"This resource belongs to a scene that was instantiated or inherited.\n" +"Changes to it must be made inside the original scene." +msgstr "" +"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã¾ãŸã¯ç¶™æ‰¿ã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã¾ã™ã€‚\n" +"ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã‚’ä¿å˜ã—ã¦ã‚‚ã€å¤‰æ›´å†…容ã¯ä¿æŒã•ã‚Œã¾ã›ã‚“。" + +msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" "ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚‚ã®ã§ã€ç·¨é›†ã§ãã¾ã›ã‚“。インãƒãƒ¼ãƒˆãƒ‘ãƒãƒ«ã§è¨å®š" "を変更ã—ã€å†åº¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。" +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instantiating or inheriting it will allow you to make changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"ã“ã®ã‚·ãƒ¼ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚‚ã®ã§ã€å¤‰æ›´ã¯ä¿æŒã•ã‚Œã¾ã›ã‚“。\n" +"インスタンス化もã—ãã¯ç¶™æ‰¿ã™ã‚‹ã“ã¨ã§ã€ç·¨é›†ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n" +"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒãƒ¼ã‚’よりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«é–¢é€£ã™ã‚‹ãƒ‰ã‚ュ" +"メントをãŠèªã¿ãã ã•ã„。" + msgid "Changes may be lost!" msgstr "変更ãŒå¤±ã‚れるã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ï¼" +msgid "This object is read-only." +msgstr "ã“ã®ã‚ªãƒ–ジェクトã¯ã€èªã¿å–り専用ã§ã™ã€‚" + +msgid "" +"Movie Maker mode is enabled, but no movie file path has been specified.\n" +"A default movie file path can be specified in the project settings under the " +"Editor > Movie Writer category.\n" +"Alternatively, for running single scenes, a `movie_file` string metadata can " +"be added to the root node,\n" +"specifying the path to a movie file that will be used when recording that " +"scene." +msgstr "" +"ムービーメーカーモードã¯æœ‰åŠ¹ã§ã™ãŒã€å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜ãƒ‘スãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›" +"ん。\n" +"デフォルトã®å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜ãƒ‘スã¯ã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šã®ã€ŒEditor > Movie " +"Writerã€ã‚«ãƒ†ã‚´ãƒªã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" +"ã¾ãŸã€å˜ä¸€ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã™ã‚‹å ´åˆã¯ã€ãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ã« `movie_file` æ–‡å—列メタ" +"ãƒ‡ãƒ¼ã‚¿ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚\n" +"ãã®ã‚·ãƒ¼ãƒ³ã‚’録画ã™ã‚‹ã¨ãã«ä½¿ç”¨ã™ã‚‹å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜ãƒ‘スを指定ã—ã¾ã™ã€‚" + msgid "There is no defined scene to run." msgstr "実行ã™ã‚‹ã‚·ãƒ¼ãƒ³ãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“。" msgid "Save scene before running..." msgstr "実行å‰ã«ã‚·ãƒ¼ãƒ³ã‚’ä¿å˜..." +msgid "Could not start subprocess(es)!" +msgstr "サブプãƒã‚»ã‚¹ã‚’開始ã§ãã¾ã›ã‚“ã§ã—ãŸï¼" + +msgid "Reload the played scene." +msgstr "å†ç”Ÿã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã‚’リãƒãƒ¼ãƒ‰" + msgid "Play the project." msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’実行。" msgid "Play the edited scene." msgstr "編集ã—ãŸã‚·ãƒ¼ãƒ³ã‚’実行。" +msgid "Play a custom scene." +msgstr "カスタムシーンを実行" + msgid "Open Base Scene" msgstr "ベースã®ã‚·ãƒ¼ãƒ³ã‚’é–‹ã" @@ -1979,9 +3108,15 @@ msgstr "スクリプトをクイックオープン..." msgid "Save & Reload" msgstr "ä¿å˜ã—ã¦å†èªã¿è¾¼ã¿" +msgid "Save modified resources before reloading?" +msgstr "リãƒãƒ¼ãƒ‰ã™ã‚‹å‰ã«å¤‰æ›´ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ" + msgid "Save & Quit" msgstr "ä¿å˜ã—ã¦çµ‚了" +msgid "Save modified resources before closing?" +msgstr "é–‰ã˜ã‚‹å‰ã«å¤‰æ›´ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ" + msgid "Save changes to '%s' before reloading?" msgstr "å†èªã¿è¾¼ã¿å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ" @@ -2017,12 +3152,30 @@ msgstr "マウスボタンãŒæŠ¼ã•ã‚Œã¦ã„ã‚‹é–“ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。" msgid "Nothing to undo." msgstr "å…ƒã«æˆ»ã™ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。" +msgid "Global Undo: %s" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«å…ƒã«æˆ»ã™: %s" + +msgid "Remote Undo: %s" +msgstr "リモート元ã«æˆ»ã™: %s" + +msgid "Scene Undo: %s" +msgstr "シーン元ã«æˆ»ã™: %s" + msgid "Can't redo while mouse buttons are pressed." msgstr "マウスボタンãŒæŠ¼ã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚„ã‚Šç›´ã›ã¾ã›ã‚“。" msgid "Nothing to redo." msgstr "ã‚„ã‚Šç›´ã™ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。" +msgid "Global Redo: %s" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã‚„ã‚Šç›´ã™: %s" + +msgid "Remote Redo: %s" +msgstr "リモートやり直ã™: %s" + +msgid "Scene Redo: %s" +msgstr "シーンやり直ã™: %s" + msgid "Can't reload a scene that was never saved." msgstr "ä¿å˜ã•ã‚Œã¦ã„ãªã„シーンをèªã¿è¾¼ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“。" @@ -2194,6 +3347,9 @@ msgstr "ビューをパン" msgid "Dock Position" msgstr "ドックã®ä½ç½®" +msgid "Make Floating" +msgstr "フãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚’作æˆ" + msgid "Add a new scene." msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³ã‚’è¿½åŠ ã™ã‚‹ã€‚" @@ -2215,6 +3371,18 @@ msgstr "以å‰ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•ã™ã‚‹ã€‚" msgid "Copy Text" msgstr "テã‚ストをコピー" +msgid "Next Scene Tab" +msgstr "次ã®ã‚·ãƒ¼ãƒ³ã‚¿ãƒ–" + +msgid "Previous Scene Tab" +msgstr "å‰ã®ã‚·ãƒ¼ãƒ³ã‚¿ãƒ–" + +msgid "Focus FileSystem Filter" +msgstr "フォーカス ファイルシステムフィルタ" + +msgid "Command Palette" +msgstr "コマンドパレット" + msgid "New Scene" msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³" @@ -2233,6 +3401,9 @@ msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã‚’é–‹ã" msgid "Save Scene" msgstr "シーンをä¿å˜" +msgid "Export As..." +msgstr "エクスãƒãƒ¼ãƒˆ..." + msgid "MeshLibrary..." msgstr "メッシュライブラリ..." @@ -2248,9 +3419,18 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆ" msgid "Project Settings..." msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®š..." +msgid "Project Settings" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®š" + msgid "Version Control" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«" +msgid "Create Version Control Metadata" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ç”¨ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®ä½œæˆ" + +msgid "Version Control Settings" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†è¨å®š" + msgid "Export..." msgstr "エクスãƒãƒ¼ãƒˆ..." @@ -2260,6 +3440,9 @@ msgstr "Androidビルドテンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«..." msgid "Open User Data Folder" msgstr "ユーザーデータフォルダーを開ã" +msgid "Customize Engine Build Configuration..." +msgstr "エンジンã®ãƒ“ルド構æˆã‚’カスタマイズã™ã‚‹..." + msgid "Tools" msgstr "ツール" @@ -2278,6 +3461,9 @@ msgstr "エディター" msgid "Editor Settings..." msgstr "エディターè¨å®š..." +msgid "Command Palette..." +msgstr "コマンドパレット..." + msgid "Editor Layout" msgstr "エディターレイアウト" @@ -2306,6 +3492,9 @@ msgstr "エディター機能ã®ç®¡ç†..." msgid "Manage Export Templates..." msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†..." +msgid "Configure FBX Importer..." +msgstr "FBX Importerã®è¨å®š..." + msgid "Help" msgstr "ヘルプ" @@ -2333,12 +3522,66 @@ msgstr "Godotã«ã¤ã„ã¦" msgid "Support Godot Development" msgstr "Godotã®é–‹ç™ºã‚’サãƒãƒ¼ãƒˆã™ã‚‹" +msgid "Run the project's default scene." +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚" + msgid "Run Project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’実行" +msgid "Pause the running project's execution for debugging." +msgstr "実行ä¸ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã®å®Ÿè¡Œã‚’一時åœæ¢ã—ã€ãƒ‡ãƒãƒƒã‚°ã‚’è¡Œã„ã¾ã™ã€‚" + +msgid "Pause Running Project" +msgstr "実行ä¸ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’一時åœæ¢" + +msgid "Stop the currently running project." +msgstr "ç¾åœ¨å®Ÿè¡Œä¸ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’åœæ¢ã—ã¾ã™ã€‚" + +msgid "Stop Running Project" +msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®å®Ÿè¡Œã‚’åœæ¢" + +msgid "Run the currently edited scene." +msgstr "ç¾åœ¨ç·¨é›†ä¸ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚" + +msgid "Run Current Scene" +msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã‚’実行" + +msgid "Run a specific scene." +msgstr "特定ã®ã‚·ãƒ¼ãƒ³ã‚’実行ã—ã¾ã™ã€‚" + +msgid "Run Specific Scene" +msgstr "特定ã®ã‚·ãƒ¼ãƒ³ã‚’実行" + +msgid "" +"Enable Movie Maker mode.\n" +"The project will run at stable FPS and the visual and audio output will be " +"recorded to a video file." +msgstr "" +"ムービーメーカーモードを有効ã«ã—ã¾ã™ã€‚\n" +"プãƒã‚¸ã‚§ã‚¯ãƒˆã¯å®‰å®šã—ãŸFPSã§å®Ÿè¡Œã•ã‚Œã€ãƒ“ジュアルã¨ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå‡ºåŠ›ã¯å‹•ç”»ãƒ•ã‚¡ã‚¤ãƒ«" +"ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚" + +msgid "Choose a renderer." +msgstr "レンダラーをé¸æŠž" + +msgid "Forward+" +msgstr "Forward+" + +msgid "Mobile" +msgstr "モãƒã‚¤ãƒ«" + +msgid "Compatibility" +msgstr "互æ›æ€§" + +msgid "Changing the renderer requires restarting the editor." +msgstr "レンダラーを変更ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™ã€‚" + msgid "Update Continuously" msgstr "継続的ã«æ›´æ–°" +msgid "Update When Changed" +msgstr "変更時ã«æ›´æ–°" + msgid "Hide Update Spinner" msgstr "アップデートスピナーをéžè¡¨ç¤º" @@ -2351,6 +3594,9 @@ msgstr "インスペクター" msgid "Node" msgstr "ノード" +msgid "History" +msgstr "å±¥æ´" + msgid "Expand Bottom Panel" msgstr "下パãƒãƒ«ã‚’展開" @@ -2371,22 +3617,8 @@ msgstr "テンプレートã®ç®¡ç†" msgid "Install from file" msgstr "ファイルã‹ã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" -msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"ã“ã®æ“作㯠\"res://android/build\" ã«ã‚½ãƒ¼ã‚¹ãƒ†ãƒ³ãƒ—レートをインストールã—ã€" -"Androidã®ã‚«ã‚¹ã‚¿ãƒ ビルドã®è¨å®šãŒãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚\n" -"後ã‹ã‚‰è¨å®šã«å¤‰æ›´ã‚’åŠ ãˆãŸã‚Šã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆæ™‚ã«ã‚«ã‚¹ã‚¿ãƒ APKをビルドã§ãã¾ã™ (モ" -"ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’è¿½åŠ ã™ã‚‹ã€AndroidManifest.xmlを変更ã™ã‚‹ãªã©)。\n" -"ビルド済ã¿APKã®ä»£ã‚ã‚Šã«ã‚«ã‚¹ã‚¿ãƒ ビルドをã™ã‚‹ãŸã‚ã«ã¯ã€Androidã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆè¨" -"定ã®ã€ŒUse Custom Build (カスタムビルドを使用ã™ã‚‹)ã€ã®ã‚ªãƒ—ションãŒæœ‰åŠ¹åŒ–ã•ã‚Œã¦" -"ã„ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" +msgid "Select Android sources file" +msgstr "Androidã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž" msgid "" "The Android build template is already installed in this project and it won't " @@ -2456,6 +3688,9 @@ msgstr "次ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é–‹ã" msgid "Open the previous Editor" msgstr "å‰ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’é–‹ã" +msgid "Ok" +msgstr "OK" + msgid "Warning!" msgstr "è¦å‘Šï¼" @@ -2480,6 +3715,9 @@ msgstr "プラグインã®ç·¨é›†" msgid "Installed Plugins:" msgstr "インストール済プラグイン:" +msgid "Create New Plugin" +msgstr "æ–°ã—ã„プラグインを作æˆ" + msgid "Version" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" @@ -2495,6 +3733,9 @@ msgstr "テã‚ストを編集:" msgid "On" msgstr "オン" +msgid "Renaming layer %d:" +msgstr "レイヤー %d をリãƒãƒ¼ãƒ :" + msgid "No name provided." msgstr "åå‰ãŒä»˜ã„ã¦ã„ã¾ã›ã‚“。" @@ -2507,12 +3748,45 @@ msgstr "ビット %d, 値 %d" msgid "Rename" msgstr "åå‰ã®å¤‰æ›´" +msgid "Rename layer" +msgstr "レイヤーåを変更" + +msgid "Layer %d" +msgstr "レイヤー %d" + +msgid "No Named Layers" +msgstr "ç„¡åレイヤー" + +msgid "Edit Layer Names" +msgstr "レイヤーåã®ç·¨é›†" + +msgid "<empty>" +msgstr "<空>" + +msgid "Temporary Euler may be changed implicitly!" +msgstr "一時的ãªã‚ªã‚¤ãƒ©ãƒ¼ã¯æš—黙的ã«å¤‰æ›´ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™!" + +msgid "" +"Temporary Euler will not be stored in the object with the original value. " +"Instead, it will be stored as Quaternion with irreversible conversion.\n" +"This is due to the fact that the result of Euler->Quaternion can be " +"determined uniquely, but the result of Quaternion->Euler can be multi-" +"existent." +msgstr "" +"一時的ãªã‚ªã‚¤ãƒ©ãƒ¼ã¯ã€å…ƒã®å€¤ã‚’æŒã¤ã‚ªãƒ–ジェクトã«æ ¼ç´ã•ã‚Œã¾ã›ã‚“。代ã‚ã‚Šã«ã€ä¸å¯" +"逆変æ›ã®ã‚¯ã‚©ãƒ¼ã‚¿ãƒ‹ã‚ªãƒ³ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚\n" +"ã“ã‚Œã¯ã€ã‚ªã‚¤ãƒ©ãƒ¼->四元数ã®çµæžœã¯ä¸€æ„ã«æ±ºå®šã§ãã¾ã™ãŒã€å››å…ƒæ•°->オイラーã®çµæžœ" +"ã¯è¤‡æ•°å˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚" + msgid "Assign..." msgstr "割り当ã¦..." msgid "Invalid RID" msgstr "無効ãªRID" +msgid "Recursion detected, unable to assign resource to property." +msgstr "å†å¸°ãŒæ¤œå‡ºã•ã‚Œã€ãƒªã‚½ãƒ¼ã‚¹ã‚’プãƒãƒ‘ティã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" + msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." @@ -2537,12 +3811,24 @@ msgstr "ビューãƒãƒ¼ãƒˆã‚’é¸ã¶" msgid "Selected node is not a Viewport!" msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¯ãƒ“ューãƒãƒ¼ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ï¼" +msgid "(Nil) %s" +msgstr "(Nil) %s" + +msgid "%s (size %s)" +msgstr "%s (サイズ %s)" + msgid "Size:" msgstr "サイズ:" msgid "Remove Item" msgstr "アイテムを除去" +msgid "Dictionary (Nil)" +msgstr "Dictionary (Nil)" + +msgid "Dictionary (size %d)" +msgstr "Dictionary (サイズ %d)" + msgid "New Key:" msgstr "æ–°è¦ã‚ー:" @@ -2552,6 +3838,15 @@ msgstr "æ–°è¦ã®å€¤:" msgid "Add Key/Value Pair" msgstr "ã‚ー/値ã®ãƒšã‚¢ã‚’è¿½åŠ " +msgid "Localizable String (Nil)" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºå¯èƒ½ãªæ–‡å—列(Nil)" + +msgid "Localizable String (size %d)" +msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºå¯èƒ½ãªæ–‡å—列 (サイズ %d)" + +msgid "Add Translation" +msgstr "ç¿»è¨³ã‚’è¿½åŠ " + msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." @@ -2562,9 +3857,15 @@ msgstr "" msgid "Quick Load" msgstr "クイックãƒãƒ¼ãƒ‰" +msgid "Inspect" +msgstr "検査" + msgid "Make Unique" msgstr "ユニーク化" +msgid "Make Unique (Recursive)" +msgstr "ユニーク化 (å†å¸°çš„)" + msgid "Convert to %s" msgstr "%s ã«å¤‰æ›" @@ -2577,6 +3878,15 @@ msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト" msgid "Extend Script" msgstr "スクリプトを拡張" +msgid "New Shader" +msgstr "æ–°ã—ã„シェーダー" + +msgid "No Remote Debug export presets configured." +msgstr "リモートデãƒãƒƒã‚°ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ—リセットãŒè¨å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。" + +msgid "Remote Debug" +msgstr "リモートデãƒãƒƒã‚°" + msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -2595,6 +3905,18 @@ msgstr "ãƒã‚¸ãƒƒã‚¯ã‚’ _run() メソッドã«è¨˜è¿°ã™ã‚‹ã€‚" msgid "There is an edited scene already." msgstr "ã™ã§ã«ç·¨é›†ã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ãŒã‚ã‚Šã¾ã™ã€‚" +msgid "" +"Couldn't run editor script, did you forget to override the '_run' method?" +msgstr "" +"エディタスクリプトを実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚'_run'メソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹" +"ã®ã‚’忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ" + +msgid "Edit Built-in Action" +msgstr "組ã¿è¾¼ã¿ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ç·¨é›†" + +msgid "Edit Shortcut" +msgstr "ショートカットを編集" + msgid "Common" msgstr "一般" @@ -2604,6 +3926,9 @@ msgstr "エディターè¨å®š" msgid "General" msgstr "一般" +msgid "Filter Settings" +msgstr "フィルターè¨å®š" + msgid "The editor must be restarted for changes to take effect." msgstr "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" @@ -2613,8 +3938,81 @@ msgstr "ショートカット" msgid "Binding" msgstr "ãƒã‚¤ãƒ³ãƒ‰" -msgid "%s Error" -msgstr "%s エラー" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"%s を押ã—ãŸã¾ã¾ã§æ•´æ•°å€¤ã«ä¸¸ã‚る。\n" +"Shiftを押ã—ãŸã¾ã¾ã§ç²¾å¯†èª¿æ•´ã€‚" + +msgid "No notifications." +msgstr "通知ã¯ã‚ã‚Šã¾ã›ã‚“。" + +msgid "Show notifications." +msgstr "通知を見る" + +msgid "Silence the notifications." +msgstr "通知を無効ã«ã™ã‚‹" + +msgid "Left Stick Left, Joystick 0 Left" +msgstr "左スティック å·¦, ジョイスティック 0 å·¦" + +msgid "Left Stick Right, Joystick 0 Right" +msgstr "左スティック å³, ジョイスティック 0 å³" + +msgid "Left Stick Up, Joystick 0 Up" +msgstr "左スティック 上, ジョイスティック 0 上" + +msgid "Left Stick Down, Joystick 0 Down" +msgstr "左スティック 下, ジョイスティック 0 下" + +msgid "Right Stick Left, Joystick 1 Left" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ å·¦, ジョイスティック 1 å·¦" + +msgid "Right Stick Right, Joystick 1 Right" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ å³, ジョイスティック 1 å³" + +msgid "Right Stick Up, Joystick 1 Up" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ 上, ジョイスティック 1 上" + +msgid "Right Stick Down, Joystick 1 Down" +msgstr "å³ã‚¹ãƒ†ã‚£ãƒƒã‚¯ 下, ジョイスティック 1 下" + +msgid "Joystick 2 Left" +msgstr "ジョイスティック 2 å·¦" + +msgid "Left Trigger, Sony L2, Xbox LT, Joystick 2 Right" +msgstr "左トリガー, ソニー L2, Xbox LT, ジョイスティック 2 å³" + +msgid "Joystick 2 Up" +msgstr "ジョイスティック 2 上" + +msgid "Right Trigger, Sony R2, Xbox RT, Joystick 2 Down" +msgstr "å³ãƒˆãƒªã‚¬ãƒ¼, ソニー R2, Xbox RT, ジョイスティック 2 下" + +msgid "Joystick 3 Left" +msgstr "ジョイスティック 3 å·¦" + +msgid "Joystick 3 Right" +msgstr "ジョイスティック 3 å³" + +msgid "Joystick 3 Up" +msgstr "ジョイスティック 3 上" + +msgid "Joystick 3 Down" +msgstr "ジョイスティック 3 下" + +msgid "Joystick 4 Left" +msgstr "ジョイスティック 4 å·¦" + +msgid "Joystick 4 Right" +msgstr "ジョイスティック 4 å³" + +msgid "Joystick 4 Up" +msgstr "ジョイスティック 4 上" + +msgid "Joystick 4 Down" +msgstr "ジョイスティック 4 下" msgid "All Devices" msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹" @@ -2622,6 +4020,12 @@ msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹" msgid "Device" msgstr "デãƒã‚¤ã‚¹" +msgid "Listening for input..." +msgstr "入力を確èªã—ã¦ã„ã¾ã™..." + +msgid "Filter by event..." +msgstr "イベントã§ãƒ•ã‚£ãƒ«ã‚¿..." + msgid "Project export for platform:" msgstr "次ã®ãƒ—ラットフォームå‘ã‘ã«ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エクスãƒãƒ¼ãƒˆ:" @@ -2661,6 +4065,15 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’エクスãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã— msgid "Can't open file to read from path \"%s\"." msgstr "èªã¿è¾¼ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’パス \"%s\" ã‹ã‚‰é–‹ã‘ã¾ã›ã‚“。" +msgid "Can't open executable file from path \"%s\"." +msgstr "パス \"%s\" ã‹ã‚‰å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ã¾ã›ã‚“。" + +msgid "Can't create encrypted file." +msgstr "æš—å·åŒ–ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã§ãã¾ã›ã‚“。" + +msgid "Can't open encrypted file to write." +msgstr "æš—å·åŒ–ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ã¦æ›¸ã込むã“ã¨ãŒã§ãã¾ã›ã‚“。" + msgid "Save ZIP" msgstr "ZIPã‚’ä¿å˜" @@ -2784,6 +4197,9 @@ msgstr "ダウンãƒãƒ¼ãƒ‰ä¸" msgid "Connection Error" msgstr "接続エラー" +msgid "TLS Handshake Error" +msgstr "TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼" + msgid "Can't open the export templates file." msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レート ファイルを開ã‘ã¾ã›ã‚“。" @@ -2888,6 +4304,9 @@ msgstr "" msgid "Runnable" msgstr "実行å¯èƒ½" +msgid "Export the project for all the presets defined." +msgstr "定義ã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ—リセットã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚" + msgid "All presets must have an export path defined for Export All to work." msgstr "" "å…¨ã¦ã®ãƒ—リセットã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå…¨ã¦æ©Ÿèƒ½ã™ã‚‹ãŸã‚ã«ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スを定義ã™" @@ -2896,6 +4315,9 @@ msgstr "" msgid "Delete preset '%s'?" msgstr "プリセット '%s' を削除ã—ã¾ã™ã‹ï¼Ÿ" +msgid "%s Export" +msgstr "%s エクスãƒãƒ¼ãƒˆ" + msgid "Release" msgstr "リリース" @@ -2938,12 +4360,28 @@ msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³(ã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ã msgid "Export selected resources (and dependencies)" msgstr "é¸æŠžã—ãŸãƒªã‚½ãƒ¼ã‚¹(ã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ãƒˆ" +msgid "Export all resources in the project except resources checked below" +msgstr "" +"以下ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オンã«ã—ãŸãƒªã‚½ãƒ¼ã‚¹ã‚’除ãã€ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒª" +"ソースをエクスãƒãƒ¼ãƒˆ" + +msgid "Export as dedicated server" +msgstr "専用サーãƒãƒ¼ã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" + msgid "Export Mode:" msgstr "エクスãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰:" msgid "Resources to export:" msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹:" +msgid "" +"\"Strip Visuals\" will replace the following resources with placeholders:" +msgstr "" +"\"ストリップビジュアル\" ã¯ã€æ¬¡ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’プレースホルダーã«ç½®ãæ›ãˆã¾ã™:" + +msgid "Strip Visuals" +msgstr "ストリップビジュアル" + msgid "Keep" msgstr "ä¿æŒ" @@ -2970,9 +4408,35 @@ msgstr "カスタム(コンマ区切り):" msgid "Feature List:" msgstr "機能一覧:" +msgid "Encryption" +msgstr "æš—å·åŒ–" + +msgid "Encrypt Exported PCK" +msgstr "エクスãƒãƒ¼ãƒˆã•ã‚ŒãŸPCKã®æš—å·åŒ–" + +msgid "Encrypt Index (File Names and Info)" +msgstr "æš—å·åŒ–インデックス(ファイルåã¨æƒ…å ±ï¼‰" + +msgid "" +"Filters to include files/folders\n" +"(comma-separated, e.g: *.tscn, *.tres, scenes/*)" +msgstr "" +"ファイル/フォルダーをå«ã‚ã‚‹ãŸã‚ã®ãƒ•ã‚£ãƒ«ã‚¿\n" +"(カンマ区切りã€ä¾‹: *.tscn, *.tres, scenes/*)" + +msgid "" +"Filters to exclude files/folders\n" +"(comma-separated, e.g: *.ctex, *.import, music/*)" +msgstr "" +"ファイル/フォルダーを除外ã™ã‚‹ãŸã‚ã®ãƒ•ã‚£ãƒ«ã‚¿\n" +"(カンマ区切りã€ä¾‹: *.ctex, *.import, music/*)" + msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" msgstr "無効ãªæš—å·åŒ–ã‚ー (16進数ã§64æ–‡å—ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™)" +msgid "Encryption Key (256-bits as hexadecimal):" +msgstr "æš—å·åŒ–ã‚ー (16 進数㧠256 ビット):" + msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." @@ -2983,6 +4447,9 @@ msgstr "" msgid "More Info..." msgstr "è©³ç´°æƒ…å ±..." +msgid "Export PCK/ZIP..." +msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..." + msgid "Export Project..." msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ..." @@ -3013,9 +4480,39 @@ msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†" msgid "Export With Debug" msgstr "デãƒãƒƒã‚°ä»˜ãエクスãƒãƒ¼ãƒˆ" +msgid "Path to FBX2glTF executable is empty." +msgstr "FBX2glTFã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘スãŒç©ºã§ã™ã€‚" + +msgid "Path to FBX2glTF executable is invalid." +msgstr "FBX2glTF 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘スãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Error executing this file (wrong version or architecture)." +msgstr "" +"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å®Ÿè¡Œã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ˆãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¾ãŸã¯ã‚¢ãƒ¼ã‚テクãƒãƒ£ãŒæ£" +"ã—ãã‚ã‚Šã¾ã›ã‚“)。" + +msgid "FBX2glTF executable is valid." +msgstr "FBX2glTFã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ‰åŠ¹ã§ã™ã€‚" + +msgid "Configure FBX Importer" +msgstr "FBXインãƒãƒ¼ã‚¿ãƒ¼ã®è¨å®š" + +msgid "" +"FBX2glTF is required for importing FBX files.\n" +"Please download it and provide a valid path to the binary:" +msgstr "" +"FBX2glTFã¯ã€FBXファイルをインãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«å¿…è¦ã§ã™ã€‚\n" +"ダウンãƒãƒ¼ãƒ‰ã—ã€ãƒã‚¤ãƒŠãƒªã¸ã®æœ‰åŠ¹ãªãƒ‘スを指定ã—ã¦ãã ã•ã„。" + +msgid "Click this link to download FBX2glTF" +msgstr "FBX2glTFをダウンãƒãƒ¼ãƒ‰ã™ã‚‹ã«ã¯ã€ã“ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„" + msgid "Browse" msgstr "å‚ç…§" +msgid "Confirm Path" +msgstr "パスã®ç¢ºèª" + msgid "Favorites" msgstr "ãŠæ°—ã«å…¥ã‚Š" @@ -3042,6 +4539,12 @@ msgstr "移動ä¸ã®ã‚¨ãƒ©ãƒ¼:" msgid "Error duplicating:" msgstr "複製エラー:" +msgid "Failed to save resource at %s: %s" +msgstr "%s ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +msgid "Failed to load resource at %s: %s" +msgstr "%s ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + msgid "Unable to update dependencies:" msgstr "ä¾å˜é–¢ä¿‚ã‚’æ›´æ–°ã§ãã¾ã›ã‚“:" @@ -3096,6 +4599,9 @@ msgstr "æ–°ã—ã„継承シーン" msgid "Set As Main Scene" msgstr "メインシーンã¨ã—ã¦è¨å®š" +msgid "Instantiate" +msgstr "インスタンス化" + msgid "Add to Favorites" msgstr "ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ " @@ -3111,6 +4617,21 @@ msgstr "オーナーを見る..." msgid "Move To..." msgstr "移動..." +msgid "Folder..." +msgstr "フォルダー..." + +msgid "Scene..." +msgstr "シーン..." + +msgid "Script..." +msgstr "スクリプト..." + +msgid "Resource..." +msgstr "リソース..." + +msgid "TextFile..." +msgstr "テã‚ストファイル..." + msgid "New Scene..." msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³..." @@ -3120,6 +4641,12 @@ msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト..." msgid "New Resource..." msgstr "æ–°è¦ãƒªã‚½ãƒ¼ã‚¹..." +msgid "New TextFile..." +msgstr "æ–°è¦ãƒ†ã‚ストファイル..." + +msgid "Sort Files" +msgstr "ファイルã®ä¸¦ã³æ›¿ãˆ" + msgid "Sort by Name (Ascending)" msgstr "åå‰ (æ˜‡é †) ã§ä¸¦ã³æ›¿ãˆ" @@ -3138,18 +4665,33 @@ msgstr "更新日時ãŒæ–°ã—ã„é †ã§ä¸¦ã³æ›¿ãˆ" msgid "Sort by First Modified" msgstr "更新日時ãŒå¤ã„é †ã§ä¸¦ã³æ›¿ãˆ" +msgid "Copy UID" +msgstr "UIDをコピー" + msgid "Duplicate..." msgstr "複製..." msgid "Rename..." msgstr "åå‰ã‚’変更..." +msgid "Open in External Program" +msgstr "外部プãƒã‚°ãƒ©ãƒ ã§é–‹ã" + +msgid "Go to previous selected folder/file." +msgstr "å‰ã«é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€/ファイルã«ç§»å‹•ã—ã¾ã™ã€‚" + +msgid "Go to next selected folder/file." +msgstr "次ã«é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€/ファイルã«ç§»å‹•ã—ã¾ã™ã€‚" + msgid "Re-Scan Filesystem" msgstr "ファイルシステムをå†ã‚¹ã‚ャン" msgid "Toggle Split Mode" msgstr "分割モード切り替ãˆ" +msgid "Filter Files" +msgstr "ファイルをフィルタ" + msgid "" "Scanning Files,\n" "Please Wait..." @@ -3196,9 +4738,21 @@ msgstr "ç½®æ›..." msgid "Replace in Files" msgstr "複数ファイル内ã§ç½®æ›" +msgid "Replace all (no undo)" +msgstr "ã™ã¹ã¦ç½®æ›ï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰" + msgid "Searching..." msgstr "検索ä¸..." +msgid "%d match in %d file" +msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)" + +msgid "%d matches in %d file" +msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)" + +msgid "%d matches in %d files" +msgstr "%d 件ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—㟠(%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…)" + msgid "Add to Group" msgstr "グループã«è¿½åŠ " @@ -3235,12 +4789,158 @@ msgstr "グループエディター" msgid "Manage Groups" msgstr "グループã®ç®¡ç†" +msgid "The Beginning" +msgstr "ã¯ã˜ã¾ã‚Š" + +msgid "Global" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«" + +msgid "Audio Stream Importer: %s" +msgstr "オーディオ ストリームインãƒãƒ¼ã‚¿ãƒ¼: %s" + msgid "Reimport" msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" +msgid "Enable looping." +msgstr "ループを有効化" + msgid "Offset:" msgstr "オフセット:" +msgid "" +"Loop offset (from beginning). Note that if BPM is set, this setting will be " +"ignored." +msgstr "" +"ループã®ã‚ªãƒ•ã‚»ãƒƒãƒˆï¼ˆå…ˆé ã‹ã‚‰ï¼‰ã€‚BPMãŒè¨å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®è¨å®šã¯ç„¡è¦–ã•ã‚Œã¾" +"ã™ã®ã§ã”注æ„ãã ã•ã„。" + +msgid "Loop:" +msgstr "ループ:" + +msgid "BPM:" +msgstr "BPM:" + +msgid "" +"Configure the Beats Per Measure (tempo) used for the interactive streams.\n" +"This is required in order to configure beat information." +msgstr "" +"インタラクティブストリームã«ä½¿ç”¨ã™ã‚‹Beats Per Measure(テンãƒï¼‰ã‚’è¨å®šã—ã¾" +"ã™ã€‚\n" +"ã“ã‚Œã¯ã€ãƒ“ãƒ¼ãƒˆæƒ…å ±ã‚’è¨å®šã™ã‚‹ãŸã‚ã«å¿…è¦ã§ã™ã€‚" + +msgid "Beat Count:" +msgstr "ビート数:" + +msgid "" +"Configure the amount of Beats used for music-aware looping. If zero, it will " +"be autodetected from the length.\n" +"It is recommended to set this value (either manually or by clicking on a " +"beat number in the preview) to ensure looping works properly." +msgstr "" +"音楽を考慮ã—ãŸãƒ«ãƒ¼ãƒ—å†ç”Ÿã«ä½¿ç”¨ã™ã‚‹Beatsã®é‡ã‚’è¨å®šã—ã¾ã™ã€‚0ã®å ´åˆã€é•·ã•ã‹ã‚‰è‡ª" +"動検出ã•ã‚Œã¾ã™ã€‚\n" +"ループå†ç”ŸãŒæ£ã—ã機能ã™ã‚‹ã‚ˆã†ã«ã€ã“ã®å€¤ã‚’è¨å®šã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ï¼ˆæ‰‹å‹•ã¾" +"ãŸã¯ãƒ—レビューã§ãƒ“ート番å·ã‚’クリック)" + +msgid "Bar Beats:" +msgstr "å°ç¯€ã‚ãŸã‚Šã®æ‹æ•°:" + +msgid "" +"Configure the Beats Per Bar. This used for music-aware transitions between " +"AudioStreams." +msgstr "" +"Beats Per Bar ã‚’è¨å®šã—ã¾ã™ã€‚AudioStreamé–“ã®éŸ³æ¥½ã‚’考慮ã—ãŸãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã«ä½¿ç”¨" +"ã•ã‚Œã¾ã™ã€‚" + +msgid "Music Playback:" +msgstr "音楽ã®å†ç”Ÿè¨å®š:" + +msgid "New Configuration" +msgstr "æ–°ã—ã„構æˆ" + +msgid "Remove Variation" +msgstr "ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’削除" + +msgid "" +"Warning: There are no configurations specified, no glyphs will be pre-" +"rendered." +msgstr "è¦å‘Š: 構æˆãŒæŒ‡å®šã•ã‚Œã¦ãŠã‚‰ãšã€ã‚°ãƒªãƒ•ã¯äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã¾ã›ã‚“。" + +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "è¦å‘Š: 複数ã®æ§‹æˆã®è¨å®šã¯åŒã˜ã§ã™ã€‚é‡è¤‡ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚" + +msgid "" +"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-" +"rendered for all supported subpixel layouts (5x)." +msgstr "" +"注: LCD サブピクセル アンãƒã‚¨ã‚¤ãƒªã‚¢ã‚·ãƒ³ã‚°ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€å„グリフã¯ã‚µ" +"ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ã‚µãƒ–ピクセル レイアウト(5x)ã«å¯¾ã—ã¦äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°" +"ã•ã‚Œã¾ã™ã€‚" + +msgid "" +"Note: Subpixel positioning is selected, each of the glyphs might be pre-" +"rendered for multiple subpixel offsets (up to 4x)." +msgstr "" +"注: サブピクセルã®é…ç½®ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€å„グリフã¯è¤‡æ•°ã®ã‚µãƒ–ピクセル オフ" +"セット(最大 4 å€)ã«å¯¾ã—ã¦äº‹å‰ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚" + +msgid "Advanced Import Settings for '%s'" +msgstr "'%s' ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã®è©³ç´°è¨å®š" + +msgid "Rendering Options" +msgstr "レンダリング オプション" + +msgid "Select font rendering options, fallback font, and metadata override:" +msgstr "" +"フォントレンダリングオプションã€ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ•ã‚©ãƒ³ãƒˆã€ãŠã‚ˆã³ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚ªãƒ¼" +"ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã‚’é¸æŠžã—ã¾ã™ã€‚" + +msgid "Pre-render Configurations" +msgstr "プリレンダーã®æ§‹æˆ" + +msgid "" +"Add font size, and variation coordinates, and select glyphs to pre-render:" +msgstr "" +"フォントサイズã€ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³åº§æ¨™ã‚’è¿½åŠ ã—ã€ãƒ—リレンダリングã™ã‚‹ã‚°ãƒªãƒ•ã‚’é¸æŠž" +"ã—ã¾ã™ã€‚" + +msgid "Configuration:" +msgstr "構æˆ:" + +msgid "Add configuration" +msgstr "構æˆã‚’è¿½åŠ " + +msgid "Clear Glyph List" +msgstr "グリフ リストをクリア" + +msgid "Glyphs from the Translations" +msgstr "翻訳ã‹ã‚‰ã®ã‚°ãƒªãƒ•" + +msgid "Select translations to add all required glyphs to pre-render list:" +msgstr "" +"翻訳をé¸æŠžã™ã‚‹ã¨ã€å¿…è¦ãªã‚°ãƒªãƒ•ãŒã™ã¹ã¦ãƒ—リレンダーリストã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚" + +msgid "Shape all Strings in the Translations and Add Glyphs" +msgstr "翻訳文ã®æ–‡å—列をã™ã¹ã¦ã‚·ã‚§ã‚¤ãƒ—ã—ã€ã‚°ãƒªãƒ•ã‚’è¿½åŠ ã™ã‚‹" + +msgid "Glyphs from the Text" +msgstr "テã‚ストã‹ã‚‰ã‚°ãƒªãƒ•" + +msgid "" +"Enter a text and select OpenType features to shape and add all required " +"glyphs to pre-render list:" +msgstr "" +"テã‚ストを入力ã—ã€OpenType フィーãƒãƒ£ã‚’é¸æŠžã—ã¦ã‚·ã‚§ã‚¤ãƒ—ã—ã€å¿…è¦ãªã™ã¹ã¦ã®ã‚°ãƒª" +"フをプリレンダリング リストã«è¿½åŠ ã—ã¾ã™ã€‚" + +msgid "Shape Text and Add Glyphs" +msgstr "テã‚ストã®ã‚·ã‚§ã‚¤ãƒ—ã¨ã‚°ãƒªãƒ•ã‚’è¿½åŠ " + +msgid "Glyphs from the Character Map" +msgstr "æ–‡å—コード表ã®ã‚°ãƒªãƒ•" + msgid "Importing Scene..." msgstr "シーンをインãƒãƒ¼ãƒˆä¸..." @@ -3276,12 +4976,25 @@ msgstr "2D" msgid "3D" msgstr "3D" +msgid "Error opening scene" +msgstr "シーンを開ãéš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +msgid "Set paths to save animations as resource files on Reimport" +msgstr "" +"å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’リソース ファイルã¨ã—ã¦ä¿å˜ã™ã‚‹ãƒ‘スをè¨å®š" + +msgid "Actions..." +msgstr "æ“作..." + msgid "Meshes" msgstr "メッシュ" msgid "Materials" msgstr "マテリアル" +msgid "Save Extension:" +msgstr "æ‹¡å¼µåã‚’ä¿å˜:" + msgid "Select Importer" msgstr "インãƒãƒ¼ã‚¿ãƒ¼ã‚’é¸æŠž" @@ -3317,6 +5030,9 @@ msgstr "åå‰ã‚’付ã‘ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:" msgid "Preset" msgstr "プリセット" +msgid "Advanced..." +msgstr "高度ãªè¨å®š..." + msgid "Save Scenes, Re-Import, and Restart" msgstr "シーンをä¿å˜ã—ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã‹ã‚‰ã€å†èµ·å‹•ã—ã¾ã™" @@ -3435,9 +5151,15 @@ msgstr "ãƒã‚±ãƒ¼ãƒ«ã«å¾“ã„å†ãƒžãƒƒãƒ—:" msgid "Locale" msgstr "ãƒã‚±ãƒ¼ãƒ«" +msgid "Set %s on %d nodes" +msgstr "%d ノード㫠%s ã‚’è¨å®š" + msgid "Select a single node to edit its signals and groups." msgstr "ノードを1ã¤é¸æŠžã—ã¦ã‚·ã‚°ãƒŠãƒ«ã¨ã‚°ãƒ«ãƒ¼ãƒ—を編集ã—ã¾ã™ã€‚" +msgid "Subfolder name is not a valid folder name." +msgstr "サブフォルダåã¯æœ‰åŠ¹ãªãƒ•ã‚©ãƒ«ãƒ€åã§ã¯ã‚ã‚Šã¾ã›ã‚“。" + msgid "Edit a Plugin" msgstr "プラグインã®ç·¨é›†" @@ -3542,6 +5264,12 @@ msgstr "点をé¸æŠžã—ã¦ç§»å‹•ã—ã€å³ã‚¯ãƒªãƒƒã‚¯ã§ç‚¹ã‚’作æˆã—ã¾ã™ã€‚ msgid "Enable snap and show grid." msgstr "スナップã¨ã‚°ãƒªãƒƒãƒ‰ã®è¡¨ç¤ºã‚’有効ã«ã™ã‚‹ã€‚" +msgid "Sync:" +msgstr "åŒæœŸ:" + +msgid "Blend:" +msgstr "ブレンド:" + msgid "Point" msgstr "点" @@ -3584,15 +5312,9 @@ msgstr "点ã¨ä¸‰è§’形を消ã™ã€‚" msgid "Generate blend triangles automatically (instead of manually)" msgstr "自動的ã«ãƒ–レンド三角形を生æˆ" -msgid "Blend:" -msgstr "ブレンド:" - msgid "Parameter Changed:" msgstr "パラメーターãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ:" -msgid "Edit Filters" -msgstr "フィルターã®ç·¨é›†" - msgid "Output node can't be added to the blend tree." msgstr "出力ノードをブレンドツリーã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" @@ -3660,9 +5382,21 @@ msgstr "ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ ..." msgid "Enable Filtering" msgstr "フィルタリングを有効化" +msgid "Library Name:" +msgstr "ライブラリå:" + +msgid "Animation name can't be empty." +msgstr "アニメーションåを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" + msgid "Load Animation" msgstr "アニメーションèªã¿è¾¼ã¿" +msgid "Invalid AnimationLibrary file." +msgstr "無効㪠AnimationLibrary ファイルã§ã™ã€‚" + +msgid "Invalid Animation file." +msgstr "無効ãªAnimationファイルã§ã™ã€‚" + msgid "Animation Name:" msgstr "アニメーションå:" @@ -3672,6 +5406,18 @@ msgstr "貼り付ã‘ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" msgid "Open in Inspector" msgstr "インスペクターã§é–‹ã" +msgid "Paste Animation to Library from clipboard" +msgstr "Animationをクリップボードã‹ã‚‰ãƒ©ã‚¤ãƒ–ラリã«è²¼ã‚Šä»˜ã‘" + +msgid "Save animation library to resource on disk" +msgstr "アニメーション ライブラリをディスク上ã®ãƒªã‚½ãƒ¼ã‚¹ã«ä¿å˜" + +msgid "Copy animation to clipboard" +msgstr "クリップボードã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’コピー" + +msgid "Save animation to resource on disk" +msgstr "アニメーションをディスク上ã®ãƒªã‚½ãƒ¼ã‚¹ã«ä¿å˜" + msgid "Storage" msgstr "ストレージ" @@ -3705,15 +5451,15 @@ msgstr "次ã®å¤‰æ›´ã‚’ブレンド" msgid "Change Blend Time" msgstr "ブレンド時間ã®å¤‰æ›´" +msgid "Duplicated Animation Name:" +msgstr "複製ã•ã‚ŒãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å:" + msgid "Play selected animation backwards from current pos. (A)" msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "アニメーションã®å†ç”Ÿã‚’åœæ¢ã™ã‚‹ã€‚(S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(Shift+D)" @@ -3732,6 +5478,9 @@ msgstr "アニメーションツール" msgid "Animation" msgstr "アニメーション" +msgid "Manage Animations..." +msgstr "アニメーションã®ç®¡ç†..." + msgid "Edit Transitions..." msgstr "トランジションã®ç·¨é›†..." @@ -4103,6 +5852,15 @@ msgstr "グループ化済ã¿" msgid "Add Node Here" msgstr "ã“ã“ã«ãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ " +msgid "Moving:" +msgstr "移動:" + +msgid "Rotating:" +msgstr "回転:" + +msgid "Scaling:" +msgstr "スケール:" + msgid "" "Project Camera Override\n" "Overrides the running project's camera with the editor viewport camera." @@ -4595,6 +6353,9 @@ msgstr "" "リモートã®ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ä½¿ç”¨ã™ã‚‹å ´åˆã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã®ã‚ªãƒ—ション" "も有効ã§ã‚ã‚Œã°ã‚ˆã‚ŠåŠ¹çŽ‡çš„ã«ãªã‚Šã¾ã™ã€‚" +msgid " - Variation" +msgstr " - ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³" + msgid "Convert to CPUParticles2D" msgstr "CPUParticles2D ã«å¤‰æ›" @@ -4634,12 +6395,21 @@ msgstr "サーフェスãƒã‚¤ãƒ³ãƒˆï¼‹Normal(指å‘性)" msgid "Volume" msgstr "ボリューム" +msgid "Emission Source:" +msgstr "放出æº:" + msgid "Generate Visibility AABB" msgstr "å¯è¦–性ã®AABBを生æˆ" msgid "Gradient Edited" msgstr "グラデーション編集" +msgid "Swap GradientTexture2D Fill Points" +msgstr "GradientTexture2D å¡—ã‚Šãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" + +msgid "Swap Gradient Fill Points" +msgstr "Gradient ã®å¡—ã‚Šã¤ã¶ã—ãƒã‚¤ãƒ³ãƒˆã‚’入れ替ãˆ" + msgid "Toggle Grid Snap" msgstr "グリッドスナップã®åˆ‡ã‚Šæ›¿ãˆ" @@ -4720,6 +6490,18 @@ msgstr "デãƒãƒƒã‚°ã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ãŒã‚ã‚Šã¾ã›ã‚“。" msgid "Mesh has no UV in layer %d." msgstr "メッシュã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ %dã«UVãŒã‚ã‚Šã¾ã›ã‚“。" +msgid "MeshInstance3D lacks a Mesh." +msgstr "MeshInstanceã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒã‚ã‚Šã¾ã›ã‚“。" + +msgid "Mesh has no surface to create outlines from." +msgstr "メッシュã«ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’作æˆã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ•ã‚§ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。" + +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES." +msgstr "メッシュã®ãƒ—リミティブ型㌠PRIMITIVE_TRIANGLES ã§ã¯ã‚ã‚Šã¾ã›ã‚“。" + +msgid "Could not create outline." +msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" + msgid "Create Outline" msgstr "アウトラインを生æˆ" @@ -4927,12 +6709,6 @@ msgstr "Notifierã®AABBを変更" msgid "Change Particles AABB" msgstr "パーティクルã®AABBを変更" -msgid "Change Box Shape Extents" -msgstr "ボックスシェイプã®ç¯„囲を変更" - -msgid "Change Probe Extents" -msgstr "プãƒãƒ¼ãƒ–ã®ç¯„囲を変更" - msgid "Change Capsule Shape Radius" msgstr "カプセルシェイプã®åŠå¾„を変更" @@ -5011,6 +6787,9 @@ msgstr "ã‚ーã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™(ã‚ーã¯æŒ¿å…¥ã•ã‚Œã¦ã„ã¾ã›ã‚ msgid "Animation Key Inserted." msgstr "アニメーションã‚ーãŒæŒ¿å…¥ã•ã‚Œã¾ã—ãŸã€‚" +msgid "Objects: %d\n" +msgstr "オブジェクトID\n" + msgid "Top View." msgstr "上é¢å›³ã€‚" @@ -5044,6 +6823,9 @@ msgstr "回転" msgid "Translate" msgstr "移動" +msgid "Translating:" +msgstr "ä½ç½®ã®å¤‰æ›´:" + msgid "Rotating %s degrees." msgstr "%s 度回転。" @@ -5068,6 +6850,9 @@ msgstr "シェーディングãªã—ã§è¡¨ç¤º" msgid "Shadow Atlas" msgstr "シャドウアトラス" +msgid "Display Advanced..." +msgstr "詳細ãªè¡¨ç¤ºè¨å®š..." + msgid "View Environment" msgstr "環境を表示" @@ -5147,6 +6932,9 @@ msgstr "ノードをフãƒã‚¢ã«ã‚¹ãƒŠãƒƒãƒ—" msgid "Couldn't find a solid floor to snap the selection to." msgstr "é¸æŠžå¯¾è±¡ã‚’スナップã•ã›ã‚‹å‰›ä½“ã®åºŠã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "Preview disabled." +msgstr "プレビューã¯ç„¡åŠ¹ã§ã™ã€‚" + msgid "Use Local Space" msgstr "ãƒãƒ¼ã‚«ãƒ«ç©ºé–“を使用" @@ -5737,6 +7525,9 @@ msgstr "標準" msgid "Connections to method:" msgstr "メソッドã¸ã®æŽ¥ç¶š:" +msgid "Source" +msgstr "ソース" + msgid "Target" msgstr "ターゲット" @@ -5859,6 +7650,9 @@ msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•" msgid "Go to Previous Breakpoint" msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•" +msgid "Save File As" +msgstr "åå‰ã‚’付ã‘ã¦ä¿å˜" + msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "ã“ã®skeletonã«ã¯ãƒœãƒ¼ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“。åBone2DãƒŽãƒ¼ãƒ‰ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。" @@ -5880,6 +7674,9 @@ msgstr "レストãƒãƒ¼ã‚ºã‚’上書ã" msgid "Create physical bones" msgstr "物ç†ãƒœãƒ¼ãƒ³ã‚’作æˆã™ã‚‹" +msgid "Export Skeleton Profile As..." +msgstr "スケルトンプãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’エクスãƒãƒ¼ãƒˆ..." + msgid "Play IK" msgstr "IKã‚’å†ç”Ÿ" @@ -5901,6 +7698,9 @@ msgstr "LightOccluder2Dを作æˆ" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D プレビュー" +msgid "Can't convert a Sprite2D from a foreign scene." +msgstr "外部シーンã‹ã‚‰ Sprite2D を変æ›ã§ãã¾ã›ã‚“。" + msgid "Can't convert a sprite using animation frames to mesh." msgstr "アニメーションフレームを使用ã—ã¦ã‚¹ãƒ—ライトをメッシュã«å¤‰æ›ã§ãã¾ã›ã‚“。" @@ -5928,6 +7728,9 @@ msgstr "ジオメトリãŒç„¡åŠ¹ã§ã™ã€‚ライトオクールダーを作æˆã§ msgid "Create LightOccluder2D Sibling" msgstr "LightOccluder2Dã®å…„弟を作æˆ" +msgid "Simplification:" +msgstr "簡略化:" + msgid "Shrink (Pixels):" msgstr "ç¸®å° (ピクセル):" @@ -5979,15 +7782,15 @@ msgstr "(空)" msgid "Animations:" msgstr "アニメーション:" -msgid "Speed:" -msgstr "速度:" - -msgid "Loop" -msgstr "ループ" +msgid "Delete Animation" +msgstr "アニメーションを削除ã—ã¾ã™ã‹ï¼Ÿ" msgid "Animation Frames:" msgstr "アニメーション フレーム:" +msgid "Frame Duration:" +msgstr "フレームæŒç¶šæ™‚é–“:" + msgid "Zoom Reset" msgstr "ズームをリセット" @@ -6036,21 +7839,41 @@ msgstr "ステップ:" msgid "Styleboxes" msgstr "StyleBox" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "{num}色" + msgid "No colors found." msgstr "カラーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "[num] 定数" + msgid "No constants found." msgstr "定数ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" msgid "No fonts found." msgstr "フォントãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "[num] フォントサイズ" + msgid "No icons found." msgstr "アイコンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "[num] StyleBox" + msgid "No styleboxes found." msgstr "StyleBoxãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" +msgid "{num} currently selected" +msgid_plural "{num} currently selected" +msgstr[0] "{num} 個 é¸æŠžä¸" + msgid "Nothing was selected for the import." msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ã‚‚ã®ãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。" @@ -6190,6 +8013,9 @@ msgstr "" "ã“ã®ãƒ†ãƒ¼ãƒžã‚¿ã‚¤ãƒ—ã¯ç©ºã§ã™ã€‚\n" "手動もã—ãã¯ä»–ã®ãƒ†ãƒ¼ãƒžã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。" +msgid "Remove Data Type Items From Theme" +msgstr "テーマã‹ã‚‰ãƒ‡ãƒ¼ã‚¿åž‹ã‚¢ã‚¤ãƒ†ãƒ を除去" + msgid "Add Color Item" msgstr "カラーアイテムã®è¿½åŠ " @@ -6317,9 +8143,15 @@ msgstr "アイテムã®ã‚¿ã‚¤ãƒ—ã‚’è¿½åŠ " msgid "Add Type" msgstr "ã‚¿ã‚¤ãƒ—ã‚’è¿½åŠ " +msgid "Override All Default Theme Items" +msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ†ãƒ¼ãƒžã‚¢ã‚¤ãƒ†ãƒ を上書ã" + msgid "Set Base Type" msgstr "基底型をè¨å®š" +msgid "Add a type from a list of available types or create a new one." +msgstr "利用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚¿ã‚¤ãƒ—ã‚’è¿½åŠ ã™ã‚‹ã‹ã€æ–°è¦ã«ä½œæˆã—ã¾ã™ã€‚" + msgid "Show Default" msgstr "デフォルトを表示" @@ -6336,6 +8168,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¿ã‚¤ãƒ—ã®ã‚¢ã‚¤ãƒ†ãƒ をオーãƒãƒ¼ãƒ©ã‚¤ msgid "Base Type" msgstr "基底型" +msgid "Select the variation base type from a list of available types." +msgstr "使用å¯èƒ½ãªã‚¿ã‚¤ãƒ—ã®ãƒªã‚¹ãƒˆã‹ã‚‰ãƒãƒªã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒ™ãƒ¼ã‚¹ã‚¿ã‚¤ãƒ—ã‚’é¸æŠžã€‚" + msgid "Theme:" msgstr "テーマ:" @@ -6449,12 +8284,48 @@ msgstr "å·¦å³å転" msgid "Flip Vertically" msgstr "上下å転" +msgid "Painting:" +msgstr "ペイントè¨å®š:" + +msgid "Shift+Ctrl: Draw rectangle." +msgstr "Shift+Ctrl: 四角形をæç”»" + +msgid "Scattering:" +msgstr "æ‹¡æ•£:" + msgid "Tiles" msgstr "タイル" +msgid "Toggle grid visibility." +msgstr "グリッドã®è¡¨ç¤ºã‚’切り替ãˆ" + +msgid "Delete All Tile Proxies" +msgstr "ã™ã¹ã¦ã®ã‚¿ã‚¤ãƒ«ãƒ—ãƒã‚シを削除" + +msgid "Global actions:" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³:" + +msgid "Select tiles." +msgstr "タイルをé¸æŠžã—ã¾ã™ã€‚" + +msgid "No tiles selected." +msgstr "タイルãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。" + +msgid "Paint Properties:" +msgstr "ペイントè¨å®š:" + msgid "Yes" msgstr "ã¯ã„" +msgid "Add a new atlas source" +msgstr "æ–°ã—ã„ã‚¢ãƒˆãƒ©ã‚¹ã‚½ãƒ¼ã‚¹ã‚’è¿½åŠ " + +msgid "Add a Scene Tile" +msgstr "シーンタイルã®è¿½åŠ " + +msgid "Tile properties:" +msgstr "タイルè¨å®š:" + msgid "TileSet" msgstr "タイルセット" @@ -6491,6 +8362,9 @@ msgstr "%s ブランãƒã‚’削除ã—ã¾ã™ã‹?" msgid "Do you want to remove the %s remote?" msgstr "リモート %s を削除ã—ã¾ã™ã‹ï¼Ÿ" +msgid "Create VCS metadata files for:" +msgstr "VCSメタデータ ファイルを作æˆ:" + msgid "Apply" msgstr "é©ç”¨" @@ -6965,6 +8839,9 @@ msgstr "パラメーターã®åŒæ›²ã‚¿ãƒ³ã‚¸ã‚§ãƒ³ãƒˆã‚’è¿”ã—ã¾ã™ã€‚" msgid "Finds the truncated value of the parameter." msgstr "パラメーターを切りæ¨ã¦ãŸå€¤ã‚’求ã‚ã¾ã™ã€‚" +msgid "Converts screen UV to a SDF." +msgstr "スクリーンUVã‚’SDFã«å¤‰æ›ã—ã¾ã™ã€‚" + msgid "Perform the cubic texture lookup." msgstr "立体テクスãƒãƒ£ãƒ»ãƒ«ãƒƒã‚¯ã‚¢ãƒƒãƒ—を実行ã—ã¾ã™ã€‚" @@ -7002,6 +8879,12 @@ msgstr "トランスフォームã®é€†è¡Œåˆ—を計算ã—ã¾ã™ã€‚" msgid "Calculates the transpose of a transform." msgstr "トランスフォームã®è»¢ç½®ã‚’計算ã—ã¾ã™ã€‚" +msgid "Sums two transforms." +msgstr "2 ã¤ã®Transformã‚’åˆè¨ˆã—ã¾ã™ã€‚" + +msgid "Subtracts two transforms." +msgstr "2 ã¤ã®Transformを減算ã—ã¾ã™ã€‚" + msgid "Multiplies vector by transform." msgstr "トランスフォームã§ãƒ™ã‚¯ãƒˆãƒ«ã‚’ä¹—ç®—ã—ã¾ã™ã€‚" @@ -7244,6 +9127,9 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ‘ス:" msgid "Renderer:" msgstr "レンダラー:" +msgid "Version Control Metadata:" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿:" + msgid "Missing Project" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãŒã‚ã‚Šã¾ã›ã‚“" @@ -7263,6 +9149,62 @@ msgid "Can't open project at '%s'." msgstr "次ã®å ´æ‰€ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ã¾ã›ã‚“ '%s'。" msgid "" +"The selected project \"%s\" does not specify its supported Godot version in " +"its configuration file (\"project.godot\").\n" +"\n" +"Project path: %s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"次ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯ã€ä½œæˆã«ä½¿ç”¨ã•ã‚ŒãŸGodotã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæŒ‡å®šã•ã‚Œ" +"ã¦ã„ã¾ã›ã‚“。\n" +"\n" +"%s\n" +"\n" +"ファイルを開ãã¨ã€Godotã®ç¾åœ¨ã®è¨å®šãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚\n" +"\n" +"è¦å‘Š: 以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ãªããªã‚Šã¾ã™ã€‚" + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"以下ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚ˆã‚Šç”Ÿæˆã•ã‚Œã¦ãŠ" +"ã‚Šã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç”¨ã«å¤‰æ›ãŒå¿…è¦ã§ã™:\n" +"\n" +"%s\n" +"\n" +"変æ›ã—ã¾ã™ã‹ï¼Ÿ\n" +"\n" +"è¦å‘Š: プãƒã‚¸ã‚§ã‚¯ãƒˆã¯æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§é–‹ãã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚" + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"プãƒã‚¸ã‚§ã‚¯ãƒˆ \"%s\" ãŒä»¥ä¸‹ã®ãƒ‘スã§é–‹ã‘ã¾ã›ã‚“:\n" +"\n" +"%s\n" +"\n" +"プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šã¯æ–°ã—ã„エンジンãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ä½œæˆã•ã‚Œã¾ã—ãŸãŒã€ãã®è¨å®šã¯ã“ã®" +"ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。" + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." @@ -7381,9 +9323,6 @@ msgstr "入力アクションã®è¿½åŠ " msgid "Change Action deadzone" msgstr "アクション デッドゾーンを変更" -msgid "Add Input Action Event" -msgstr "入力アクション ã‚¤ãƒ™ãƒ³ãƒˆã‚’è¿½åŠ " - msgid "Erase Input Action" msgstr "入力アクションを消去" @@ -7393,6 +9332,9 @@ msgstr "入力アクションイベントã®åå‰ã‚’変更ã™ã‚‹" msgid "Project Settings (project.godot)" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®š (project.godot)" +msgid "Select a Setting or Type its Name" +msgstr "è¨å®šã‚’é¸æŠž ã¾ãŸã¯ è¨å®šåを入力" + msgid "Input Map" msgstr "インプットマップ" @@ -7411,9 +9353,6 @@ msgstr "プãƒãƒ‘ティã®é¸æŠž" msgid "Select Virtual Method" msgstr "Virtualメソッドをé¸æŠž" -msgid "Select Method" -msgstr "メソッドã®é¸æŠž" - msgid "Batch Rename" msgstr "åå‰ã®ä¸€æ‹¬å¤‰æ›´" @@ -7432,6 +9371,21 @@ msgstr "高度ãªã‚ªãƒ—ション" msgid "Substitute" msgstr "代替" +msgid "Node name." +msgstr "ノードå" + +msgid "Node's parent name, if available." +msgstr "ノードã®è¦ªã®åå‰ (使用å¯èƒ½ãªå ´åˆ)" + +msgid "Node type." +msgstr "ノードタイプ" + +msgid "Current scene name." +msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³å" + +msgid "Root node name." +msgstr "ルートノードå" + msgid "" "Sequential integer counter.\n" "Compare counter options." @@ -7445,9 +9399,15 @@ msgstr "レベルã”ã¨ã®ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼" msgid "If set, the counter restarts for each group of child nodes." msgstr "è¨å®šã™ã‚‹ã¨ã€åノードã®ã‚°ãƒ«ãƒ¼ãƒ—ã”ã¨ã«ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼ãŒå†èµ·å‹•ã—ã¾ã™ã€‚" +msgid "Initial value for the counter." +msgstr "カウンターã®åˆæœŸå€¤" + msgid "Step" msgstr "ステップ" +msgid "Amount by which counter is incremented for each node." +msgstr "å„ノードã®ã‚«ã‚¦ãƒ³ã‚¿ãƒ¼ã®å¢—分é‡" + msgid "Padding" msgstr "パディング" @@ -7491,12 +9451,21 @@ msgstr "æ–‡å— %s" msgid "Reparent Node" msgstr "親ノードを変更" +msgid "Select new parent:" +msgstr "æ–°ã—ã„親をé¸æŠž:" + msgid "Keep Global Transform" msgstr "ã‚°ãƒãƒ¼ãƒãƒ« トランスフォームをä¿æŒ" msgid "Reparent" msgstr "親を変更" +msgid "File name invalid." +msgstr "ファイルåãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Root Type:" +msgstr "ルートã®åž‹:" + msgid "2D Scene" msgstr "2D シーン" @@ -7506,6 +9475,9 @@ msgstr "3D シーン" msgid "User Interface" msgstr "ユーザーインターフェース" +msgid "Root Name:" +msgstr "ルートã®åå‰:" + msgid "Error loading scene from %s" msgstr "シーンを%sã‹ã‚‰èªã¿è¾¼ã‚€éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç”Ÿã˜ã¾ã—ãŸ" @@ -7755,6 +9727,17 @@ msgstr "" "内ã®ã©ã“ã‹ã‚‰ã§ã‚‚アクセスã§ãã¾ã™ã€‚\n" "クリックã™ã‚‹ã¨ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚" +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "ノードã«ã¯ {num} 個ã®æŽ¥ç¶šãŒã‚ã‚Šã¾ã™ã€‚" + +msgid "Node is in this group:" +msgid_plural "Node is in the following groups:" +msgstr[0] "ノードã¯æ¬¡ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã«ã‚ã‚Šã¾ã™:" + +msgid "Click to show signals dock." +msgstr "クリックã§ã‚·ã‚°ãƒŠãƒ«ã®ãƒ‰ãƒƒã‚¯ã‚’表示ã—ã¾ã™ã€‚" + msgid "Open Script:" msgstr "スクリプトを開ã:" @@ -7885,6 +9868,12 @@ msgstr "無効ãªãƒ™ãƒ¼ã‚¹ãƒ‘スã§ã™ã€‚" msgid "Wrong extension chosen." msgstr "é–“é•ã£ãŸæ‹¡å¼µåãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚" +msgid "Mode:" +msgstr "モード:" + +msgid "Global shader parameter '%s' already exists'" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ãƒ‘ラメーター '%s' ã¯å˜åœ¨ã—ã¦ã„ã¾ã™" + msgid "Change Cylinder Radius" msgstr "円柱ã®åŠå¾„を変更" @@ -7924,6 +9913,9 @@ msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸å½¢å¼ã§ã™(@path ã§ç„¡åŠ¹ãªã‚¹ã‚¯ãƒ msgid "Invalid instance dictionary (invalid subclasses)" msgstr "無効ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹è¾žæ›¸ã§ã™(無効ãªã‚µãƒ–クラス)" +msgid "Path to Blender installation is valid." +msgstr "Blenderã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ‘スã¯æœ‰åŠ¹ã§ã™ã€‚" + msgid "Next Plane" msgstr "次ã®å¹³é¢" @@ -8006,7 +9998,7 @@ msgid "GridMap Settings" msgstr "グリッドマップã®è¨å®š" msgid "Pick Distance:" -msgstr "è·é›¢ã‚’å–å¾—:" +msgstr "é¸æŠžè·é›¢:" msgid "Give a MeshLibrary resource to this GridMap to use its meshes." msgstr "" @@ -8043,6 +10035,12 @@ msgstr "サイズ" msgid "Network Profiler" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ãƒãƒ•ã‚¡ã‚¤ãƒ©ãƒ¼" +msgid "Not possible to add a new property to synchronize without a root." +msgstr "ルートãªã—ã§åŒæœŸã™ã‚‹æ–°ã—ã„プãƒãƒ‘ãƒ†ã‚£ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" + +msgid "Delete Property?" +msgstr "プãƒãƒ‘ティを削除ã—ã¾ã™ã‹ï¼Ÿ" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "ã“ã®ãƒŽãƒ¼ãƒ‰ã‚’å‹•ã‹ã™ãŸã‚ã« NavigationMesh リソースをè¨å®šã¾ãŸã¯ä½œæˆã™ã‚‹å¿…è¦ãŒã‚" @@ -8093,6 +10091,12 @@ msgstr "ジオメトリを解æžã—ã¦ã„ã¾ã™..." msgid "Done!" msgstr "完了ï¼" +msgid "Error loading %s: %s." +msgstr "%s ã®ãƒãƒ¼ãƒ‰ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s" + +msgid "Add an action set." +msgstr "ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚»ãƒƒãƒˆã‚’è¿½åŠ ã—ã¾ã™ã€‚" + msgid "Package name is missing." msgstr "パッケージåãŒã‚ã‚Šã¾ã›ã‚“。" @@ -8190,18 +10194,9 @@ msgstr "APK expansion ã®å…¬é–‹éµãŒç„¡åŠ¹ã§ã™ã€‚" msgid "Invalid package name:" msgstr "無効ãªãƒ‘ッケージå:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"プラグインを利用ã™ã‚‹ã«ã¯ã€ŒUse Custom Build (カスタムビルドを使用ã™ã‚‹)ã€ãŒæœ‰åŠ¹" -"ã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "\"パススルー\" 㯠\"XR Mode\" ㌠\"OpenXR\" ã®å ´åˆã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚" -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Export AAB\" 㯠\"Use Custom Build\" ãŒæœ‰åŠ¹ã§ã‚ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚" - msgid "Code Signing" msgstr "コード署å" @@ -8227,6 +10222,13 @@ msgstr "apksigner実行ファイルを開始ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" msgid "'apksigner' returned with error #%d" msgstr "'apksigner' ãŒã‚¨ãƒ©ãƒ¼ #%d ã§çµ‚了ã—ã¾ã—ãŸ" +msgid "" +"output: \n" +"%s" +msgstr "" +"出力:\n" +"%s" + msgid "Verifying %s..." msgstr "%s を検証ä¸..." @@ -8249,13 +10251,6 @@ msgid "Unsupported export format!" msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„エクスãƒãƒ¼ãƒˆå½¢å¼ã§ã™ï¼" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"カスタムビルドã•ã‚ŒãŸãƒ†ãƒ³ãƒ—レートã‹ã‚‰ãƒ“ルドã—よã†ã¨ã—ã¾ã—ãŸãŒã€ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -"æƒ…å ±ãŒå˜åœ¨ã—ã¾ã›ã‚“。 「プãƒã‚¸ã‚§ã‚¯ãƒˆã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。" - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -8265,12 +10260,29 @@ msgstr "" "「プãƒã‚¸ã‚§ã‚¯ãƒˆ ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰Androidビルドテンプレートをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã" "ã ã•ã„。" +msgid "" +"Unable to overwrite res://android/build/res/*.xml files with project name." +msgstr "" +"res://android/build/res/*.xml ファイルをプãƒã‚¸ã‚§ã‚¯ãƒˆåã§ä¸Šæ›¸ãã§ãã¾ã›ã‚“。" + +msgid "Could not export project files to gradle project." +msgstr "" +"プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’gradleプãƒã‚¸ã‚§ã‚¯ãƒˆã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" + msgid "Could not write expansion package file!" msgstr "拡張パッケージファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸï¼" msgid "Building Android Project (gradle)" msgstr "Androidプãƒã‚¸ã‚§ã‚¯ãƒˆã®æ§‹ç¯‰(gradle)" +msgid "" +"Building of Android project failed, check output for the error. " +"Alternatively visit docs.godotengine.org for Android build documentation." +msgstr "" +"Androidプãƒã‚¸ã‚§ã‚¯ãƒˆã®ãƒ“ルドã«å¤±æ•—ã—ã¾ã—ãŸã€‚エラーã®å‡ºåŠ›ã‚’確èªã—ã¦ãã ã•ã„。\n" +"ã¾ãŸã€Androidビルドã«ã¤ã„ã¦ã®ãƒ‰ã‚ュメント㯠docs.godotengine.org ã‚’ã”覧ãã ã•" +"ã„。" + msgid "Moving output" msgstr "出力çµæžœã®ç§»å‹•ä¸" @@ -8287,6 +10299,19 @@ msgstr "パッケージãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: \"%s\"。" msgid "Creating APK..." msgstr "APK を作æˆã—ã¦ã„ã¾ã™..." +msgid "Could not find template APK to export: \"%s\"." +msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートAPKãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: \"%s\"" + +msgid "" +"Missing libraries in the export template for the selected architectures: %s. " +"Please build a template with all required libraries, or uncheck the missing " +"architectures in the export preset." +msgstr "" +"é¸æŠžã•ã‚ŒãŸã‚¢ãƒ¼ã‚テクãƒãƒ£: %s ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ãƒ©ã‚¤ãƒ–ラリãŒä¸è¶³ã—ã¦" +"ã„ã¾ã™ã€‚\n" +"å¿…è¦ãªãƒ©ã‚¤ãƒ–ラリをã™ã¹ã¦å«ã‚€ãƒ†ãƒ³ãƒ—レートを作æˆã™ã‚‹ã‹ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã®ãƒ—リセッ" +"トã§ã€ä¸è¶³ã—ã¦ã„るアーã‚テクãƒãƒ£ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。" + msgid "Adding files..." msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’è¿½åŠ ä¸..." @@ -8370,6 +10395,15 @@ msgstr "" "公証ã®æ‰‹ç¶šãã¯é€šå¸¸1時間以内ã«çµ‚了ã—ã¾ã™ã€‚手続ããŒå®Œäº†ã™ã‚‹ã¨EメールãŒå±Šãã¾" "ã™ã€‚" +msgid "Cannot sign file %s." +msgstr "ファイル %s ã«ç½²åã§ãã¾ã›ã‚“。" + +msgid "Could not start hdiutil executable." +msgstr "hdiutilを開始ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" + +msgid "Could not find template app to export: \"%s\"." +msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートアプリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: \"%s\"" + msgid "Invalid export format." msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå½¢å¼ã§ã™ã€‚" @@ -8432,6 +10466,13 @@ msgstr "" "ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ Mac ãŠã‚ˆã³ Apple Silicon æ載㮠Mac ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。" msgid "" +"Code signing: Using ad-hoc signature. The exported project will be blocked " +"by Gatekeeper" +msgstr "" +"コード署å: アドホック署åを使用ã—ã¾ã™ã€‚エクスãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã¯ " +"Gatekeeper ã«ã‚ˆã£ã¦ãƒ–ãƒãƒƒã‚¯ã•ã‚Œã¾ã™ã€‚" + +msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" @@ -8517,6 +10558,9 @@ msgstr "" "スプラッシュスクリーンã®ç”»åƒã‚µã‚¤ã‚ºãŒç„¡åŠ¹ã§ã™(縦横620x300ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›" "ã‚“)。" +msgid "Could not open template for export: \"%s\"." +msgstr "エクスãƒãƒ¼ãƒˆç”¨ã®ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“ã§ã—ãŸ: \"%s\"" + msgid "Invalid export template: \"%s\"." msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レート: \"%s\"。" @@ -8698,6 +10742,13 @@ msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "" "PathFollow2D ã¯ã€Path2D ノードã®åã¨ã—ã¦è¨å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã®ã¿å‹•ä½œã—ã¾ã™ã€‚" +msgid "" +"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a " +"parent node!" +msgstr "" +"PhysicalBone2D ã¯ã€è¦ªãƒŽãƒ¼ãƒ‰ã¨ã—㦠Skeleton2D ã¾ãŸã¯åˆ¥ã® PhysicalBone2D ã§ã®ã¿" +"機能ã—ã¾ã™ã€‚" + msgid "Path property must point to a valid Node2D node to work." msgstr "" "Path プãƒãƒ‘ティã¯ã€å‹•ä½œã™ã‚‹ã‚ˆã†ã«æœ‰åŠ¹ãª Node2D ノードを示ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" @@ -8716,6 +10767,16 @@ msgstr "" "ã“ã®ãƒœãƒ¼ãƒ³ã«ã¯é©åˆ‡ãªRESTãƒãƒ¼ã‚ºãŒã‚ã‚Šã¾ã›ã‚“。 Skeleton2Dノードã«ç§»å‹•ã—ã¦è¨å®šã—" "ã¾ã™ã€‚" +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon2Dã¯ã€CollisionObject2D派生ノードã«ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚·ã‚§ã‚¤ãƒ—ã‚’æä¾›ã™" +"ã‚‹ãŸã‚ã«ã®ã¿æ©Ÿèƒ½ã—ã¾ã™ã€‚ã‚·ã‚§ã‚¤ãƒ—ã‚’è¿½åŠ ã™ã‚‹å ´åˆã¯ã€Area2Dã€StaticBody2Dã€" +"RigidBody2Dã€KinematicBody2Dãªã©ã®åã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。" + msgid "Nothing is visible because no mesh has been assigned." msgstr "メッシュãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•ã‚‚表示ã•ã‚Œã¾ã›ã‚“。" @@ -8723,6 +10784,9 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "æ画パスã«ãƒ¡ãƒƒã‚·ãƒ¥ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ãªã„ãŸã‚ã€ä½•ã‚‚表示ã•ã‚Œã¾ã›ã‚“。" +msgid "Creating probes" +msgstr "プãƒãƒ¼ãƒ–ã®ä½œæˆ" + msgid "This body will be ignored until you set a mesh." msgstr "ã“ã®ãƒœãƒ‡ã‚£ã¯ã€ãƒ¡ãƒƒã‚·ãƒ¥ã‚’è¨å®šã™ã‚‹ã¾ã§ç„¡è¦–ã•ã‚Œã¾ã™ã€‚" @@ -8767,9 +10831,22 @@ msgstr "AnimationPlayerã«è¨å®šã•ã‚ŒãŸãƒ‘スã‹ã‚‰AnimationPlayerノード㌠msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayerルートノードãŒæœ‰åŠ¹ãªãƒŽãƒ¼ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“。" +msgid "" +"Color: #%s\n" +"LMB: Apply color" +msgstr "" +"色: #%s\n" +"左クリック: 色をセット" + msgid "Pick a color from the editor window." msgstr "エディターウィンドウã‹ã‚‰è‰²ã‚’é¸æŠžã€‚" +msgid "Select a picker shape." +msgstr "ピッカーシェイプをé¸æŠž" + +msgid "Select a picker mode." +msgstr "ピッカー・モードをé¸æŠž" + msgid "Switch between hexadecimal and code values." msgstr "16進数ã¨ã‚³ãƒ¼ãƒ‰å€¤ã‚’切り替ãˆã¾ã™ã€‚" @@ -8845,6 +10922,16 @@ msgid "" msgstr "" "レンダーã™ã‚‹ã«ã¯Viewportã®ç¸¦æ¨ªãã‚Œãžã‚ŒãŒ2ピクセル以上ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" +msgid "Unsupported BMFont texture format." +msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ BMFont テクスãƒãƒ£å½¢å¼ã§ã™ã€‚" + +msgid "" +"Shader keywords cannot be used as parameter names.\n" +"Choose another name." +msgstr "" +"シェーダーã®ã‚ーワードã¯ãƒ‘ラメーターã®åå‰ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。\n" +"別ã®åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。" + msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." @@ -8870,6 +10957,15 @@ msgstr "ç¹°ã‚Šè¿”ã—" msgid "Invalid comparison function for that type." msgstr "ãã®ã‚¿ã‚¤ãƒ—ã®æ¯”較関数ã¯ç„¡åŠ¹ã§ã™ã€‚" +msgid "Invalid arguments for the built-in function: \"%s(%s)\"." +msgstr "組ã¿è¾¼ã¿é–¢æ•° \"%s(%s)\" ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Invalid assignment of '%s' to '%s'." +msgstr "'%s' ã‹ã‚‰ '%s' ã¸ã®å‰²ã‚Šå½“ã¦ãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Expected constant expression." +msgstr "定数å¼ãŒå¿…è¦ã§ã™ã€‚" + msgid "Varying may not be assigned in the '%s' function." msgstr "Varying 㯠'%s' 関数ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚Œãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" @@ -8881,3 +10977,81 @@ msgstr "uniform ã¸ã®å‰²ã‚Šå½“ã¦ã€‚" msgid "Constants cannot be modified." msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" + +msgid "Cannot convert from '%s' to '%s'." +msgstr "'%s' ã‹ã‚‰ '%s' ã«å¤‰æ›ã§ãã¾ã›ã‚“。" + +msgid "Expected ')' in expression." +msgstr "å¼ã« ')' ãŒå¿…è¦ã§ã™ã€‚" + +msgid "Void value not allowed in expression." +msgstr "void 値ã¯å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" + +msgid "No matching constructor found for: '%s'." +msgstr "'%s' ã«ä¸€è‡´ã™ã‚‹ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" + +msgid "No matching function found for: '%s'." +msgstr "'%s' ã«ä¸€è‡´ã™ã‚‹é–¢æ•°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" + +msgid "Invalid arguments to unary operator '%s': %s." +msgstr "å˜é …演算å '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™: %s" + +msgid "Invalid argument to ternary operator: '%s'." +msgstr "ä¸‰é …æ¼”ç®—å '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Invalid arguments to operator '%s': '%s'." +msgstr "演算å '%s' ã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™: '%s'" + +msgid "Invalid variable type (samplers are not allowed)." +msgstr "変数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)" + +msgid "Duplicated case label: %d." +msgstr "case ラベルãŒé‡è¤‡ã—ã¦ã„ã¾ã™: %d" + +msgid "Duplicated render mode: '%s'." +msgstr "rebder mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'" + +msgid "Duplicated hint: '%s'." +msgstr "ヒントãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'" + +msgid "Duplicated filter mode: '%s'." +msgstr "filter mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'" + +msgid "Duplicated repeat mode: '%s'." +msgstr "repeat mode ãŒé‡è¤‡ã—ã¦ã„ã¾ã™: '%s'" + +msgid "Invalid constant type (samplers are not allowed)." +msgstr "定数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)" + +msgid "Invalid function type (samplers are not allowed)." +msgstr "関数ã®åž‹ãŒç„¡åŠ¹ã§ã™ (サンプラーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)" + +msgid "Expected a '%s'." +msgstr "'%s' ãŒå¿…è¦ã§ã™ã€‚" + +msgid "Expected a '%s' or '%s'." +msgstr "'%s' ã¾ãŸã¯ '%s' ãŒå¿…è¦ã§ã™ã€‚" + +msgid "Redefinition of '%s'." +msgstr "'%s' ã®å†å®šç¾©ã€‚" + +msgid "Invalid argument name." +msgstr "引数åãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "Condition evaluation error." +msgstr "æ¡ä»¶è©•ä¾¡ã‚¨ãƒ©ãƒ¼" + +msgid "Invalid macro argument count." +msgstr "マクãƒå¼•æ•°ã®æ•°ãŒç„¡åŠ¹ã§ã™ã€‚" + +msgid "The const '%s' is declared but never used." +msgstr "const '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。" + +msgid "The function '%s' is declared but never used." +msgstr "関数 '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。" + +msgid "The struct '%s' is declared but never used." +msgstr "æ§‹é€ ä½“ '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。" + +msgid "The local variable '%s' is declared but never used." +msgstr "ãƒãƒ¼ã‚«ãƒ«å¤‰æ•° '%s' ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。" diff --git a/editor/translations/editor/ko.po b/editor/translations/editor/ko.po index c157b684b5..3400b8d86e 100644 --- a/editor/translations/editor/ko.po +++ b/editor/translations/editor/ko.po @@ -42,13 +42,14 @@ # Godoto <aicompose@gmail.com>, 2022. # gaenyang <gaenyang@outlook.com>, 2022. # 오지훈 <jule1130@naver.com>, 2023. +# ì´ì •í¬ <daemul72@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: 오지훈 <jule1130@naver.com>\n" +"PO-Revision-Date: 2023-02-09 15:26+0000\n" +"Last-Translator: ì´ì •í¬ <daemul72@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -56,7 +57,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Physical" msgstr "물리" @@ -609,6 +610,9 @@ msgstr "ì´ ì‹œê·¸ë„ì—ì„œ:" msgid "Scene does not contain any script." msgstr "ì”¬ì— ìŠ¤í¬ë¦½íŠ¸ê°€ 없습니다." +msgid "Select Method" +msgstr "메서드 ì„ íƒ" + msgid "Remove" msgstr "ì œê±°" @@ -666,9 +670,6 @@ msgstr "ì—°ê²° ëŠê¸°" msgid "Connect a Signal to a Method" msgstr "시그ë„ì„ ë©”ì„œë“œì— ì—°ê²°" -msgid "Edit Connection:" -msgstr "ì—°ê²° 변경:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "\"%s\" 시그ë„ì˜ ëª¨ë“ ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" @@ -813,23 +814,8 @@ msgstr "ê²½ê³ :" msgid "Error:" msgstr "오류:" -msgid "C++ Error" -msgstr "C++ 오류" - -msgid "C++ Error:" -msgstr "C++ 오류:" - -msgid "Source" -msgstr "소스" - -msgid "C++ Source" -msgstr "C++ 소스" - -msgid "Source:" -msgstr "소스:" - -msgid "C++ Source:" -msgstr "C++ 소스:" +msgid "%s Error" +msgstr "%s 오류" msgid "Stack Trace" msgstr "ìŠ¤íƒ ì¶”ì " @@ -840,6 +826,9 @@ msgstr "오류 복사" msgid "Open C++ Source on GitHub" msgstr "GitHubì—ì„œ C++ 소스 열기" +msgid "C++ Source" +msgstr "C++ 소스" + msgid "Video RAM" msgstr "비디오 RAM" @@ -1302,6 +1291,12 @@ msgstr "노드 ì´ë¦„:" msgid "Global Variable" msgstr "ì „ì— ë³€ìˆ˜" +msgid "2D Physics" +msgstr "2D 물리" + +msgid "3D Physics" +msgstr "3D 물리" + msgid "Navigation" msgstr "네비게ì´ì…˜" @@ -1652,6 +1647,9 @@ msgstr "%s 오버ë¼ì´ë“œ:" msgid "default:" msgstr "ë””í´íŠ¸:" +msgid "Operators" +msgstr "ì—°ì‚°ìž" + msgid "Theme Properties" msgstr "테마 ì†ì„±ë“¤" @@ -1789,12 +1787,12 @@ msgstr "ëª¨ë“ ë¡œì¼€ì¼ ë³´ì´ê¸°" msgid "Show Selected Locales Only" msgstr "ì„ íƒí•œ 로케ì¼ë§Œ ë³´ì´ê¸°" +msgid "Edit Filters" +msgstr "í•„í„° 편집" + msgid "Language:" msgstr "언어:" -msgid "Script" -msgstr "스í¬ë¦½íŠ¸" - msgid "Variant" msgstr "변종" @@ -2341,22 +2339,6 @@ msgid "Install from file" msgstr "파ì¼ì—ì„œ 설치" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"\"res://android/build\"ì— ì†ŒìŠ¤ í…œí”Œë¦¿ì„ ì„¤ì¹˜í•´ì„œ 프로ì 트를 커스텀 Android 빌" -"ë“œì— ë§žê²Œ ì„¤ì •í•©ë‹ˆë‹¤.\n" -"그런 ë‹¤ìŒ ìˆ˜ì • 사í•ì„ ì ìš©í•˜ê³ ì»¤ìŠ¤í…€ APK를 빌드해서 내보낼 수 있습니다(모듈 " -"추가, AndroidManifest.xml 변경 등).\n" -"미리 ë¹Œë“œëœ APK를 사용하는 ëŒ€ì‹ ì»¤ìŠ¤í…€ 빌드를 ë§Œë“¤ë ¤ë©´, Android 내보내기 프리" -"ì…‹ì—ì„œ \"커스텀 빌드 사용(Use Custom Build)\" ì„¤ì •ì„ í™œì„±í™”í•´ì•¼ 합니다." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2579,9 +2561,6 @@ msgstr "단축키" msgid "Binding" msgstr "ë°”ì¸ë”©" -msgid "%s Error" -msgstr "%s 오류" - msgid "All Devices" msgstr "ëª¨ë“ ê¸°ê¸°" @@ -3498,6 +3477,9 @@ msgstr "ì ì„ ì„ íƒí•˜ê³ ì´ë™í•©ë‹ˆë‹¤. ìš°í´ë¦ìœ¼ë¡œ ì ì„ ë§Œë“œì„¸ìš” msgid "Enable snap and show grid." msgstr "ìŠ¤ëƒ…ì„ í™œì„±í™”í•˜ê³ ê²©ìžë¥¼ ë³´ì´ê²Œ 합니다." +msgid "Blend:" +msgstr "혼합:" + msgid "Point" msgstr "ì " @@ -3540,15 +3522,9 @@ msgstr "ì ê³¼ 삼ê°í˜• 지우기." msgid "Generate blend triangles automatically (instead of manually)" msgstr "(ìˆ˜ë™ ëŒ€ì‹ ) ìžë™ìœ¼ë¡œ 혼합 삼ê°í˜• 만들기" -msgid "Blend:" -msgstr "혼합:" - msgid "Parameter Changed:" msgstr "매개변수 변경ë¨:" -msgid "Edit Filters" -msgstr "í•„í„° 편집" - msgid "Output node can't be added to the blend tree." msgstr "ì¶œë ¥ 노드를 혼합 íŠ¸ë¦¬ì— ì¶”ê°€í• ìˆ˜ 없습니다." @@ -3670,9 +3646,6 @@ msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 현재 위치ì—ì„œ 거꾸로 재ìƒí•©ë‹ˆë msgid "Play selected animation backwards from end. (Shift+A)" msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ ëì—ì„œ 거꾸로 재ìƒí•©ë‹ˆë‹¤. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 재ìƒì„ 중단합니다. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "ì„ íƒí•œ ì• ë‹ˆë©”ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒí•©ë‹ˆë‹¤. (Shift+D)" @@ -4888,12 +4861,6 @@ msgstr "알림 AABB 바꾸기" msgid "Change Particles AABB" msgstr "íŒŒí‹°í´ AABB 바꾸기" -msgid "Change Box Shape Extents" -msgstr "박스 모양 범위 바꾸기" - -msgid "Change Probe Extents" -msgstr "프로브 범위 바꾸기" - msgid "Change Capsule Shape Radius" msgstr "ìº¡ìŠ ëª¨ì–‘ 반경 바꾸기" @@ -5003,7 +4970,7 @@ msgid "Rotate" msgstr "íšŒì „" msgid "Translate" -msgstr "ì´ë™" +msgstr "옮기기" msgid "Translating:" msgstr "ë²ˆì— ì¤‘:" @@ -5695,6 +5662,9 @@ msgstr "표준" msgid "Connections to method:" msgstr "ë©”ì„œë“œì— ì—°ê²°:" +msgid "Source" +msgstr "소스" + msgid "Target" msgstr "Target(대ìƒ)" @@ -5939,12 +5909,6 @@ msgstr "(비었ìŒ)" msgid "Animations:" msgstr "ì• ë‹ˆë©”ì´ì…˜:" -msgid "Speed:" -msgstr "ì†ë„:" - -msgid "Loop" -msgstr "루프" - msgid "Animation Frames:" msgstr "ì• ë‹ˆë©”ì´ì…˜ í”„ë ˆìž„:" @@ -7329,9 +7293,6 @@ msgstr "ìž…ë ¥ ì•¡ì…˜ 추가" msgid "Change Action deadzone" msgstr "ì•¡ì…˜ ë°ë“œì¡´ 바꾸기" -msgid "Add Input Action Event" -msgstr "ìž…ë ¥ ì•¡ì…˜ ì´ë²¤íŠ¸ 추가" - msgid "Erase Input Action" msgstr "ìž…ë ¥ ì•¡ì…˜ 지우기" @@ -7359,9 +7320,6 @@ msgstr "ì†ì„± ì„ íƒ" msgid "Select Virtual Method" msgstr "ê°€ìƒ ë©”ì„œë“œ ì„ íƒ" -msgid "Select Method" -msgstr "메서드 ì„ íƒ" - msgid "Batch Rename" msgstr "ì¼ê´„ ì´ë¦„ 바꾸기" @@ -8133,12 +8091,6 @@ msgstr "APK í™•ìž¥ì— ìž˜ëª»ëœ ê³µê°œ 키입니다." msgid "Invalid package name:" msgstr "ìž˜ëª»ëœ íŒ¨í‚¤ì§€ ì´ë¦„:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "플러그ì¸ì„ ì‚¬ìš©í•˜ë ¤ë©´ \"Use Custom Build\"ê°€ 활성화ë˜ì–´ì•¼ 합니다." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "\"Export AAB\"는 \"Use Custom Build\"ê°€ í™œì„±í™”ëœ ê²½ìš°ì—만 ìœ íš¨í•©ë‹ˆë‹¤." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -8183,13 +8135,6 @@ msgid "Unsupported export format!" msgstr "지ì›ë˜ì§€ 않는 내보내기 형ì‹ìž…니다!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"커스텀 빌드 템플릿으로 ë¹Œë“œí•˜ë ¤ 했으나, ë²„ì „ ì •ë³´ê°€ 없습니다. '프로ì 트" -"(Project)' 메뉴ì—ì„œ 다시 설치해주세요." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/lv.po b/editor/translations/editor/lv.po index b6f4152e33..79048ab1e7 100644 --- a/editor/translations/editor/lv.po +++ b/editor/translations/editor/lv.po @@ -553,9 +553,6 @@ msgstr "Atvienot" msgid "Connect a Signal to a Method" msgstr "Savienot SignÄlu ar Metodi" -msgid "Edit Connection:" -msgstr "IzmainÄ«t Savienojumu:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Vai esat droÅ¡s(Å¡a), ka vÄ“laties noņemt visus savienojumus no \"%s\" signÄla?" @@ -663,18 +660,12 @@ msgstr "Izsaukumi" msgid "Error:" msgstr "Kļūda:" -msgid "Source" -msgstr "Avots" +msgid "%s Error" +msgstr "%s Kļūda" msgid "C++ Source" msgstr "C++ avots" -msgid "Source:" -msgstr "Avots:" - -msgid "C++ Source:" -msgstr "C++ Avots:" - msgid "Skip Breakpoints" msgstr "Izlaist pÄrrÄvumpunktus" @@ -2067,22 +2058,6 @@ msgstr "PÄrvaldÄ«t Å¡ablonus" msgid "Install from file" msgstr "InstalÄ“t no faila" -msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Å is iestatÄ«s jÅ«su projektu priekÅ¡ pielÄgotÄm Android bÅ«vÄ“m, ieinstalÄ“jot " -"avota Å¡ablonu uz \"res://android/build\".\n" -"JÅ«s varat veikt izmaiņas un uzbÅ«vÄ“t paÅ¡i savu pielÄgoto APK pie " -"eksportÄ“Å¡anas (pievienot moduļus, mainÄ«t AndroidManifest.xml, utt.).\n" -"PiezÄ«me - lai veiktu pielÄgotÄs bÅ«ves jau iebÅ«vÄ“to APK vietÄ, opcijai " -"\"Izmantot PielÄgotu bÅ«vi\" jÄbÅ«t ieslÄ“gtai pie Android eksporta Å¡ablona." - msgid "Import Templates From ZIP File" msgstr "ImportÄ“r Å¡ablonus no ZIP faila" @@ -2207,9 +2182,6 @@ msgstr "Jau ir rediģēta aina." msgid "General" msgstr "VispÄrÄ“ji" -msgid "%s Error" -msgstr "%s Kļūda" - msgid "Storing File:" msgstr "Faila saglabÄÅ¡ana:" @@ -2487,15 +2459,15 @@ msgstr "Pievienot Mezgla Punktu" msgid "Add Animation Point" msgstr "Pievienot AnimÄcijas Punktu" +msgid "Blend:" +msgstr "SapludinÄt:" + msgid "Open Animation Node" msgstr "AtvÄ“rt AnimÄcijas Mezglu" msgid "Add Triangle" msgstr "Pievienot TrijstÅ«ri" -msgid "Blend:" -msgstr "SapludinÄt:" - msgid "Nodes Connected" msgstr "Mezgli Savienoti" @@ -2951,6 +2923,9 @@ msgstr "NotÄ«rÄ«t nesenos skriptus" msgid "Standard" msgstr "Standarts" +msgid "Source" +msgstr "Avots" + msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." msgstr "" @@ -3025,9 +3000,6 @@ msgstr "Nav izvÄ“lÄ“ti kadri" msgid "Animations:" msgstr "AnimÄcijas:" -msgid "Loop" -msgstr "Cilpa" - msgid "Animation Frames:" msgstr "AnimÄcijas Kadri:" diff --git a/editor/translations/editor/ms.po b/editor/translations/editor/ms.po index 6334a8cf3b..83a970ad95 100644 --- a/editor/translations/editor/ms.po +++ b/editor/translations/editor/ms.po @@ -594,9 +594,6 @@ msgstr "Putuskan sambungan" msgid "Connect a Signal to a Method" msgstr "Sambungkan Isyarat ke Kaedah" -msgid "Edit Connection:" -msgstr "Edit Sambungan:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Adakah anda pasti anda mahu mengeluarkan semua sambungan dari isyarat \"% " @@ -709,6 +706,9 @@ msgstr "Masa" msgid "Calls" msgstr "Panggilan" +msgid "%s Error" +msgstr "%s Ralat" + msgid "Expand All" msgstr "Kembangkan Semua" @@ -1577,6 +1577,9 @@ msgstr "%s tidak dipinkan" msgid "Copy Property Path" msgstr "Salin Laluan Sifat" +msgid "Edit Filters" +msgstr "Sunting Filters" + msgid "Language:" msgstr "Bahasa:" @@ -2107,24 +2110,6 @@ msgid "Install from file" msgstr "Pasang dari fail" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Ini akan menyiapkan projek anda untuk binaan Android khas dengan memasang " -"templat sumber pada \"res://android/build\".\n" -"Anda kemudian boleh menerapkan pengubahsuaian dan membina APK tersuai anda " -"sendiri pada eksport (menambah modul, menukar AndroidManifest.xml, dan lain-" -"lain).\n" -"Perhatikan bahawa untuk membuat binaan tersuai dan bukannya menggunakan APK " -"pra-dibina, pilihan \"Gunakan Bina Tersuai\" harus diaktifkan dalam pratetap " -"eksport Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2333,9 +2318,6 @@ msgstr "Sudah ada adegan yang diedit." msgid "General" msgstr "Am" -msgid "%s Error" -msgstr "%s Ralat" - msgid "Device" msgstr "Peranti" @@ -3005,6 +2987,9 @@ msgstr "Pilih dan pindahkan titik-titik, cipta titik-titik dengan RMB." msgid "Enable snap and show grid." msgstr "Aktifkan snap dan tunjukkan grid." +msgid "Blend:" +msgstr "Adun:" + msgid "Point" msgstr "Titik" @@ -3048,15 +3033,9 @@ msgid "Generate blend triangles automatically (instead of manually)" msgstr "" "Jana segi tiga-segi tiga campuran secara automatik (bukan secara manual)" -msgid "Blend:" -msgstr "Adun:" - msgid "Parameter Changed:" msgstr "Parameter Berubah:" -msgid "Edit Filters" -msgstr "Sunting Filters" - msgid "Output node can't be added to the blend tree." msgstr "Nod keluaran tidak boleh ditambah ke pokok adunan." @@ -3177,9 +3156,6 @@ msgstr "Mainkan animasi terpilih ke belakang dari pos semasa. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Mainkan animasi terpillih ke belakang dari hujung. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Hentikan playback animasi. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Mainkan animasi terpilih dari awal. (Shift+D)" diff --git a/editor/translations/editor/nb.po b/editor/translations/editor/nb.po index 8be049d267..e2001fa866 100644 --- a/editor/translations/editor/nb.po +++ b/editor/translations/editor/nb.po @@ -605,18 +605,6 @@ msgstr "Advarsel:" msgid "Error:" msgstr "Feil:" -msgid "C++ Error" -msgstr "C++-feil" - -msgid "C++ Error:" -msgstr "C++-feil:" - -msgid "Source" -msgstr "Kilde" - -msgid "Source:" -msgstr "Kildekode:" - msgid "Copy Error" msgstr "Feil ved kopiering" @@ -1179,12 +1167,12 @@ msgstr "Endre størrelsen pÃ¥ Array" msgid "Set Multiple:" msgstr "Sett mange:" +msgid "Edit Filters" +msgstr "Rediger filtere" + msgid "Language:" msgstr "SprÃ¥k:" -msgid "Script" -msgstr "Skript" - msgid "Clear Output" msgstr "Nullstill Resultat" @@ -2075,9 +2063,6 @@ msgstr "Punkt" msgid "Triangle already exists." msgstr "Triangelet finnes allerede." -msgid "Edit Filters" -msgstr "Rediger filtere" - msgid "Functions" msgstr "Funksjoner" @@ -2120,9 +2105,6 @@ msgstr "Spill av valgte animasjon baklengs fra gjeldende posisjon. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Spill av valgte animasjon baklengs fra slutten. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Stopp avspilling av animasjon. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Spill av valgte animasjon fra start. (Shift+D)" @@ -2807,6 +2789,9 @@ msgstr "Søkeresultater" msgid "Standard" msgstr "Standard" +msgid "Source" +msgstr "Kilde" + msgid "Target" msgstr "MÃ¥l" @@ -2885,9 +2870,6 @@ msgstr "Fjern Animasjon?" msgid "(empty)" msgstr "(tom)" -msgid "Loop" -msgstr "Repeter" - msgid "Zoom Reset" msgstr "Tilbakestill forstørring" diff --git a/editor/translations/editor/nl.po b/editor/translations/editor/nl.po index e829ebaa7a..668568460d 100644 --- a/editor/translations/editor/nl.po +++ b/editor/translations/editor/nl.po @@ -19,7 +19,7 @@ # Pieter-Jan Briers <pieterjan.briers@gmail.com>, 2017-2018. # Robin Arys <robinarys@hotmail.com>, 2017. # Senno Kaasjager <senno.kaasjager@gmail.com>, 2017. -# Uxilo <jmolendijk93@gmail.com>, 2017-2018. +# Uxilo <jmolendijk93@gmail.com>, 2017-2018, 2023. # Willem <studiebolmail@gmail.com>, 2018. # Wout Standaert <wout@blobkat.com>, 2017. # Zatherz <zatherz@linux.pl>, 2017. @@ -65,8 +65,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-23 04:16+0000\n" -"Last-Translator: Nnn <irri2020@outlook.com>\n" +"PO-Revision-Date: 2023-02-08 12:14+0000\n" +"Last-Translator: Uxilo <jmolendijk93@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" "Language: nl\n" @@ -74,14 +74,35 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Physical" msgstr "Fysiek" +msgid "Left Mouse Button" +msgstr "Linker Muis Knop" + +msgid "Right Mouse Button" +msgstr "Rechter Muis Knop" + +msgid "Middle Mouse Button" +msgstr "Middelste Muis Knop" + +msgid "Mouse Wheel Up" +msgstr "Scrollwiel Omhoog" + +msgid "Mouse Wheel Down" +msgstr "Scrollwiel Omlaag" + msgid "Button" msgstr "Button (Knop)" +msgid "Double Click" +msgstr "Dubbel Klik" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Muis beweging op positie (%s) met snelheid (%s)" + msgid "Select" msgstr "Selecteer" @@ -181,9 +202,24 @@ msgstr "Action '%s' bestaat al." msgid "Add Event" msgstr "Event Toevoegen" +msgid "Remove Action" +msgstr "Verwijder Actie" + +msgid "Cannot Remove Action" +msgstr "Kan Actie Niet Verwijderen" + +msgid "Filter by name..." +msgstr "Filter op naam..." + +msgid "Add New Action" +msgstr "Nieuwe Actie Toevoegen" + msgid "Add" msgstr "Toevoegen" +msgid "Show Built-in Actions" +msgstr "Weergeef Ingebouwde Acties" + msgid "Action" msgstr "Actie" @@ -211,6 +247,9 @@ msgstr "Bézierpunt toevoegen" msgid "Move Bezier Points" msgstr "Beweeg Bézierpunten" +msgid "Focus" +msgstr "Focus" + msgid "Change Animation Length" msgstr "Verander Animatielengte" @@ -250,6 +289,9 @@ msgstr "Functies:" msgid "Audio Clips:" msgstr "Audioclips:" +msgid "Animation Clips:" +msgstr "Animatieclips:" + msgid "Change Track Path" msgstr "Verander Track pad" @@ -268,12 +310,33 @@ msgstr "Naadloze-lusmodus (interpoleert einde met begin van lus)" msgid "Remove this track." msgstr "Verwijder deze track." +msgid "Time (s):" +msgstr "Tijd (s):" + +msgid "Position:" +msgstr "Positie:" + +msgid "Rotation:" +msgstr "Rotatie:" + msgid "Scale:" msgstr "Schaal:" msgid "Type:" msgstr "Type:" +msgid "(Invalid, expected type: %s)" +msgstr "(Ongeldig, verwachtte type: %s)" + +msgid "Start (s):" +msgstr "Start (s):" + +msgid "End (s):" +msgstr "Eind (s):" + +msgid "Animation Clip:" +msgstr "Animatie Clip:" + msgid "Toggle Track Enabled" msgstr "Track in-/uit schakelen" @@ -381,12 +444,24 @@ msgstr "Track path is niet geldig, dus kan geen methode key toevoegen." msgid "Add Method Track Key" msgstr "Voeg Methode Track sleutel toe" +msgid "Method not found in object:" +msgstr "Methode niet gevonden in object:" + msgid "Position" msgstr "Positie" +msgid "Rotation" +msgstr "Rotatie" + +msgid "Scale" +msgstr "Schaal" + msgid "Methods" msgstr "Methoden" +msgid "Bezier" +msgstr "Bezier" + msgid "Audio" msgstr "Audio" @@ -409,6 +484,9 @@ msgid "Select an AnimationPlayer node to create and edit animations." msgstr "" "Selecteer een AnimationPlayer uit de Scene Tree om animaties te wijzigen." +msgid "Imported Scene" +msgstr "Geïmporteerde Scene" + msgid "Only show tracks from nodes selected in tree." msgstr "Alleen sporen van geselecteerde knopen tonen." @@ -460,6 +538,15 @@ msgstr "Ga naar Vorige Stap" msgid "Apply Reset" msgstr "Reset" +msgid "Optimize Animation (no undo)" +msgstr "Optimaliseer Animatie (Onomkeerbaar)" + +msgid "Clean-Up Animation (no undo)" +msgstr "Animatie Opschonen (Onomkeerbaar)" + +msgid "Pick a node to animate:" +msgstr "Kies een node om te animeren:" + msgid "Use Bezier Curves" msgstr "Gebruik Bezier Curves" @@ -517,6 +604,16 @@ msgstr "Regelnummer:" msgid "%d replaced." msgstr "%d vervangingen." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d overeenkomst gevonden" +msgstr[1] "%d overeenkomsten gevonden" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d overeenkomst gevonden" +msgstr[1] "%d overeenkomsten gevonden" + msgid "Match Case" msgstr "Hoofdlettergevoelig" @@ -567,7 +664,7 @@ msgstr "" "script aan de doelknoop." msgid "Connect to Node:" -msgstr "Aan knoop verbinden:" +msgstr "Aan Node verbinden:" msgid "Connect to Script:" msgstr "Met script verbinden:" @@ -578,6 +675,9 @@ msgstr "Vanuit signaal:" msgid "Scene does not contain any script." msgstr "Scene bevat geen script." +msgid "Select Method" +msgstr "Selecteer Method" + msgid "Remove" msgstr "Verwijderen" @@ -602,6 +702,9 @@ msgstr "" "Stelt het signaal uit, bewaart het in een wachtrij en activeert het pas op " "een dood moment." +msgid "One Shot" +msgstr "Eenmalig" + msgid "Disconnects the signal after its first emission." msgstr "Koppelt het signaal automatisch los na de eerste uitzending." @@ -617,6 +720,9 @@ msgstr "Verbinden" msgid "Signal:" msgstr "Signaal:" +msgid "No description." +msgstr "Geen omschrijving." + msgid "Connect '%s' to '%s'" msgstr "Verbind '%s' met '%s'" @@ -635,9 +741,6 @@ msgstr "Loskoppelen" msgid "Connect a Signal to a Method" msgstr "Verbind een signaal met een methode" -msgid "Edit Connection:" -msgstr "Verbinding bewerken:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "Weet je zeker dat je alle verbindingen met signaal \"%s\" wilt verwijderen?" @@ -645,6 +748,9 @@ msgstr "" msgid "Signals" msgstr "Signalen" +msgid "Filter Signals" +msgstr "Filter Signalen" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "" "Weet je zeker dat je alle verbindingen naar dit signaal wilt verwijderen?" @@ -652,12 +758,18 @@ msgstr "" msgid "Disconnect All" msgstr "Alles loskoppelen" +msgid "Copy Name" +msgstr "Kopieer Naam" + msgid "Edit..." msgstr "Bewerken..." msgid "Go to Method" msgstr "Ga naar Methode" +msgid "Change Type of \"%s\"" +msgstr "Wijzig Type van \"%s\"" + msgid "Change" msgstr "Wijzig" @@ -667,6 +779,12 @@ msgstr "%s opstellen" msgid "No results for \"%s\"." msgstr "Geen resultaten voor \"%s\"." +msgid "This class is marked as deprecated." +msgstr "Deze klasse is gemarkeerd als verouderd." + +msgid "This class is marked as experimental." +msgstr "Deze klasse is gemarkeerd als experimenteel." + msgid "No description available for %s." msgstr "Geen beschrijving beschikbaar voor %s." @@ -757,6 +875,18 @@ msgstr "Tijd" msgid "Calls" msgstr "Aanroepen" +msgid "Linked" +msgstr "Gekoppeld" + +msgid "CPU" +msgstr "CPU" + +msgid "GPU" +msgstr "GPU" + +msgid "Execution resumed." +msgstr "Uitvoering hervat." + msgid "Bytes:" msgstr "Bytes:" @@ -766,30 +896,36 @@ msgstr "Waarschuwing:" msgid "Error:" msgstr "Fout:" -msgid "C++ Error" -msgstr "C++ Fout" +msgid "%s Error" +msgstr "%s Fout" -msgid "C++ Error:" -msgstr "C++ Fout:" +msgid "Stack Trace" +msgstr "Stack Trace" -msgid "Source" -msgstr "Bron" +msgid "Stack Trace:" +msgstr "Stack Trace:" -msgid "C++ Source" -msgstr "C++ Bron" +msgid "Line %d" +msgstr "Regel %d" -msgid "Source:" -msgstr "Bron:" +msgid "Delete Breakpoint" +msgstr "Verwijder Breekpunt" -msgid "C++ Source:" -msgstr "C++ Bron:" +msgid "Delete All Breakpoints in:" +msgstr "Verwijder Alle Breekpunten in:" -msgid "Stack Trace" -msgstr "Stack Trace" +msgid "Delete All Breakpoints" +msgstr "Verwijder Alle Breekpunten" msgid "Copy Error" msgstr "Kopieer Fout" +msgid "Open C++ Source on GitHub" +msgstr "Open C++ Bron op GitHub" + +msgid "C++ Source" +msgstr "C++ Bron" + msgid "Video RAM" msgstr "Videogeheugen" @@ -811,6 +947,9 @@ msgstr "Vervolg" msgid "Stack Frames" msgstr "Stack Frames" +msgid "Filter Stack Variables" +msgstr "Filter Stack Variablen" + msgid "Breakpoints" msgstr "Breekpunten" @@ -823,6 +962,9 @@ msgstr "Alles inklappen" msgid "Profiler" msgstr "Profiler" +msgid "Visual Profiler" +msgstr "Visuele Profiler" + msgid "List of Video Memory Usage by Resource:" msgstr "Lijst van videogeheugengebruik per bron:" @@ -1746,12 +1888,12 @@ msgstr "Laat alle lokalen zien" msgid "Show Selected Locales Only" msgstr "Alleen geselecteerde talen tonen" +msgid "Edit Filters" +msgstr "Filters berwerken" + msgid "Language:" msgstr "Taal:" -msgid "Script" -msgstr "Script" - msgid "Clear Output" msgstr "Uitvoer wissen" @@ -2270,23 +2412,6 @@ msgid "Install from file" msgstr "Installeer Vanuit Bestand" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Hiermee wordt je project ingesteld voor aangepaste Android-builds door de " -"bronsjabloon te installeren naar \"res://android/build\".\n" -"Je kan vervolgens wijzigingen toepassen en je eigen aangepaste APK maken bij " -"export (modules toevoegen, de AndroidManifest.xml aanpassen, enz.).\n" -"Houd er rekening mee dat om aangepaste builds te maken in plaats van vooraf " -"gebouwde APK's te gebruiken, de optie \"Use Custom Build\" moet ingeschakeld " -"zijn in de Android-export preset." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2497,9 +2622,6 @@ msgstr "Sneltoetsen" msgid "Binding" msgstr "Binding" -msgid "%s Error" -msgstr "%s Fout" - msgid "All Devices" msgstr "Alle Apparaten" @@ -3219,6 +3341,9 @@ msgstr "Selecteer en verplaats punten, maak punten aan met RMK." msgid "Enable snap and show grid." msgstr "Kleven inschakelen en raster weergeven." +msgid "Blend:" +msgstr "Mengen:" + msgid "Point" msgstr "Punt" @@ -3261,15 +3386,9 @@ msgstr "Punten en driehoeken wissen." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Genereer geblende driehoeken automatisch (in plaats van handmatig)" -msgid "Blend:" -msgstr "Mengen:" - msgid "Parameter Changed:" msgstr "Parameter veranderd:" -msgid "Edit Filters" -msgstr "Filters berwerken" - msgid "Output node can't be added to the blend tree." msgstr "Uitvoerknoop kan niet worden toegevoegd aan de overgangsboom." @@ -3387,9 +3506,6 @@ msgstr "Speel geselecteerde animatie achterwaarts vanaf huidige positie. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Speel geselecteerde animatie achterwaarts vanaf het einde. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Stop animatie opname. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Speel geselecteerde animatie vanaf het begin. (Shift+D)" @@ -4439,12 +4555,6 @@ msgstr "Verander Notifier AABB" msgid "Change Particles AABB" msgstr "Verander Particles AABB" -msgid "Change Box Shape Extents" -msgstr "Wijzig Box Vorm Extents" - -msgid "Change Probe Extents" -msgstr "Verander Probe Extents" - msgid "Change Capsule Shape Radius" msgstr "Wijzig Capsule Vorm Straal" @@ -4484,6 +4594,9 @@ msgstr "Sleutelinvoer is uitgeschakeld (geen sleutel ingevoegd)." msgid "Animation Key Inserted." msgstr "Animatiesleutel Ingevoegd." +msgid "Objects: %d\n" +msgstr "Objecten: %d\n" + msgid "Top View." msgstr "Bovenaanzicht." @@ -5173,6 +5286,9 @@ msgstr "Standaard" msgid "Connections to method:" msgstr "Verbindingen aan methode:" +msgid "Source" +msgstr "Bron" + msgid "Target" msgstr "Doel" @@ -5396,12 +5512,6 @@ msgstr "(leeg)" msgid "Animations:" msgstr "Animaties:" -msgid "Speed:" -msgstr "Snelheid:" - -msgid "Loop" -msgstr "Lus" - msgid "Animation Frames:" msgstr "Animatiebeelden:" @@ -6323,9 +6433,6 @@ msgstr "Toevoegen Input Action" msgid "Change Action deadzone" msgstr "Wijzig Action Deadzone" -msgid "Add Input Action Event" -msgstr "Toevoegen Input Action Event" - msgid "Erase Input Action" msgstr "Verwijder Input Actie" @@ -6353,9 +6460,6 @@ msgstr "Selecteer Eigenschap" msgid "Select Virtual Method" msgstr "Selecteer Virtuele Method" -msgid "Select Method" -msgstr "Selecteer Method" - msgid "Batch Rename" msgstr "Bulk hernoemen" @@ -7012,12 +7116,6 @@ msgstr "Ongeldige publieke sleutel voor APK -uitbreiding." msgid "Invalid package name:" msgstr "Ongeldige pakketnaam:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Use Custom Build\" moet geactiveerd zijn om plugins te gebruiken." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "\"Export AAB\" is alleen geldig als \"Use Custom Build\" aan staat." - msgid "Invalid filename! Android App Bundle requires the *.aab extension." msgstr "" "Bestandsnaam niet toegestaan! Android App Bundle vereist een *.aab extensie." @@ -7028,13 +7126,6 @@ msgstr "APK Expansion werkt niet samen met Android App Bundle." msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Bestandsnaam niet toegestaan! Android APK vereist een *.apk extensie." -msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Geprobeerd met een eigen bouwsjabloon te bouwen, maar versie info ontbreekt. " -"Installeer alstublieft opnieuw vanuit het 'Project' menu." - msgid "Building Android Project (gradle)" msgstr "Bouwen van Android Project (gradle)" diff --git a/editor/translations/editor/pl.po b/editor/translations/editor/pl.po index 5e3538dca3..68805f2e2d 100644 --- a/editor/translations/editor/pl.po +++ b/editor/translations/editor/pl.po @@ -5,7 +5,7 @@ # 8-bit Pixel <dawdejw@gmail.com>, 2016, 2023. # Adam Wolanski <adam.wolanski94@gmail.com>, 2017. # Adrian WÄ™cÅ‚awski <weclawskiadrian@gmail.com>, 2016. -# aelspire <aelspire@gmail.com>, 2017, 2019, 2020, 2021. +# aelspire <aelspire@gmail.com>, 2017, 2019, 2020, 2021, 2023. # Daniel Lewan <vision360.daniel@gmail.com>, 2016-2018, 2020. # Dariusz Król <rexioweb@gmail.com>, 2018. # heya10 <igor.gielzak@gmail.com>, 2017. @@ -50,7 +50,7 @@ # Suchy Talerz <kacperkubis06@gmail.com>, 2021. # Bartosz Stasiak <bs97086@amu.edu.pl>, 2021. # Marek Malaria <to.tylko.dla.kont@gmail.com>, 2021, 2022. -# Mateusz Å»ak <matisgramy@gmail.com>, 2021, 2022. +# Mateusz Å»ak <matisgramy@gmail.com>, 2021, 2022, 2023. # voltinus <voltinusmail@gmail.com>, 2021. # Lech Migdal <lech.migdal@gmail.com>, 2022. # Piotr <promantix@gmail.com>, 2022. @@ -68,15 +68,16 @@ # Wodorek <Krol.w94@gmail.com>, 2022. # Filip GliszczyÅ„ski <filipgliszczynski@gmail.com>, 2022. # Piotr Åšlusarz <piotrekslusarz@outlook.com>, 2022. -# Jan Kurzak <Iqaz0oki@outlook.com>, 2022. +# Jan Kurzak <Iqaz0oki@outlook.com>, 2022, 2023. # Wojciech Pluta <wojciech.pluta@oracle.com>, 2022. +# mars9t <mars9t.dev@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: RM <synaptykq@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:54+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -85,26 +86,211 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Wymaż" msgid "Physical" msgstr "Fizyczny" +msgid "Left Mouse Button" +msgstr "Lewy przycisk myszy" + +msgid "Right Mouse Button" +msgstr "Prawy przycisk myszy" + +msgid "Middle Mouse Button" +msgstr "Åšrodkowy przycisk myszy" + +msgid "Mouse Wheel Up" +msgstr "Kółko myszy w górÄ™" + +msgid "Mouse Wheel Down" +msgstr "Kółko myszy w dół" + +msgid "Mouse Wheel Left" +msgstr "Kółko myszy w lewo" + +msgid "Mouse Wheel Right" +msgstr "Kółko myszy w prawo" + +msgid "Mouse Thumb Button 1" +msgstr "Boczny przycisk myszki 1" + +msgid "Mouse Thumb Button 2" +msgstr "Boczny przycisk myszki 2" + msgid "Button" msgstr "Przycisk" +msgid "Double Click" +msgstr "Podwójne klikniÄ™cie" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Ruch myszy w pozycji (%s) z prÄ™dkoÅ›ciÄ… (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "OÅ› X lewego drążka, oÅ› X Joysticka 0" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "OÅ› Y lewego drążka, oÅ› Y Joysticka 0" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "OÅ› X prawego drążka, oÅ› X Joysticka 1" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "OÅ› Y prawego drążka, oÅ› Y Joysticka 1" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Drążek 2 oÅ› X, Lewy spust, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Drążek 2 oÅ› Y, Prawy spust, Sony R2, Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "Joystick 3 oÅ› X" + +msgid "Joystick 3 Y-Axis" +msgstr "Joystick 3 oÅ› Y" + +msgid "Joystick 4 X-Axis" +msgstr "OÅ› X joysticka 4" + +msgid "Joystick 4 Y-Axis" +msgstr "OÅ› Y joysticka 4" + +msgid "Unknown Joypad Axis" +msgstr "Nieznana oÅ› joypada" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Ruch joypada na osi %d (%s) o wartoÅ›ci %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Dolna akcja, Sony krzyżyk, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Prawa akcja, Sony kółko, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Lewa akcja, Sony kwadrat, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Górna akcja, Sony trójkÄ…t, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Powrót, Sony wybór, Xbox powrót, Nintendo -" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "Przewodnik, Sony PS, Xbox Home" + +msgid "Start, Nintendo +" +msgstr "Start, Nintendo +" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "Lewy drążek, Sony L3, Xbox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "Prawy drążek, Sony R3, Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "Lewy bumper, Sony L1, Xbox LB" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "Prawy bumper, Sony R1, Xbox RB" + +msgid "D-pad Up" +msgstr "D-pad w górÄ™" + +msgid "D-pad Down" +msgstr "D-pad w dół" + +msgid "D-pad Left" +msgstr "D-pad w lewo" + +msgid "D-pad Right" +msgstr "D-pad w prawo" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox udostÄ™pnij, PS5 mikrofon, Nintendo zrzut" + +msgid "Xbox Paddle 1" +msgstr "Xbox paletka 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox paletka 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox paletka 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox paletka 4" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 panel dotykowy" + +msgid "touched" +msgstr "dotkniÄ™ty" + +msgid "released" +msgstr "puszczony" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Ekran %s w (%s) z %s punktami dotyku" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "" +"Ekran przeciÄ…gniÄ™ty z %s punktami dotyku na pozycji (%s) z prÄ™dkoÅ›ciÄ… (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Gest przybliżenia w (%s) ze współczynnikiem %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Gest przesuwania w (%s) z przesuniÄ™ciem (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "WejÅ›cie MIDI na kanale=%s wiadomość=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Zdarzenie wejÅ›cia ze skrótem=%s" + +msgid "Accept" +msgstr "Akceptuj" + msgid "Select" msgstr "Zaznacz" msgid "Cancel" msgstr "Anuluj" +msgid "Focus Next" +msgstr "Zaznacz nastÄ™pny" + +msgid "Focus Prev" +msgstr "Zaznacz poprzedni" + +msgid "Left" +msgstr "Lewo" + +msgid "Right" +msgstr "Prawo" + msgid "Up" msgstr "Góra" msgid "Down" msgstr "Dół" +msgid "Page Up" +msgstr "Strona w górÄ™" + +msgid "Page Down" +msgstr "Strona w dół" + +msgid "Home" +msgstr "Strona główna" + msgid "End" msgstr "Koniec" @@ -123,24 +309,126 @@ msgstr "Cofnij" msgid "Redo" msgstr "Ponów" +msgid "Completion Query" +msgstr "Zapytanie uzupeÅ‚nienia" + +msgid "New Line" +msgstr "Nowa linia" + +msgid "New Blank Line" +msgstr "Nowa pusta linia" + +msgid "New Line Above" +msgstr "Nowa linia powyżej" + msgid "Indent" msgstr "WciÄ™cie" +msgid "Dedent" +msgstr "WciÄ™cie" + +msgid "Backspace" +msgstr "Backspace" + +msgid "Backspace Word" +msgstr "Backspace na sÅ‚owo" + +msgid "Backspace all to Left" +msgstr "Backspace na wszystko po lewej" + msgid "Delete" msgstr "UsuÅ„" +msgid "Delete Word" +msgstr "UsuÅ„ sÅ‚owo" + +msgid "Delete all to Right" +msgstr "UsuÅ„ wszystko po prawej" + +msgid "Caret Left" +msgstr "Kursor w lewo" + +msgid "Caret Word Left" +msgstr "Kursor w lewo o sÅ‚owo" + +msgid "Caret Right" +msgstr "Kursor w prawo" + +msgid "Caret Word Right" +msgstr "Kursor w prawo o sÅ‚owo" + +msgid "Caret Up" +msgstr "Kursor w górÄ™" + +msgid "Caret Down" +msgstr "Kursor w dół" + +msgid "Caret Line Start" +msgstr "Kursor na poczÄ…tek linii" + +msgid "Caret Line End" +msgstr "Kursor na koniec linii" + +msgid "Caret Page Up" +msgstr "Kursor w górÄ™ o stronÄ™" + +msgid "Caret Page Down" +msgstr "Kursor w dół o stronÄ™" + +msgid "Caret Document Start" +msgstr "Kursor na poczÄ…tek dokumentu" + +msgid "Caret Document End" +msgstr "Kursor na koniec dokumentu" + +msgid "Caret Add Below" +msgstr "Dodaj kursor niżej" + +msgid "Caret Add Above" +msgstr "Dodaj kursor wyżej" + +msgid "Scroll Up" +msgstr "PrzewiÅ„ w górÄ™" + +msgid "Scroll Down" +msgstr "PrzewiÅ„ w dół" + msgid "Select All" msgstr "Zaznacz wszystko" +msgid "Select Word Under Caret" +msgstr "Zaznacz sÅ‚owo pod kursorem" + +msgid "Add Selection for Next Occurrence" +msgstr "Dodaj zaznaczenie na nastÄ™pne wystÄ…pienie" + +msgid "Clear Carets and Selection" +msgstr "Wyczyść kursory i zaznaczenie" + +msgid "Toggle Insert Mode" +msgstr "PrzeÅ‚Ä…cz tryb wstawiania" + +msgid "Text Submitted" +msgstr "Tekst przedÅ‚ożony" + msgid "Duplicate Nodes" msgstr "Duplikuj wÄ™zÅ‚y" msgid "Delete Nodes" msgstr "UsuÅ„ wÄ™zÅ‚y" +msgid "Go Up One Level" +msgstr "Idź w górÄ™ jeden poziom" + msgid "Refresh" msgstr "OdÅ›wież" +msgid "Show Hidden" +msgstr "Pokaż ukryte" + +msgid "Swap Input Direction" +msgstr "ZamieÅ„ kierunek wejÅ›cia" + msgid "Invalid input %d (not passed) in expression" msgstr "NiewÅ‚aÅ›ciwe dane %d (nie przekazane) w wyrażeniu" @@ -163,6 +451,12 @@ msgstr "Niepoprawne argumenty do utworzenia \"%s\"" msgid "On call to '%s':" msgstr "Przy wywoÅ‚aniu \"%s\":" +msgid "Built-in script" +msgstr "Skrypt wbudowany" + +msgid "Built-in" +msgstr "Wbudowany" + msgid "B" msgstr "B" @@ -184,6 +478,9 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "PrzykÅ‚ad: %s" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -197,9 +494,33 @@ msgstr "Akcja o nazwie \"%s\" już istnieje." msgid "Add Event" msgstr "Dodaj zdarzenie" +msgid "Remove Action" +msgstr "UsuÅ„ akcjÄ™" + +msgid "Cannot Remove Action" +msgstr "Nie można usunąć akcji" + +msgid "Edit Event" +msgstr "Edytuj zdarzenie" + +msgid "Remove Event" +msgstr "UsuÅ„ zdarzenie" + +msgid "Filter by name..." +msgstr "Filtruj po nazwie..." + +msgid "Clear All" +msgstr "Wyczyść wszystko" + +msgid "Add New Action" +msgstr "Dodaj nowÄ… akcjÄ™" + msgid "Add" msgstr "Dodaj" +msgid "Show Built-in Actions" +msgstr "Pokaż wbudowane akcje" + msgid "Action" msgstr "Akcja" @@ -212,6 +533,9 @@ msgstr "Czas:" msgid "Value:" msgstr "Wartość:" +msgid "Update Selected Key Handles" +msgstr "Aktualizuj zaznaczone uchwyty klucza" + msgid "Insert Key Here" msgstr "Wstaw klucz tutaj" @@ -221,12 +545,69 @@ msgstr "Duplikuj zaznaczone klucz(e)" msgid "Delete Selected Key(s)" msgstr "UsuÅ„ zaznaczony klucz(e)" +msgid "Make Handles Free" +msgstr "Uwolnij uchwyty" + +msgid "Make Handles Linear" +msgstr "UczyÅ„ uchwyty liniowymi" + +msgid "Make Handles Balanced" +msgstr "UczyÅ„ uchwyty zrównoważonymi" + +msgid "Make Handles Mirrored" +msgstr "UczyÅ„ uchwyty odbitymi" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "UczyÅ„ uchwyty zrównoważonymi (automatyczne styczne)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "UczyÅ„ uchwyty odbitymi (automatyczne styczne)" + msgid "Add Bezier Point" msgstr "Dodaj punkt krzywej Beziera" msgid "Move Bezier Points" msgstr "PrzesuÅ„ punkty krzywej Beziera" +msgid "Animation Duplicate Keys" +msgstr "Animacja duplikuj klucze" + +msgid "Animation Delete Keys" +msgstr "Animacja usuÅ„ klucze" + +msgid "Focus" +msgstr "Zaznacz" + +msgid "Select All Keys" +msgstr "Zaznacz wszystkie klucze" + +msgid "Deselect All Keys" +msgstr "Odznacz wszystkie klucze" + +msgid "Animation Change Transition" +msgstr "Animacja zmieÅ„ przejÅ›cie" + +msgid "Animation Change %s" +msgstr "Animacja zmieÅ„ %s" + +msgid "Animation Change Keyframe Value" +msgstr "Animacja zmieÅ„ wartość klatki kluczowej" + +msgid "Animation Change Call" +msgstr "Animacja zmieÅ„ wywoÅ‚anie" + +msgid "Animation Multi Change Transition" +msgstr "Animacja zmieÅ„ wiele przejść" + +msgid "Animation Multi Change %s" +msgstr "Animacja zmieÅ„ wiele %s" + +msgid "Animation Multi Change Keyframe Value" +msgstr "Animacja zmieÅ„ wartoÅ›ci wielu klatek kluczowych" + +msgid "Animation Multi Change Call" +msgstr "Animacja zmieÅ„ wiele wywoÅ‚aÅ„" + msgid "Change Animation Length" msgstr "ZmieÅ„ dÅ‚ugość animacji" @@ -638,6 +1019,9 @@ msgstr "Z sygnaÅ‚u:" msgid "Scene does not contain any script." msgstr "Scena nie posiada żadnego skryptu." +msgid "Select Method" +msgstr "Wybierz metodÄ™" + msgid "Remove" msgstr "UsuÅ„" @@ -697,9 +1081,6 @@ msgstr "RozÅ‚Ä…cz" msgid "Connect a Signal to a Method" msgstr "PoÅ‚Ä…cz sygnaÅ‚ do metody" -msgid "Edit Connection:" -msgstr "Edytuj poÅ‚Ä…czenie:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Na pewno chcesz usunąć wszystkie poÅ‚Ä…czenia z sygnaÅ‚u \"%s\"?" @@ -841,23 +1222,8 @@ msgstr "Ostrzeżenie:" msgid "Error:" msgstr "BÅ‚Ä…d:" -msgid "C++ Error" -msgstr "BÅ‚Ä…d C++" - -msgid "C++ Error:" -msgstr "BÅ‚Ä…d C++:" - -msgid "Source" -msgstr "ŹródÅ‚o" - -msgid "C++ Source" -msgstr "ŹródÅ‚o C++" - -msgid "Source:" -msgstr "ŹródÅ‚o:" - -msgid "C++ Source:" -msgstr "ŹródÅ‚o C++:" +msgid "%s Error" +msgstr "BÅ‚Ä…d %s" msgid "Stack Trace" msgstr "Åšlad stosu" @@ -868,6 +1234,9 @@ msgstr "Kopiuj bÅ‚Ä…d" msgid "Open C++ Source on GitHub" msgstr "Otwórz źródÅ‚o C++ na GitHubie" +msgid "C++ Source" +msgstr "ŹródÅ‚o C++" + msgid "Video RAM" msgstr "Wideo RAM" @@ -1064,7 +1433,7 @@ msgstr "Deweloper naczelny" msgctxt "Job Title" msgid "Project Manager" -msgstr "Kierownik projektu" +msgstr "Menedżer projektu" msgid "Developers" msgstr "Deweloperzy" @@ -1685,6 +2054,12 @@ msgstr "nadpisuje %s:" msgid "default:" msgstr "domyÅ›lne:" +msgid "Constructors" +msgstr "Konstruktory" + +msgid "Operators" +msgstr "Operatory" + msgid "Theme Properties" msgstr "WÅ‚aÅ›ciwoÅ›ci motywu" @@ -1719,9 +2094,15 @@ msgstr "" "Obecnie nie ma opisu dla tej wÅ‚aÅ›ciwoÅ›ci. Pomóż nam, [color=$color]" "[url=$url]wysyÅ‚ajÄ…c jÄ…[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "Opisy konstruktorów" + msgid "Method Descriptions" msgstr "Opisy metod" +msgid "Operator Descriptions" +msgstr "Opisy operatorów" + msgid "%d match." msgstr "%d dopasowanie." @@ -1823,12 +2204,12 @@ msgstr "Pokaż wszystkie jÄ™zyki" msgid "Show Selected Locales Only" msgstr "Pokaż tylko wybrane jÄ™zyki" +msgid "Edit Filters" +msgstr "Edytuj filtry" + msgid "Language:" msgstr "JÄ™zyk:" -msgid "Script" -msgstr "Skrypt" - msgid "Clear Output" msgstr "Wyczyść wyjÅ›cie" @@ -1982,13 +2363,13 @@ msgid "Quick Open Script..." msgstr "Szybkie otwieranie skryptu..." msgid "Save & Reload" -msgstr "Zapisz i zrestartuj" +msgstr "Zapisz i przeÅ‚aduj" msgid "Save & Quit" msgstr "Zapisz i wyjdź" msgid "Save changes to '%s' before reloading?" -msgstr "Zapisać zmiany w '%s' przed zrestartowaniem?" +msgstr "Zapisać zmiany w \"%s\" przed przeÅ‚adowaniem?" msgid "Save changes to '%s' before closing?" msgstr "Zapisać zmiany w \"%s\" przed zamkniÄ™ciem?" @@ -2045,7 +2426,7 @@ msgid "Quick Run Scene..." msgstr "Szybkie uruchomienie sceny..." msgid "Save changes to the following scene(s) before reloading?" -msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed zrestartowaniem?" +msgstr "Czy zapisać zmiany w nastÄ™pujÄ…cej scenie/scenach przed przeÅ‚adowaniem?" msgid "Save changes to the following scene(s) before quitting?" msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed wyjÅ›ciem?" @@ -2345,7 +2726,7 @@ msgid "Compatibility" msgstr "Kompatybilność" msgid "Update Continuously" -msgstr "Aktualizuj ciÄ…gle" +msgstr "Stale Aktualizuj" msgid "Hide Update Spinner" msgstr "Ukryj wiatraczek aktualizacji" @@ -2378,22 +2759,6 @@ msgid "Install from file" msgstr "Zainstaluj z pliku" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Ta opcja przygotuje twój projekt dla wÅ‚asnych buildów Androida, instalujÄ…c " -"źródÅ‚owy szablon w \"res://android/build\".\n" -"Możesz wtedy dodać modyfikacje i zbudować podczas eksportu wÅ‚asny pakiet APK " -"(dodajÄ…c moduÅ‚y, zmieniajÄ…c AndroidManifest.xml itp.)\n" -"PamiÄ™taj, że aby stworzyć wÅ‚asny build zamiast używać gotowego APK, opcja " -"\"Use Custom Build\" powinna być wÅ‚Ä…czona w profilu eksportu Androida." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2616,9 +2981,6 @@ msgstr "Skróty" msgid "Binding" msgstr "WiÄ…zanie" -msgid "%s Error" -msgstr "BÅ‚Ä…d %s" - msgid "All Devices" msgstr "Wszystkie urzÄ…dzenia" @@ -2886,6 +3248,14 @@ msgstr "" msgid "Runnable" msgstr "Uruchamiany" +msgid "Export the project for all the presets defined." +msgstr "Eksportuj projekt dla wszystkich zdefiniowanych presetów." + +msgid "All presets must have an export path defined for Export All to work." +msgstr "" +"Wszystkie ustawienia wstÄ™pne muszÄ… mieć zdefiniowanÄ… Å›cieżkÄ™ eksportu, aby " +"fukcja Eksportuj wszystko dziaÅ‚aÅ‚a." + msgid "Delete preset '%s'?" msgstr "Usunąć profil \"%s\"?" @@ -2965,6 +3335,13 @@ msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" msgstr "" "NieprawidÅ‚owy klucz szyfrowania (dÅ‚ugość musi wynosić 64 znaki szesnastkowe)" +msgid "" +"Note: Encryption key needs to be stored in the binary,\n" +"you need to build the export templates from source." +msgstr "" +"Uwaga: Klucz szyfrowania musi być przechowywany w postaci binarnej,\n" +"musisz zbudować szablony eksportu ze źródÅ‚a." + msgid "Export All" msgstr "Eksportuj wszystko" @@ -3516,6 +3893,9 @@ msgstr "Wybierz i przesuÅ„ punkty, utwórz punkty używajÄ…c PPM." msgid "Enable snap and show grid." msgstr "WÅ‚Ä…cz przyciÄ…ganie i pokaż siatkÄ™." +msgid "Blend:" +msgstr "Mieszanie:" + msgid "Point" msgstr "Punkt" @@ -3558,15 +3938,9 @@ msgstr "UsuÅ„ punkty i trójkÄ…ty." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Wygeneruj trójkÄ…ty mieszania automatycznie (zamiast rÄ™cznie)" -msgid "Blend:" -msgstr "Mieszanie:" - msgid "Parameter Changed:" msgstr "Parametr zmieniony:" -msgid "Edit Filters" -msgstr "Edytuj filtry" - msgid "Output node can't be added to the blend tree." msgstr "WÄ™zeÅ‚ wyjÅ›ciowy nie może być dodany do drzewa mieszania." @@ -3689,9 +4063,6 @@ msgstr "Odtwórz zaznaczonÄ… animacjÄ™ od tyÅ‚u z aktualnej pozycji. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Odtwórz zaznaczonÄ… animacjÄ™ od tyÅ‚u z koÅ„ca. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Zatrzymaj animacjÄ™. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Uruchom animacjÄ™ od poczÄ…tku. (Shift+D)" @@ -4343,10 +4714,10 @@ msgid "Clear Pose" msgstr "Wyczyść pozÄ™" msgid "Multiply grid step by 2" -msgstr "PowiÄ™ksz siatkÄ™ x2" +msgstr "ZwiÄ™ksz rozdzielczość siatki 2 razy" msgid "Divide grid step by 2" -msgstr "Pomniejsz siatkÄ™ x2" +msgstr "Zmniejsz rozdzielczość siatki 2 razy" msgid "Adding %s..." msgstr "Dodawanie %s..." @@ -4651,7 +5022,7 @@ msgid "Bake Lightmaps" msgstr "Stwórz Lightmaps" msgid "LightMap Bake" -msgstr "Wypal mapÄ™ Å›wiatÅ‚a" +msgstr "Stwórz mapÄ™ Å›wiatÅ‚a" msgid "Select lightmap bake file:" msgstr "Wybierz plik wypalenia mapy Å›wiatÅ‚a:" @@ -4916,14 +5287,8 @@ msgstr "ZmieÅ„ AABB powiadamiacza" msgid "Change Particles AABB" msgstr "ZmieÅ„ AABB czÄ…steczek" -msgid "Change Box Shape Extents" -msgstr "ZmieÅ„ rozmiar Box Shape" - -msgid "Change Probe Extents" -msgstr "ZmieÅ„ rozmiar Probe" - msgid "Change Capsule Shape Radius" -msgstr "ZmieÅ„ Å›rednicÄ™ Capsule Shape" +msgstr "ZmieÅ„ promieÅ„ Capsule Shape" msgid "Change Capsule Shape Height" msgstr "ZmieÅ„ wysokość ksztaÅ‚tu kapsuÅ‚y" @@ -5174,7 +5539,7 @@ msgid "Orbit View Up" msgstr "Widok Orbitalny z Góry" msgid "Orbit View 180" -msgstr "Orbituj widok o 180" +msgstr "Orbitalny Widok 180" msgid "Switch Perspective/Orthogonal View" msgstr "PrzeÅ‚Ä…cz widok perspektywiczny/ortogonalny" @@ -5727,6 +6092,9 @@ msgstr "Standardowy" msgid "Connections to method:" msgstr "PoÅ‚Ä…czenia do metody:" +msgid "Source" +msgstr "ŹródÅ‚o" + msgid "Target" msgstr "Cel" @@ -5972,12 +6340,6 @@ msgstr "(pusty)" msgid "Animations:" msgstr "Animacje:" -msgid "Speed:" -msgstr "Szybkość:" - -msgid "Loop" -msgstr "ZapÄ™tl" - msgid "Animation Frames:" msgstr "Klatki animacji:" @@ -7360,9 +7722,6 @@ msgstr "Dodawanie akcji WejÅ›cia" msgid "Change Action deadzone" msgstr "ZmieÅ„ martwÄ… strefÄ™ akcji" -msgid "Add Input Action Event" -msgstr "Dodaj zdarzenie akcji wejÅ›cia" - msgid "Erase Input Action" msgstr "Wyczyść akcjÄ™ wejÅ›cia" @@ -7390,9 +7749,6 @@ msgstr "Wybierz wÅ‚aÅ›ciwość" msgid "Select Virtual Method" msgstr "Wybierz metoda wirtualnÄ…" -msgid "Select Method" -msgstr "Wybierz metodÄ™" - msgid "Batch Rename" msgstr "Grupowa zmiana nazwy" @@ -8147,13 +8503,6 @@ msgstr "Niepoprawny klucz publiczny dla ekspansji APK." msgid "Invalid package name:" msgstr "Niepoprawna nazwa paczki:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Use Custom Build\" musi być wÅ‚Ä…czone, by używać wtyczek." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Eksportuj AAB\" jest ważne tylko gdy \"Use Custom Build\" jest wÅ‚Ä…czone." - msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -8196,13 +8545,6 @@ msgid "Unsupported export format!" msgstr "NieobsÅ‚ugiwany format eksportu!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Próbowano zbudować z wÅ‚asnego szablonu, ale nie istnieje dla niego " -"informacja o wersji. Zainstaluj ponownie z menu \"Projekt\"." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/pt.po b/editor/translations/editor/pt.po index 52ca5759dc..b9cf75e6c7 100644 --- a/editor/translations/editor/pt.po +++ b/editor/translations/editor/pt.po @@ -605,6 +605,9 @@ msgstr "Do Sinal:" msgid "Scene does not contain any script." msgstr "A cena não contém qualquer script." +msgid "Select Method" +msgstr "Selecione Método" + msgid "Remove" msgstr "Remover" @@ -662,9 +665,6 @@ msgstr "Desligar" msgid "Connect a Signal to a Method" msgstr "Conectar Sinal a Método" -msgid "Edit Connection:" -msgstr "Editar Conexão:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Deseja remover todas as conexões do sinal \"%s\"?" @@ -809,23 +809,8 @@ msgstr "Aviso:" msgid "Error:" msgstr "Erro:" -msgid "C++ Error" -msgstr "Erro C++" - -msgid "C++ Error:" -msgstr "Erro C++:" - -msgid "Source" -msgstr "Fonte" - -msgid "C++ Source" -msgstr "Código-fonte C++" - -msgid "Source:" -msgstr "Código-fonte:" - -msgid "C++ Source:" -msgstr "Código-fonte C++:" +msgid "%s Error" +msgstr "%s Erro" msgid "Stack Trace" msgstr "Rastreamento de Pilha" @@ -836,6 +821,9 @@ msgstr "Copiar Erro" msgid "Open C++ Source on GitHub" msgstr "Abrir Código C++ no GitHub" +msgid "C++ Source" +msgstr "Código-fonte C++" + msgid "Video RAM" msgstr "Memória VÃdeo" @@ -1796,12 +1784,12 @@ msgstr "Mostrar Todos os Idiomas" msgid "Show Selected Locales Only" msgstr "Mostrar Apenas Idiomas Selecionados" +msgid "Edit Filters" +msgstr "Editar filtros" + msgid "Language:" msgstr "Linguagem:" -msgid "Script" -msgstr "Script" - msgid "Variant" msgstr "Variante" @@ -2356,23 +2344,6 @@ msgid "Install from file" msgstr "Instalar do ficheiro" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"O projeto será preparado para compilações personalizadas Android com a " -"instalação do modelo fonte em \"res://android/build\".\n" -"Poderá depois aplicar modificações e compilar o seu APK personalizado a " -"exportar (com adição de módulos, a alterar AndroidManifest.xml, etc.).\n" -"Repare que de forma a criar compilações personalizadas em vez de usar APKs " -"pré-compilados, a opção \"Use Custom Build\" deve ser ativada na " -"predefinição da exportação Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2599,9 +2570,6 @@ msgstr "Atalhos" msgid "Binding" msgstr "Ligação" -msgid "%s Error" -msgstr "%s Erro" - msgid "All Devices" msgstr "Todos os Aparelhos" @@ -3538,6 +3506,9 @@ msgstr "Selecionar e mover pontos, criar pontos com RMB." msgid "Enable snap and show grid." msgstr "Ativar ajuste e mostrar a grelha." +msgid "Blend:" +msgstr "Mistura:" + msgid "Point" msgstr "Ponto" @@ -3580,15 +3551,9 @@ msgstr "Apagar pontos e triângulos." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Gera triângulos automaticamente (em vez de manual)" -msgid "Blend:" -msgstr "Mistura:" - msgid "Parameter Changed:" msgstr "Parâmetro Alterado:" -msgid "Edit Filters" -msgstr "Editar filtros" - msgid "Output node can't be added to the blend tree." msgstr "SaÃda do nó não pode ser adicionada à árvore de mistura." @@ -3712,9 +3677,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Reproduzir a Animação selecionada para trás a partir do fim. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Parar reprodução da Animação. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Reproduzir a Animação selecionada a partir do inÃcio. (Shift+D)" @@ -4938,12 +4900,6 @@ msgstr "Mudar Notificador AABB" msgid "Change Particles AABB" msgstr "Mudar partÃculas AABB" -msgid "Change Box Shape Extents" -msgstr "Mudar medidas da forma caixa" - -msgid "Change Probe Extents" -msgstr "Mudar Extensões de Sonda" - msgid "Change Capsule Shape Radius" msgstr "Mudar raio da forma cápsula" @@ -5758,6 +5714,9 @@ msgstr "Padrão" msgid "Connections to method:" msgstr "Conexões ao método:" +msgid "Source" +msgstr "Fonte" + msgid "Target" msgstr "Alvo" @@ -5999,12 +5958,6 @@ msgstr "(vazio)" msgid "Animations:" msgstr "Animações:" -msgid "Speed:" -msgstr "Velocidade:" - -msgid "Loop" -msgstr "Ciclo" - msgid "Animation Frames:" msgstr "Frames da Animação:" @@ -7430,9 +7383,6 @@ msgstr "Adicionar ação de entrada" msgid "Change Action deadzone" msgstr "Mudar a zona morta da Ação" -msgid "Add Input Action Event" -msgstr "Adicionar evento ação de entrada" - msgid "Erase Input Action" msgstr "Apagar Ação de Entrada" @@ -7460,9 +7410,6 @@ msgstr "Selecionar Propriedade" msgid "Select Virtual Method" msgstr "Selecione Método virtual" -msgid "Select Method" -msgstr "Selecione Método" - msgid "Batch Rename" msgstr "Renomear em Massa" @@ -8249,21 +8196,9 @@ msgstr "Chave pública inválida para expansão APK." msgid "Invalid package name:" msgstr "Nome de pacote inválido:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Use Custom Build\" têm de estar ativa para usar os plugins." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "\"Exportar AAB\" só é válido quando \"Use Custom Build\" está ativa." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Min SDK\" só pode ser substituÃdo quando \"Usar Compilação Customizada\" " -"está ativado." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é " @@ -8277,12 +8212,6 @@ msgstr "" "biblioteca Godot." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Target SDK\" só pode ser substituÃdo quando \"Usar Compilação " -"Customizada\" está ativado." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é " @@ -8348,13 +8277,6 @@ msgid "Unsupported export format!" msgstr "Formato de exportação não suportado!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"A tentar compilar a partir de um modelo personalizado, mas sem informação de " -"versão. Reinstale no menu 'Projeto'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/pt_BR.po b/editor/translations/editor/pt_BR.po index 16d1667b1f..8c0eb9e29b 100644 --- a/editor/translations/editor/pt_BR.po +++ b/editor/translations/editor/pt_BR.po @@ -157,13 +157,14 @@ # Kauã Azevedo <Kazevic@pm.me>, 2022. # Zer0-Zer0 <dankmemerson@tutanota.com>, 2022. # Levi Ferreira <leviferreiramorais@gmail.com>, 2023. +# Leonardo <leotada523@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2023-01-14 00:01+0000\n" -"Last-Translator: Levi Ferreira <leviferreiramorais@gmail.com>\n" +"PO-Revision-Date: 2023-02-08 18:01+0000\n" +"Last-Translator: Leonardo <leotada523@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -171,14 +172,29 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Physical" msgstr "FÃsico" +msgid "Left Mouse Button" +msgstr "Botão Esquerdo do Mouse" + +msgid "Right Mouse Button" +msgstr "Botão Direito do Mouse" + +msgid "Mouse Wheel Down" +msgstr "Roda do mouse para baixo" + msgid "Button" msgstr "Botão" +msgid "Double Click" +msgstr "Clique Duplo" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Movimento do mouse na posição (%s) com velocidade (%s)" + msgid "Select" msgstr "Selecionar" @@ -730,6 +746,9 @@ msgstr "Sinal Origem:" msgid "Scene does not contain any script." msgstr "A cena não contém nenhum script." +msgid "Select Method" +msgstr "Selecionar Mtéodo" + msgid "Remove" msgstr "Remover" @@ -786,9 +805,6 @@ msgstr "Desconectar" msgid "Connect a Signal to a Method" msgstr "Conectar um Sinal a um Método" -msgid "Edit Connection:" -msgstr "Editar Conexão:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Tem certeza que quer remover todas as conexões do sinal \"%s\"?" @@ -933,23 +949,8 @@ msgstr "Aviso:" msgid "Error:" msgstr "Erro:" -msgid "C++ Error" -msgstr "Erro C++" - -msgid "C++ Error:" -msgstr "Erro C++:" - -msgid "Source" -msgstr "Origem" - -msgid "C++ Source" -msgstr "Origem C++" - -msgid "Source:" -msgstr "Origem:" - -msgid "C++ Source:" -msgstr "Origem C++:" +msgid "%s Error" +msgstr "Erro %s" msgid "Stack Trace" msgstr "Rastreamento de pilha" @@ -960,6 +961,9 @@ msgstr "Copiar Erro" msgid "Open C++ Source on GitHub" msgstr "Abrir código C++ no GitHub" +msgid "C++ Source" +msgstr "Origem C++" + msgid "Video RAM" msgstr "Memória de VÃdeo" @@ -1783,6 +1787,9 @@ msgstr "substitui %s:" msgid "default:" msgstr "padrão:" +msgid "Constructors" +msgstr "Construtores" + msgid "Theme Properties" msgstr "Propriedades do Tema" @@ -1920,12 +1927,12 @@ msgstr "Mostrar todos os Locales" msgid "Show Selected Locales Only" msgstr "Mostrar apenas os Locales selecionados" +msgid "Edit Filters" +msgstr "Editar Filtros" + msgid "Language:" msgstr "Idioma:" -msgid "Script" -msgstr "Script" - msgid "Variant" msgstr "Variante" @@ -2486,23 +2493,6 @@ msgid "Install from file" msgstr "Instalar do arquivo" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Isso irá configurar o projeto para usar uma build do Android customizada " -"instalando a template raiz para \"res://android/build\".\n" -"Você poderá aplicar modificações e construir um APK customizado em exportar " -"(adicionando módulos, changing the AndroidManifest.xml, etc.).\n" -"Note que para fazer builds customizadas ao invés de usar APKs pré-" -"construÃdas, a opção \"Usar Build Customizada\" deve sestar habilitada na " -"pré-configuração de exportação Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2729,9 +2719,6 @@ msgstr "Atalhos" msgid "Binding" msgstr "VInculamento" -msgid "%s Error" -msgstr "Erro %s" - msgid "All Devices" msgstr "Todos os dispositivos" @@ -3676,6 +3663,9 @@ msgstr "Selecionar e mover pontos, criar pontos com o botão direito do mouse." msgid "Enable snap and show grid." msgstr "Habilitar snap e mostrar a grade." +msgid "Blend:" +msgstr "Misturar:" + msgid "Point" msgstr "Ponto" @@ -3718,15 +3708,9 @@ msgstr "Apagar pontos e triângulos." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Gerar triângulos de mistura automaticamente (em vez de manualmente)" -msgid "Blend:" -msgstr "Misturar:" - msgid "Parameter Changed:" msgstr "Parâmetro Modificado:" -msgid "Edit Filters" -msgstr "Editar Filtros" - msgid "Output node can't be added to the blend tree." msgstr "Nó de SaÃda não pode ser adicionado à árvore de mistura." @@ -3853,9 +3837,6 @@ msgid "Play selected animation backwards from end. (Shift+A)" msgstr "" "Iniciar animação selecionada de trás pra frente a partir do fim. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Parar reprodução da animação. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Reproduzir animação selecionada do inÃcio. (Shift +D)" @@ -5084,12 +5065,6 @@ msgstr "Alterar o AABB do Notificador" msgid "Change Particles AABB" msgstr "Alterar o AABB das PartÃculas" -msgid "Change Box Shape Extents" -msgstr "Alterar Dimensões da Forma da Caixa" - -msgid "Change Probe Extents" -msgstr "Alterar a Extensão da Sonda" - msgid "Change Capsule Shape Radius" msgstr "Alterar o Raio da Forma da Cápsula" @@ -5907,6 +5882,9 @@ msgstr "Padrão" msgid "Connections to method:" msgstr "Conexões com o método:" +msgid "Source" +msgstr "Origem" + msgid "Target" msgstr "Destino" @@ -6150,12 +6128,6 @@ msgstr "(vazio)" msgid "Animations:" msgstr "Animações:" -msgid "Speed:" -msgstr "Velocidade:" - -msgid "Loop" -msgstr "Repetir" - msgid "Animation Frames:" msgstr "Frames da Animação:" @@ -7582,9 +7554,6 @@ msgstr "Adicionar Ação de Entrada" msgid "Change Action deadzone" msgstr "Alterar zona morta de ação" -msgid "Add Input Action Event" -msgstr "Adicionar Evento de Ação de Entrada" - msgid "Erase Input Action" msgstr "Apagar Ação de Entrada" @@ -7612,9 +7581,6 @@ msgstr "Selecionar Propriedade" msgid "Select Virtual Method" msgstr "Selecionar Método Virtual" -msgid "Select Method" -msgstr "Selecionar Mtéodo" - msgid "Batch Rename" msgstr "Renomear em lote" @@ -8406,25 +8372,9 @@ msgstr "Chave pública inválida para expansão do APK." msgid "Invalid package name:" msgstr "Nome de pacote inválido:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"\"Usar Compilação Customizada\" precisa estar ativo para ser possÃvel " -"utilizar plugins." - msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"." -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Exportar AAB\" só é válido quando \"Usar Compilação Customizada\" está " -"habilitado." - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Min SDK\" só pode ser substituÃdo quando \"Usar Compilação Customizada\" " -"está habilitado." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é " @@ -8438,12 +8388,6 @@ msgstr "" "biblioteca Godot." msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "" -"\"Target SDK\" só pode ser substituÃdo quando \"Usar Compilação " -"Customizada\" está habilitado." - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" "\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é " @@ -8510,14 +8454,6 @@ msgid "Unsupported export format!" msgstr "Formato de exportação não suportado!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Tentando construir a partir de um modelo compilado personalizado, mas " -"nenhuma informação de versão para ele existe. Por favor, reinstale pelo menu " -"'Projeto'." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/ro.po b/editor/translations/editor/ro.po index 9ce1876a95..a39d4983a7 100644 --- a/editor/translations/editor/ro.po +++ b/editor/translations/editor/ro.po @@ -569,9 +569,6 @@ msgstr "DeconectaÈ›i" msgid "Connect a Signal to a Method" msgstr "ConectaÈ›i Semnal la o Metodă" -msgid "Edit Connection:" -msgstr "Modifică Conexiunea:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "EÈ™ti sigur că vrei să È™tergi toate conexiunile de la semnalul \"%s\"?" @@ -662,18 +659,6 @@ msgstr "Apeluri" msgid "Error:" msgstr "Eroare:" -msgid "C++ Error" -msgstr "Eroare C++" - -msgid "C++ Error:" -msgstr "Eroare C++:" - -msgid "Source:" -msgstr "Sursă:" - -msgid "C++ Source:" -msgstr "Sursă C++:" - msgid "Expand All" msgstr "Extinde Toate" @@ -1478,6 +1463,9 @@ msgstr "RedimensionaÈ›i Array-ul" msgid "Set Multiple:" msgstr "Seteaza Multiple:" +msgid "Edit Filters" +msgstr "Editează Filtrele" + msgid "Clear Output" msgstr "Curăță AfiÈ™area" @@ -2418,18 +2406,15 @@ msgstr "Mută punct nod" msgid "Change BlendSpace1D Labels" msgstr "Modifică etichetele BlendSpace1D" -msgid "Triangle already exists." -msgstr "Triunghiul există deja." - msgid "Blend:" msgstr "Amestec:" +msgid "Triangle already exists." +msgstr "Triunghiul există deja." + msgid "Parameter Changed:" msgstr "Parametru modificat:" -msgid "Edit Filters" -msgstr "Editează Filtrele" - msgid "Toggle Filter On/Off" msgstr "Comutare filtru activat/dezactivat" @@ -2487,9 +2472,6 @@ msgstr "Rulează animaÈ›ia selectată în sens invers de la poziÈ›ia curentă. ( msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Rulează animaÈ›ia selectată în sens invers de la sfârÈ™it. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "OpreÈ™te rularea animaÈ›iei. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Rulează animaÈ›ia selectată de la început. (Shift+D)" diff --git a/editor/translations/editor/ru.po b/editor/translations/editor/ru.po index 190146f1c8..ab221f26a4 100644 --- a/editor/translations/editor/ru.po +++ b/editor/translations/editor/ru.po @@ -9,7 +9,7 @@ # DimOkGamer <dimokgamer@gmail.com>, 2016-2017. # Forest Swamp <sample1989@mail.ru>, 2018. # Igor S <scorched@bk.ru>, 2017. -# ijet <my-ijet@mail.ru>, 2017-2018, 2020. +# ijet <my-ijet@mail.ru>, 2017-2018, 2020, 2023. # Maxim Kim <habamax@gmail.com>, 2016. # Maxim toby3d Lebedev <mail@toby3d.ru>, 2016. # outbools <drag4e@yandex.ru>, 2017. @@ -56,7 +56,7 @@ # КонÑтантин Рин <email.to.rean@gmail.com>, 2019, 2020. # Maxim Samburskiy <alpacones@outlook.com>, 2019. # Dima Koshel <form.eater@gmail.com>, 2019. -# Danil Alexeev <danil@alexeev.xyz>, 2019, 2020, 2021, 2022. +# Danil Alexeev <danil@alexeev.xyz>, 2019, 2020, 2021, 2022, 2023. # Ravager <al.porkhunov@gmail.com>, 2019. # ÐлекÑандр <akonn7@mail.ru>, 2019. # Rei <clxgamer12@gmail.com>, 2019. @@ -69,7 +69,7 @@ # TMF <themysticalfox@mail.ru>, 2020. # Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020. # Super Pracion <superpracion2@gmail.com>, 2020. -# PizzArt <7o7goo7o7@gmail.com>, 2020. +# PizzArt <7o7goo7o7@gmail.com>, 2020, 2023. # TheGracekale <mrsmailbot.lg@gmail.com>, 2020, 2021. # Климентий Титов <titoffklim@cclc.tech>, 2020. # Richard Urban <redasuio1@gmail.com>, 2020. @@ -124,16 +124,19 @@ # Gulpy <yak.aryslan.1999@gmail.com>, 2022. # Sergey Karmanov <ppoocpel8888@gmail.com>, 2022. # Дмитрий <Dimega@inbox.ru>, 2022. -# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022. +# Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022, 2023. # Evgeniy Khramov <thejenjagamertjg@gmail.com>, 2022. -# kirill blaze <kirillblaze2@gmail.com>, 2022. +# kirill blaze <kirillblaze2@gmail.com>, 2022, 2023. +# Alexander Alexeev <dergluck@gmail.com>, 2023. +# Playmore Dev <playmoredevelop@gmail.com>, 2023. +# Ð’ÑчеÑлав Шароваров <frfnmtd272710@gmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-11-25 12:13+0000\n" -"Last-Translator: Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -142,25 +145,145 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "СброÑить" msgid "Physical" msgstr "ФизичеÑкий" +msgid "Left Mouse Button" +msgstr "Ð›ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" + +msgid "Right Mouse Button" +msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" + +msgid "Middle Mouse Button" +msgstr "СреднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши" + +msgid "Mouse Wheel Up" +msgstr "КолёÑико мыши вверх" + +msgid "Mouse Wheel Down" +msgstr "КолёÑико мыши вниз" + +msgid "Mouse Wheel Left" +msgstr "КолёÑико мыши влево" + +msgid "Mouse Wheel Right" +msgstr "КолеÑико мыши вправо" + +msgid "Mouse Thumb Button 1" +msgstr "Кнопка большого пальца мыши 1" + +msgid "Mouse Thumb Button 2" +msgstr "Кнопка большого пальца мыши 2" + msgid "Button" msgstr "Кнопка" +msgid "Double Click" +msgstr "Двойной щелчок" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Движение мыши в меÑтоположении (%s) Ñо ÑкороÑтью Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Левый Ñтик по оÑи X, ДжойÑтик 0 по оÑи X" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Левый Ñтик по оÑи Y, ДжойÑтик 0 по оÑи Y" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Правый Ñтик по оÑи X, ДжойÑтик 1 по оÑи X" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Правый Ñтик по оÑи Y, ДжойÑтик 1 по оÑи Y" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "ДжойÑтик 2 по оÑи X, Левый триггер, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "ДжойÑтик 2 по оÑи Y, Правый триггер, Sony R2, Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "ДжойÑтик 3 по оÑи X" + +msgid "Joystick 3 Y-Axis" +msgstr "ДжойÑтик 3 по оÑи Y" + +msgid "Joystick 4 X-Axis" +msgstr "ДжойÑтик 4 по оÑи X" + +msgid "Joystick 4 Y-Axis" +msgstr "ДжойÑтик 4 по оÑи Y" + +msgid "Unknown Joypad Axis" +msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑÑŒ джойÑтика" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Движение джойпада по оÑи %d (%s) Ñо значением %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Ðижнее дейÑтвие, Sony Cross, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Правое дейÑтвие, Sony Circle, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Левое дейÑтвие, Sony Square, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Верхнее дейÑтвие, Sony Triangle, Xbox Y, Nintendo X" + +msgid "D-pad Up" +msgstr "D-pad Вверх" + +msgid "D-pad Down" +msgstr "D-pad Вниз" + +msgid "D-pad Left" +msgstr "D-pad Влево" + +msgid "D-pad Right" +msgstr "D-pad Вправо" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 Тачпад" + +msgid "touched" +msgstr "коÑнулÑÑ" + +msgid "released" +msgstr "отпуÑтил" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "MIDI Вход на канале=%s Сообщение=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Событие ввода Ñ Shortcut=%s" + +msgid "Accept" +msgstr "Подтвердить" + msgid "Select" msgstr "Выделение" msgid "Cancel" msgstr "Отмена" +msgid "Focus Next" +msgstr "Следующий фокуÑ" + +msgid "Focus Prev" +msgstr "Предыдущий фокуÑ" + msgid "Left" -msgstr "Лево" +msgstr "Влево" msgid "Right" -msgstr "Право" +msgstr "Вправо" msgid "Up" msgstr "Вверх" @@ -168,6 +291,15 @@ msgstr "Вверх" msgid "Down" msgstr "Вниз" +msgid "Page Up" +msgstr "Ðа Ñтраницу вверх" + +msgid "Page Down" +msgstr "Ðа Ñтраницу вниз" + +msgid "Home" +msgstr "Домой" + msgid "End" msgstr "Конец" @@ -186,15 +318,66 @@ msgstr "Отменить" msgid "Redo" msgstr "Повторить" +msgid "New Line" +msgstr "ÐÐ¾Ð²Ð°Ñ Ñтрока" + +msgid "New Blank Line" +msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿ÑƒÑÑ‚Ð°Ñ Ñтрока" + +msgid "New Line Above" +msgstr "ÐÐ¾Ð²Ð°Ñ Ñтрока выше" + msgid "Indent" msgstr "ОтÑтуп" +msgid "Dedent" +msgstr "Ð’Ñ‹Ñтуп" + +msgid "Backspace" +msgstr "Стереть" + +msgid "Backspace Word" +msgstr "Стереть Ñлово" + +msgid "Backspace all to Left" +msgstr "Стереть вÑÑ‘ Ñлева" + msgid "Delete" msgstr "Удалить" +msgid "Delete Word" +msgstr "Удалить Ñлово" + +msgid "Delete all to Right" +msgstr "Удалить вÑÑ‘ Ñправа" + +msgid "Caret Left" +msgstr "КурÑор влево" + +msgid "Caret Word Left" +msgstr "КурÑор влево на Ñлово" + +msgid "Caret Right" +msgstr "КурÑор вправо" + +msgid "Caret Word Right" +msgstr "КурÑор вправо на Ñлово" + +msgid "Scroll Up" +msgstr "Прокрутка вверх" + +msgid "Scroll Down" +msgstr "Прокрутка вниз" + msgid "Select All" msgstr "Выделить вÑÑ‘" +msgid "Select Word Under Caret" +msgstr "Выделить Ñлово под курÑором" + +msgid "Toggle Insert Mode" +msgstr "Переключить режим вÑтавки" + msgid "Duplicate Nodes" msgstr "Дублировать узлы" @@ -204,6 +387,9 @@ msgstr "Удалить узлы" msgid "Refresh" msgstr "Обновить" +msgid "Show Hidden" +msgstr "Показывать Ñкрытые" + msgid "Invalid input %d (not passed) in expression" msgstr "Ðекорректный ввод %d (не подходит) в выражении" @@ -226,6 +412,12 @@ msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ msgid "On call to '%s':" msgstr "При вызове «%s»:" +msgid "Built-in script" +msgstr "Ð’Ñтроенный Ñкрипт" + +msgid "Built-in" +msgstr "Ð’Ñтроенный" + msgid "B" msgstr "Б" @@ -247,6 +439,15 @@ msgstr "ПиБ" msgid "EiB" msgstr "ÐиБ" +msgid "Example: %s" +msgstr "Пример: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d Ñлемент" +msgstr[1] "%d Ñлемента" +msgstr[2] "%d Ñлементов" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -260,9 +461,30 @@ msgstr "ДейÑтвие Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%s» уже ÑущеÑтвует." msgid "Add Event" msgstr "Добавить Ñобытие" +msgid "Remove Action" +msgstr "Удалить Ñобытие" + +msgid "Cannot Remove Action" +msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð£Ð´Ð°Ð»Ð¸Ñ‚ÑŒ ДейÑтвие" + +msgid "Edit Event" +msgstr "Изменить Ñобытие" + +msgid "Remove Event" +msgstr "Удалить Ñобытие" + +msgid "Filter by name..." +msgstr "Фильтр по имени..." + +msgid "Clear All" +msgstr "ОчиÑтить" + msgid "Add" msgstr "Добавить" +msgid "Show Built-in Actions" +msgstr "Показать вÑтроенные дейÑтвиÑ" + msgid "Action" msgstr "ДейÑтвие" @@ -275,6 +497,9 @@ msgstr "ВремÑ:" msgid "Value:" msgstr "Значение:" +msgid "Update Selected Key Handles" +msgstr "Обновить ручки выделенных ключей" + msgid "Insert Key Here" msgstr "Ð’Ñтавить ключ здеÑÑŒ" @@ -293,6 +518,18 @@ msgstr "Передвинуть точки Безье" msgid "Focus" msgstr "ФокуÑ" +msgid "Select All Keys" +msgstr "Выделить вÑе ключи" + +msgid "Deselect All Keys" +msgstr "СнÑÑ‚ÑŒ выделение Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹" + +msgid "Animation Change %s" +msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ %s" + +msgid "Animation Change Keyframe Value" +msgstr "Изменить значение ключевого кадра" + msgid "Change Animation Length" msgstr "Изменить длину анимации" @@ -440,6 +677,12 @@ msgstr "Изменить режим цикла анимации" msgid "Remove Anim Track" msgstr "Удалить дорожку" +msgid "Create new track for %s and insert key?" +msgstr "Создать новый трек Ð´Ð»Ñ %s и вÑтавить ключ?" + +msgid "Create %d new tracks and insert keys?" +msgstr "Создать %d новые треки и вÑтавить ключи?" + msgid "Create" msgstr "Создать" @@ -586,6 +829,9 @@ msgstr "Перейти к предыдущему шагу" msgid "Apply Reset" msgstr "Применить ÑброÑ" +msgid "Bake Animation" +msgstr "Запечь анимацию" + msgid "Use Bezier Curves" msgstr "ИÑпользовать кривые Безье" @@ -643,6 +889,18 @@ msgstr "Ðомер Ñтроки:" msgid "%d replaced." msgstr "%d заменено." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d Ñовпадает" +msgstr[1] "%d Ñовпадают" +msgstr[2] "%d Ñовпадают" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d из %d ÑовпадениÑ" +msgstr[1] "%d из %d Ñовпадений" +msgstr[2] "%d из %d Ñовпадений" + msgid "Match Case" msgstr "Учитывать региÑÑ‚Ñ€" @@ -701,9 +959,15 @@ msgstr "ПриÑоединить к Ñкрипту:" msgid "From Signal:" msgstr "От Ñигнала:" +msgid "Filter Nodes" +msgstr "Фильтр узлов" + msgid "Scene does not contain any script." msgstr "Сцена не Ñодержит каких-либо Ñкриптов." +msgid "Select Method" +msgstr "Выбрать метод" + msgid "Remove" msgstr "Удалить" @@ -713,6 +977,12 @@ msgstr "Добавить дополнительный аргумент вызоРmsgid "Extra Call Arguments:" msgstr "Дополнительные параметры вызова:" +msgid "Allows to drop arguments sent by signal emitter." +msgstr "Разрешить отбраÑывать аргументы, отправленные Ñмиттером." + +msgid "Unbind Signal Arguments:" +msgstr "Отключить аргументы Ñигнала:" + msgid "Receiver Method:" msgstr "Метод-приёмник:" @@ -746,6 +1016,9 @@ msgstr "ПриÑоединить" msgid "Signal:" msgstr "Сигнал:" +msgid "No description." +msgstr "Ðет опиÑаниÑ." + msgid "Connect '%s' to '%s'" msgstr "ПриÑоединить «%s» к «%s»" @@ -764,15 +1037,15 @@ msgstr "ОтÑоединить" msgid "Connect a Signal to a Method" msgstr "ПриÑоединить Ñигнал к методу" -msgid "Edit Connection:" -msgstr "Редактировать Ñоединение:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñигнала «%s»?" msgid "Signals" msgstr "Сигналы" +msgid "Filter Signals" +msgstr "Фильтр Ñигналов" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтого Ñигнала?" @@ -794,6 +1067,12 @@ msgstr "Создать %s" msgid "No results for \"%s\"." msgstr "Ðет результатов Ð´Ð»Ñ Â«%s»." +msgid "This class is marked as deprecated." +msgstr "Ðтот клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как уÑтаревший." + +msgid "This class is marked as experimental." +msgstr "Ðтот клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как ÑкÑпериментальный." + msgid "No description available for %s." msgstr "Ðет опиÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Â«%s»." @@ -803,6 +1082,9 @@ msgstr "Избранное:" msgid "Recent:" msgstr "Ðедавнее:" +msgid "(Un)favorite selected item." +msgstr "Добавить/убрать выделенные в избранное." + msgid "Search:" msgstr "ПоиÑк:" @@ -830,9 +1112,21 @@ msgstr "Копировать путь узла" msgid "Instance:" msgstr "ÐкземплÑÑ€:" +msgid "" +"This node has been instantiated from a PackedScene file:\n" +"%s\n" +"Click to open the original file in the Editor." +msgstr "" +"Ðтот узел был Ñоздан из файла PackedScene:\n" +"%s\n" +"Ðажмите, чтобы открыть иÑходный файл в редакторе." + msgid "Toggle Visibility" msgstr "Переключить видимоÑÑ‚ÑŒ" +msgid "ms" +msgstr "мÑ" + msgid "Monitors" msgstr "Мониторинг" @@ -912,26 +1206,32 @@ msgstr "Предупреждение:" msgid "Error:" msgstr "Ошибка:" -msgid "C++ Error" -msgstr "Ошибка C++" +msgid "%s Error" +msgstr "Ошибка %s" -msgid "C++ Error:" -msgstr "Ошибка C++:" +msgid "Stack Trace" +msgstr "ТраÑÑировка Ñтека" -msgid "Source" -msgstr "ИÑточник" +msgid "Stack Trace:" +msgstr "ТраÑÑировка Ñтека:" -msgid "C++ Source" -msgstr "ИÑходный код C++" +msgid "Debug session started." +msgstr "Ðачало ÑеанÑа отладки." -msgid "Source:" -msgstr "ИÑходный код:" +msgid "Debug session closed." +msgstr "Конец ÑеанÑа отладки." -msgid "C++ Source:" -msgstr "ИÑходный код C++:" +msgid "Line %d" +msgstr "Строка %d" -msgid "Stack Trace" -msgstr "ТраÑÑировка Ñтека" +msgid "Delete Breakpoint" +msgstr "Удалить точку оÑтанова" + +msgid "Delete All Breakpoints in:" +msgstr "Удалить вÑе точки оÑтанова в:" + +msgid "Delete All Breakpoints" +msgstr "Удалить вÑе точки оÑтанова" msgid "Copy Error" msgstr "Копировать ошибку" @@ -939,6 +1239,9 @@ msgstr "Копировать ошибку" msgid "Open C++ Source on GitHub" msgstr "Открытый иÑходный код C++ на GitHub" +msgid "C++ Source" +msgstr "ИÑходный код C++" + msgid "Video RAM" msgstr "ВидеопамÑÑ‚ÑŒ" @@ -1239,7 +1542,7 @@ msgid "Rename Audio Bus" msgstr "Переименовать аудио шину" msgid "Change Audio Bus Volume" -msgstr "Изменить громкоÑÑ‚ÑŒ звуковой шины" +msgstr "Изменить громкоÑÑ‚ÑŒ шины" msgid "Toggle Audio Bus Solo" msgstr "Переключить аудио шину - Ñоло" @@ -1388,6 +1691,9 @@ msgstr "Включить" msgid "Rearrange Autoloads" msgstr "ПереÑтановка автозагрузок" +msgid "Can't add Autoload:" +msgstr "Ðе удаётÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ автозагрузку:" + msgid "%s is an invalid path. File does not exist." msgstr "Ðеверный путь «%s». Файл не ÑущеÑтвует." @@ -1415,6 +1721,28 @@ msgstr "ÐавигациÑ" msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "Шрифты TTF, OTF, Type 1, WOFF1" + +msgid "WOFF2 Fonts" +msgstr "Шрифты WOFF2" + +msgid "Navigation, both 2D and 3D." +msgstr "ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ (2D и 3D)." + +msgid "" +"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType " +"library (if disabled, WOFF2 support is also disabled)." +msgstr "" +"Поддержка форматов шрифтов TrueType, OpenType, Type 1 и WOFF1 иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ " +"библиотеку FreeType (еÑли отключено, поддержка WOFF2 тоже будет отключена)." + +msgid "File saving failed." +msgstr "Ðе удалоÑÑŒ Ñохранить файл." + msgid "Nodes and Classes:" msgstr "Узлы и клаÑÑÑ‹:" @@ -1430,12 +1758,21 @@ msgstr "Ðовый" msgid "Save" msgstr "Сохранить" +msgid "Profile:" +msgstr "Профиль:" + msgid "Reset to Defaults" msgstr "СброÑить наÑтройки" +msgid "Please Confirm:" +msgstr "Подтвердите:" + msgid "Export Profile" msgstr "ÐкÑпортировать профиль" +msgid "Edit Build Configuration Profile" +msgstr "Изменить профиль конфигурации Ñборки" + msgid "Paste Params" msgstr "Ð’Ñтавить параметры" @@ -1523,6 +1860,9 @@ msgstr "" "ПозволÑет наÑтраивать параметры импорта Ð´Ð»Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… реÑурÑов. Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ " "требуетÑÑ Ð¿Ð°Ð½ÐµÐ»ÑŒ Â«Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема»." +msgid "Provides an overview of the editor's and each scene's undo history." +msgstr "ПредоÑтавлÑет обзор иÑтории отмены дейÑтвий редактора и каждой Ñцены." + msgid "(current)" msgstr "(текущий)" @@ -1741,6 +2081,55 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "(Ре)Импортировать" +msgid "Import resources of type: %s" +msgstr "Импорт реÑурÑов типа: %s" + +msgid "No return value." +msgstr "Возвращаемое значение отÑутÑтвует." + +msgid "Deprecated" +msgstr "УÑтаревший" + +msgid "Experimental" +msgstr "ÐкÑпериментальный" + +msgid "This method supports a variable number of arguments." +msgstr "Данный метод поддерживает переменное количеÑтво аргументов." + +msgid "" +"This method is called by the engine.\n" +"It can be overridden to customize built-in behavior." +msgstr "" +"Данный метод вызываетÑÑ Ð´Ð²Ð¸Ð¶ÐºÐ¾Ð¼.\n" +"Его можно переопределить, чтобы изменить поведение по умолчанию." + +msgid "" +"This method has no side effects.\n" +"It does not modify the object in any way." +msgstr "" +"Данный метод не имеет побочных Ñффектов.\n" +"Он никоим образом не изменÑет объект." + +msgid "" +"This method does not need an instance to be called.\n" +"It can be called directly using the class name." +msgstr "" +"Ð”Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° данного метода не требуетÑÑ ÑкземплÑÑ€.\n" +"Его можно вызвать напрÑмую, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа." + +msgid "Error codes returned:" +msgstr "Возвращённые коды ошибок:" + +msgid "There is currently no description for this %s." +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого %s отÑутÑтвует." + +msgid "" +"There is currently no description for this %s. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого %s отÑутÑтвует. ПожалуйÑта помогите нам, " +"[color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!" + msgid "Top" msgstr "Верх" @@ -1753,11 +2142,33 @@ msgstr "ÐаÑледует:" msgid "Inherited by:" msgstr "УнаÑледован:" +msgid "" +"This class is marked as deprecated. It will be removed in future versions." +msgstr "" +"Данный клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как уÑтаревший. Он будет удалён в будущих верÑиÑÑ…." + +msgid "" +"This class is marked as experimental. It is subject to likely change or " +"possible removal in future versions. Use at your own discretion." +msgstr "" +"Данный клаÑÑ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½ как ÑкÑпериментальный. Он может быть изменён или удалён " +"в будущих верÑиÑÑ…. ИÑпользуйте по Ñвоему уÑмотрению." + msgid "Description" msgstr "ОпиÑание" +msgid "There is currently no description for this class." +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого клаÑÑа отÑутÑтвует." + +msgid "" +"There is currently no description for this class. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого клаÑÑа отÑутÑтвует. ПожалуйÑта помогите " +"нам, [color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!" + msgid "Online Tutorials" -msgstr "Онлайн-уроки" +msgstr "Онлайн-руководÑтва" msgid "Properties" msgstr "СвойÑтва" @@ -1766,7 +2177,16 @@ msgid "overrides %s:" msgstr "переопределÑет %s:" msgid "default:" -msgstr "По умолчанию:" +msgstr "по умолчанию:" + +msgid "property:" +msgstr "ÑвойÑтво:" + +msgid "Constructors" +msgstr "КонÑтрукторы" + +msgid "Operators" +msgstr "Операторы" msgid "Theme Properties" msgstr "СвойÑтва темы" @@ -1780,6 +2200,9 @@ msgstr "КонÑтанты" msgid "Fonts" msgstr "Шрифты" +msgid "Font Sizes" +msgstr "Размеры шрифта" + msgid "Icons" msgstr "Иконки" @@ -1789,22 +2212,44 @@ msgstr "Стили" msgid "Enumerations" msgstr "ПеречиÑлениÑ" +msgid "Annotations" +msgstr "Ðннотации" + +msgid "There is currently no description for this annotation." +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтой аннотации отÑутÑтвует." + +msgid "" +"There is currently no description for this annotation. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтой аннотации отÑутÑтвует. ПожалуйÑта помогите " +"нам, [color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!" + msgid "Property Descriptions" msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÑвойÑтв" msgid "(value)" msgstr "(значение)" +msgid "There is currently no description for this property." +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого ÑвойÑтва отÑутÑтвует." + msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÑутÑтвует опиÑание Ñтого ÑвойÑтва. ПожалуйÑта " -"[color=$color][url=$url]помогите нам[/url][/color]!" +"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ð¸Ñание Ñтого ÑвойÑтва отÑутÑтвует. ПожалуйÑта помогите " +"нам, [color=$color][url=$url]внеÑите Ñвой вклад[/url][/color]!" + +msgid "Constructor Descriptions" +msgstr "ОпиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñтрукторов" msgid "Method Descriptions" msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð²" +msgid "Operator Descriptions" +msgstr "ОпиÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²" + msgid "%d match." msgstr "%d Ñовпадение." @@ -1826,12 +2271,21 @@ msgstr "Отображать вÑÑ‘" msgid "Classes Only" msgstr "Только клаÑÑÑ‹" +msgid "Constructors Only" +msgstr "Только конÑтрукторы" + msgid "Methods Only" msgstr "Только методы" +msgid "Operators Only" +msgstr "Только операторы" + msgid "Signals Only" msgstr "Только Ñигналы" +msgid "Annotations Only" +msgstr "Только аннотации" + msgid "Constants Only" msgstr "Только конÑтанты" @@ -1844,6 +2298,9 @@ msgstr "Только ÑвойÑтва темы" msgid "Member Type" msgstr "Тип члена" +msgid "(constructors)" +msgstr "(конÑтрукторы)" + msgid "Class" msgstr "КлаÑÑ" @@ -1853,6 +2310,9 @@ msgstr "Метод" msgid "Signal" msgstr "Сигнал" +msgid "Annotation" +msgstr "ÐннотациÑ" + msgid "Constant" msgstr "КонÑтанта" @@ -1862,9 +2322,22 @@ msgstr "Параметр" msgid "Theme Property" msgstr "СвойÑтво темы" +msgid "This member is marked as deprecated." +msgstr "Ðтот член клаÑÑа помечен как уÑтаревший." + +msgid "This member is marked as experimental." +msgstr "Ðтот член клаÑÑа помечен как ÑкÑпериментальный." + msgid "Property:" msgstr "Параметр:" +msgid "Pin Value" +msgstr "Закрепить значение" + +msgid "Pin Value [Disabled because '%s' is editor-only]" +msgstr "" +"Закрепить значение [Отключено, так как «%s» доÑтупно только Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð°]" + msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" @@ -1874,32 +2347,105 @@ msgstr "" msgid "Open Documentation" msgstr "Открыть документацию" +msgid "Element %d: %s%d*" +msgstr "Ðлемент %d: %s%d*" + msgid "Move Up" msgstr "ПеремеÑтить вверх" msgid "Move Down" msgstr "ПеремеÑтить вниз" +msgid "Insert New Before" +msgstr "Ð’Ñтавить новый до" + +msgid "Insert New After" +msgstr "Ð’Ñтавить новый поÑле" + +msgid "Clear Array" +msgstr "ОчиÑтить маÑÑив" + +msgid "Resize Array..." +msgstr "Изменить размер маÑÑива..." + +msgid "Add Element" +msgstr "Добавить Ñлемент" + msgid "Resize Array" msgstr "Изменить размер маÑÑива" +msgid "New Size:" +msgstr "Ðовый размер:" + +msgid "Element %s" +msgstr "Ðлемент %s" + +msgid "Add Metadata" +msgstr "Добавить метаданные" + msgid "Set %s" msgstr "Задать %s" msgid "Set Multiple:" msgstr "Задать неÑколько:" +msgid "Remove metadata %s" +msgstr "Удалить метаданные %s" + msgid "Pinned %s" msgstr "Закреплено %s" msgid "Unpinned %s" msgstr "Откреплено %s" +msgid "Add metadata %s" +msgstr "Добавить метаданные %s" + +msgid "Metadata name can't be empty." +msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… не может быть пуÑтым." + +msgid "Metadata name must be a valid identifier." +msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… должно быть допуÑтимым идентификатором." + +msgid "Metadata with name \"%s\" already exists." +msgstr "Метаданные Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%s» уже ÑущеÑтвуют." + +msgid "Names starting with _ are reserved for editor-only metadata." +msgstr "" +"Имена, начинающиеÑÑ Ñ _, зарезервированы только Ð´Ð»Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… редактора." + +msgid "Metadata name is valid." +msgstr "Ð˜Ð¼Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ… ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым." + +msgid "Add Metadata Property for \"%s\"" +msgstr "Добавить ÑвойÑтво метаданных Ð´Ð»Ñ Â«%s»" + +msgid "Copy Value" +msgstr "Копировать значение" + +msgid "Paste Value" +msgstr "Ð’Ñтавить значение" + msgid "Copy Property Path" -msgstr "Копировать путь к ÑвойÑтву" +msgstr "Копировать путь ÑвойÑтва" + +msgid "Select existing layout:" +msgstr "Выберите ÑущеÑтвующий макет:" + +msgid "Changed Locale Language Filter" +msgstr "Изменён фильтр локали по Ñзыкам" + +msgid "Changed Locale Script Filter" +msgstr "Изменён фильтр локали по пиÑьменноÑÑ‚Ñм" + +msgid "Changed Locale Country Filter" +msgstr "Изменён фильтр локали по Ñтранам" msgid "Changed Locale Filter Mode" -msgstr "Изменен режим фильтрации Ñзыков" +msgstr "Изменён режим фильтра локали" + +msgid "Select a Locale" +msgstr "Выбрать локаль" msgid "Show All Locales" msgstr "Показать вÑе локали" @@ -1907,11 +2453,26 @@ msgstr "Показать вÑе локали" msgid "Show Selected Locales Only" msgstr "Показать только выбранные локали" +msgid "Edit Filters" +msgstr "Редактировать фильтры" + msgid "Language:" msgstr "Язык:" -msgid "Script" -msgstr "Скрипт" +msgid "Country:" +msgstr "Страна:" + +msgid "Language" +msgstr "Язык" + +msgid "Country" +msgstr "Страна" + +msgid "Variant" +msgstr "Вариант" + +msgid "Filter Messages" +msgstr "Фильтр Ñообщений" msgid "Clear Output" msgstr "ОчиÑтить вывод" @@ -1919,6 +2480,24 @@ msgstr "ОчиÑтить вывод" msgid "Copy Selection" msgstr "Копировать выделенное" +msgid "" +"Collapse duplicate messages into one log entry. Shows number of occurrences." +msgstr "" +"Свернуть повторÑющиеÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² одну запиÑÑŒ журнала. КоличеÑтво " +"повторений отображаетÑÑ." + +msgid "Toggle visibility of standard output messages." +msgstr "Переключить видимоÑÑ‚ÑŒ Ñтандартных Ñообщений вывода." + +msgid "Toggle visibility of errors." +msgstr "Переключить видимоÑÑ‚ÑŒ ошибок." + +msgid "Toggle visibility of warnings." +msgstr "Переключить видимоÑÑ‚ÑŒ предупреждений." + +msgid "Toggle visibility of editor messages." +msgstr "Переключить видимоÑÑ‚ÑŒ Ñообщений редактора." + msgid "New Window" msgstr "Ðовое окно" @@ -1965,6 +2544,9 @@ msgstr "ÐеизвеÑтный формат запрашиваемого файРmsgid "Error while saving." msgstr "Ошибка при Ñохранении." +msgid "Scene file '%s' appears to be invalid/corrupt." +msgstr "Файл Ñцены «%s» ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным/повреждённым." + msgid "Saving Scene" msgstr "Сохранение Ñцены" @@ -2021,6 +2603,10 @@ msgstr "Ðазвание макета не найдено!" msgid "Restored the Default layout to its base settings." msgstr "Макет по умолчанию воÑÑтановлен к его базовым наÑтройкам." +msgid "This object is marked as read-only, so it's not editable." +msgstr "" +"Ðтот объект помечен как только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ, поÑтому его Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ." + msgid "" "This resource belongs to a scene that was imported, so it's not editable.\n" "Please read the documentation relevant to importing scenes to better " @@ -2041,18 +2627,44 @@ msgstr "" msgid "Changes may be lost!" msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть потерÑны!" +msgid "This object is read-only." +msgstr "Ðтот объект доÑтупен только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ." + +msgid "" +"Movie Maker mode is enabled, but no movie file path has been specified.\n" +"A default movie file path can be specified in the project settings under the " +"Editor > Movie Writer category.\n" +"Alternatively, for running single scenes, a `movie_file` string metadata can " +"be added to the root node,\n" +"specifying the path to a movie file that will be used when recording that " +"scene." +msgstr "" +"Режим Movie Maker включён, но путь к видеофайлу не указан.\n" +"Путь к видеофайлу по умолчанию можно указать в наÑтройках проекта в " +"категории Editor > Movie Writer.\n" +"Ð’ качеÑтве альтернативы, Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка отдельных Ñцен в корневой узел можно " +"добавить метаданные `movie_file` типа String,\n" +"указывающие пути к видеофайлу, который будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ запиÑи Ñтой " +"Ñцены." + msgid "There is no defined scene to run." msgstr "Ðет открытой Ñцены Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка." msgid "Save scene before running..." msgstr "Сохранение Ñцены перед запуÑком..." +msgid "Reload the played scene." +msgstr "ПерезапуÑтить воÑпроизводимую Ñцену." + msgid "Play the project." msgstr "ЗапуÑтить проект." msgid "Play the edited scene." msgstr "ЗапуÑтить текущую Ñцену." +msgid "Play a custom scene." +msgstr "ЗапуÑтить произвольную Ñцену." + msgid "Open Base Scene" msgstr "Открыть оÑновную Ñцену" @@ -2107,12 +2719,18 @@ msgstr "Ðевозможно отменить пока кнопки мыши нРmsgid "Nothing to undo." msgstr "Ðечего отменить." +msgid "Remote Undo: %s" +msgstr "Отменить удалённо: %s" + msgid "Can't redo while mouse buttons are pressed." msgstr "Ðевозможно повторить пока кнопки мыши нажаты." msgid "Nothing to redo." msgstr "Ðечего повторить." +msgid "Remote Redo: %s" +msgstr "Повторить удалённо: %s" + msgid "Can't reload a scene that was never saved." msgstr "Ðе возможно загрузить Ñцену, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ была Ñохранена." @@ -2340,6 +2958,9 @@ msgstr "Проект" msgid "Project Settings..." msgstr "ÐаÑтройки проекта..." +msgid "Project Settings" +msgstr "ÐаÑтройки проекта" + msgid "Version Control" msgstr "Контроль верÑий" @@ -2370,6 +2991,9 @@ msgstr "Редактор" msgid "Editor Settings..." msgstr "ÐаÑтройки редактора..." +msgid "Command Palette..." +msgstr "Палитра команд..." + msgid "Editor Layout" msgstr "Макет редактора" @@ -2424,15 +3048,66 @@ msgstr "О Godot" msgid "Support Godot Development" msgstr "Поддержать разработку Godot" +msgid "Run the project's default scene." +msgstr "ЗапуÑтить Ñцену проекта по умолчанию." + msgid "Run Project" msgstr "ЗапуÑтить проект" +msgid "Pause the running project's execution for debugging." +msgstr "ПриоÑтановить выполнение запущенного проекта Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸." + +msgid "Pause Running Project" +msgstr "ПриоÑтановить запущенный проект" + +msgid "Stop the currently running project." +msgstr "ОÑтановить текущий запущенный проект." + +msgid "Stop Running Project" +msgstr "ОÑтановить запущенный проект" + +msgid "Run the currently edited scene." +msgstr "ЗапуÑтить текущую редактируемую Ñцену." + +msgid "Run Current Scene" +msgstr "ЗапуÑтить текущую Ñцену" + +msgid "Run a specific scene." +msgstr "ЗапуÑтить конкретную Ñцену." + +msgid "Run Specific Scene" +msgstr "ЗапуÑтить конкретную Ñцену" + +msgid "" +"Enable Movie Maker mode.\n" +"The project will run at stable FPS and the visual and audio output will be " +"recorded to a video file." +msgstr "" +"Включить режим Movie Maker.\n" +"Проект будет запущен Ñо Ñтабильным FPS, а изображение и звук будут запиÑаны " +"в видеофайл." + +msgid "Choose a renderer." +msgstr "Выберите отриÑовщик." + +msgid "Forward+" +msgstr "Forward+" + +msgid "Mobile" +msgstr "Мобильные уÑтройÑтва" + msgid "Compatibility" msgstr "СовмеÑтимоÑÑ‚ÑŒ" +msgid "Changing the renderer requires restarting the editor." +msgstr "Изменение отриÑовщика требует перезапуÑка редактора." + msgid "Update Continuously" msgstr "Ðепрерывное обновление" +msgid "Update When Changed" +msgstr "ОбновлÑÑ‚ÑŒ при изменениÑÑ…" + msgid "Hide Update Spinner" msgstr "Скрыть индикатор обновлений" @@ -2466,24 +3141,6 @@ msgid "Install from file" msgstr "УÑтановить из файла" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Ðто наÑтроит ваш проект Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких Ñборок Android путём уÑтановки " -"иÑходного шаблона в «res://android/build».\n" -"Затем вы можете модифицировать его (добавить модули, изменить " -"AndroidManifest.xml и Ñ‚. д.) и Ñоздать Ñвой ÑобÑтвенный пользовательÑкий APK " -"Ð´Ð»Ñ ÑкÑпорта.\n" -"Обратите внимание, что Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких Ñборок вмеÑто " -"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ñ‹Ñ… APK-файлов при ÑкÑпорте на Android должна быть " -"включена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ð˜Ñпользовать пользовательÑкую Ñборку»." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2551,6 +3208,9 @@ msgstr "Открыть Ñледующий редактор" msgid "Open the previous Editor" msgstr "Открыть предыдущий редактор" +msgid "Ok" +msgstr "Ok" + msgid "Warning!" msgstr "Предупреждение!" @@ -2608,6 +3268,9 @@ msgstr "УÑтанавливать.." msgid "Invalid RID" msgstr "Ðеверный RID" +msgid "Recursion detected, unable to assign resource to property." +msgstr "Обнаружена рекурÑиÑ, невозможно назначить реÑÑƒÑ€Ñ ÑвойÑтву." + msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." @@ -2632,12 +3295,21 @@ msgstr "Выберите Viewport" msgid "Selected node is not a Viewport!" msgstr "Выбранный узел не Viewport!" +msgid "(Nil) %s" +msgstr "(Nil) %s" + +msgid "%s (size %s)" +msgstr "%s (размер %s)" + msgid "Size:" msgstr "Размер:" msgid "Remove Item" msgstr "Удалить Ñлемент" +msgid "Dictionary (size %d)" +msgstr "Словарь (размер %d)" + msgid "New Key:" msgstr "Ðовый ключ:" @@ -2672,6 +3344,9 @@ msgstr "Ðовый Ñкрипт" msgid "Extend Script" msgstr "РаÑширить Ñкрипт" +msgid "No Remote Debug export presets configured." +msgstr "Ðет наÑтроенных преÑетов ÑкÑпорта Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð¹ отладки." + msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -2690,6 +3365,9 @@ msgstr "Пишите ваш код в методе _run()." msgid "There is an edited scene already." msgstr "Уже ÑущеÑтвует Ð¾Ñ‚Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñцена." +msgid "Edit Built-in Action" +msgstr "Изменить вÑтроенное дейÑтвие" + msgid "Common" msgstr "Общий" @@ -2708,8 +3386,33 @@ msgstr "ГорÑчие клавиши" msgid "Binding" msgstr "ПривÑзка" -msgid "%s Error" -msgstr "Ошибка %s" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"Зажмите %s, чтобы округлить до целых.\n" +" Зажмите Shift Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ точных изменений." + +msgid "No notifications." +msgstr "Ðет уведомлений." + +msgid "Show notifications." +msgstr "Показать уведомлениÑ." + +msgid "Silence the notifications." +msgstr "Заглушить уведомлениÑ." + +msgid "Left Stick Left, Joystick 0 Left" +msgstr "Левый Ñтик влево, ДжойÑтик 0 влево" + +msgid "Left Stick Right, Joystick 0 Right" +msgstr "Левый Ñтик вправо, ДжойÑтик 0 вправо" + +msgid "Left Stick Up, Joystick 0 Up" +msgstr "Левый Ñтик вверх, Стик 0 вверх" + +msgid "Left Stick Down, Joystick 0 Down" +msgstr "Левый Ñтик вниз, Стик 0 вниз" msgid "All Devices" msgstr "Ð’Ñе уÑтройÑтва" @@ -2717,11 +3420,14 @@ msgstr "Ð’Ñе уÑтройÑтва" msgid "Device" msgstr "УÑтройÑтво" +msgid "Listening for input..." +msgstr "Ожидание ввода..." + msgid "Project export for platform:" msgstr "ÐкÑпорт проекта Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹:" msgid "Completed with warnings." -msgstr "Завершено Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸." +msgstr "Завершено Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми." msgid "Completed successfully." msgstr "Завершено без ошибок." @@ -2756,6 +3462,15 @@ msgstr "Ðе удалоÑÑŒ ÑкÑпортировать файлы проект msgid "Can't open file to read from path \"%s\"." msgstr "Ðе удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· пути \"%s\"." +msgid "Can't open executable file from path \"%s\"." +msgstr "Ðе удалоÑÑŒ открыть иÑполнÑемый файл по пути «%s»." + +msgid "Can't create encrypted file." +msgstr "Ðе удалоÑÑŒ Ñоздать зашифрованный файл." + +msgid "Can't open encrypted file to write." +msgstr "Ðе удалоÑÑŒ открыть зашифрованный файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи." + msgid "Save ZIP" msgstr "Сохранить ZIP" @@ -3035,12 +3750,22 @@ msgstr "ÐкÑпортировать выбранные Ñцены (включа msgid "Export selected resources (and dependencies)" msgstr "ÐкÑпортировать выбранные реÑурÑÑ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)" +msgid "Export as dedicated server" +msgstr "Ðкпортировать как выделенный Ñервер" + msgid "Export Mode:" msgstr "Режим ÑкÑпортированиÑ:" msgid "Resources to export:" msgstr "РеÑурÑÑ‹ Ð´Ð»Ñ ÑкÑпорта:" +msgid "" +"\"Strip Visuals\" will replace the following resources with placeholders:" +msgstr "\"Убрать визуал\" заменит Ñледующие реÑурÑÑ‹ на заполнители:" + +msgid "Strip Visuals" +msgstr "Убрать визуал" + msgid "Keep" msgstr "ОÑтавить оригинал" @@ -3067,6 +3792,9 @@ msgstr "ПользовательÑкие (через запÑтую):" msgid "Feature List:" msgstr "СпиÑок ÑвойÑтв:" +msgid "Encrypt Exported PCK" +msgstr "Шифровать Ñкпортированный PCK" + msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" msgstr "" "Ðеверный ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (должен ÑоÑтоÑÑ‚ÑŒ из 64 шеÑтнадцатеричных Ñимволов)" @@ -3096,6 +3824,9 @@ msgstr "ÐкÑпортировать вÑÑ‘..." msgid "ZIP File" msgstr "ZIP-файл" +msgid "Godot Project Pack" +msgstr "Пакет Godot проекта" + msgid "Export templates for this platform are missing:" msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:" @@ -3108,6 +3839,25 @@ msgstr "Управление шаблонами ÑкÑпорта" msgid "Export With Debug" msgstr "ÐкÑпорт в режиме отладки" +msgid "Path to FBX2glTF executable is empty." +msgstr "Путь к иÑполнителю FBX2glTF пуÑÑ‚." + +msgid "Path to FBX2glTF executable is invalid." +msgstr "Путь к иÑполнÑемому файлу FBX2glTF недейÑтвителен." + +msgid "Error executing this file (wrong version or architecture)." +msgstr "Ошибка при запуÑке данного файла (Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð»Ð¸ архитектура)." + +msgid "" +"FBX2glTF is required for importing FBX files.\n" +"Please download it and provide a valid path to the binary:" +msgstr "" +"FBX2glTF необходим Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² FBX.\n" +"ПожалуйÑта, Ñкачайте его и укажите верный путь к иÑполнителю:" + +msgid "Click this link to download FBX2glTF" +msgstr "Ðажмите на Ñту ÑÑылку Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ FBX2glTF" + msgid "Browse" msgstr "Обзор" @@ -3137,8 +3887,14 @@ msgstr "Ошибка перемещениÑ:" msgid "Error duplicating:" msgstr "Ошибка дублированиÑ:" +msgid "Failed to save resource at %s: %s" +msgstr "Ðе удалоÑÑŒ Ñохранить реÑÑƒÑ€Ñ Ð² %s: %s" + +msgid "Failed to load resource at %s: %s" +msgstr "Ðе удалоÑÑŒ загрузить реÑÑƒÑ€Ñ Ð¸Ð· %s: %s" + msgid "Unable to update dependencies:" -msgstr "Ðе удаётÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ завиÑимоÑти:" +msgstr "Ðе удалоÑÑŒ обновить завиÑимоÑти:" msgid "Provided name contains invalid characters." msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы." @@ -3292,9 +4048,21 @@ msgstr "Заменить..." msgid "Replace in Files" msgstr "Заменить в файлах" +msgid "Replace all (no undo)" +msgstr "Заменить вÑÑ‘ (ÐЕЛЬЗЯ ОТМЕÐИТЬ)" + msgid "Searching..." msgstr "ПоиÑк..." +msgid "%d match in %d file" +msgstr "%d Ñовпадение в %d файле" + +msgid "%d matches in %d file" +msgstr "%d Ñовпадений в %d файле" + +msgid "%d matches in %d files" +msgstr "%d Ñовпадений в %d файлах" + msgid "Add to Group" msgstr "Добавить в группу" @@ -3331,12 +4099,122 @@ msgstr "Редактор групп" msgid "Manage Groups" msgstr "Управление группами" +msgid "The Beginning" +msgstr "Ðачало" + +msgid "Audio Stream Importer: %s" +msgstr "Импортер потока аудио: %s" + msgid "Reimport" -msgstr "Переимпортировать" +msgstr "Повторить импорт" + +msgid "Enable looping." +msgstr "Зациклить." msgid "Offset:" msgstr "ОтÑтуп:" +msgid "" +"Loop offset (from beginning). Note that if BPM is set, this setting will be " +"ignored." +msgstr "" +"Сдвиг цикла (от начала). Обратите внимание, еÑли уÑтановлен темп (BPM), Ñтот " +"параметр будет игнорироватьÑÑ." + +msgid "Loop:" +msgstr "Зациклить:" + +msgid "BPM:" +msgstr "Темп:" + +msgid "" +"Configure the Beats Per Measure (tempo) used for the interactive streams.\n" +"This is required in order to configure beat information." +msgstr "" +"КоличеÑтво ударов на такт (темп), иÑпользуемое интерактивными потоками.\n" +"Ðто нужно Ð´Ð»Ñ Ð½Ð°Ñтройки ритма." + +msgid "Beat Count:" +msgstr "Кол-во ударов:" + +msgid "" +"Configure the amount of Beats used for music-aware looping. If zero, it will " +"be autodetected from the length.\n" +"It is recommended to set this value (either manually or by clicking on a " +"beat number in the preview) to ensure looping works properly." +msgstr "" +"Параметр количеÑтва битов, иÑпользуемых Ð´Ð»Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸. ЕÑли ноль, " +"он будет автоматичеÑки определен по длине.\n" +"РекомендуетÑÑ ÑƒÑтановить Ñто значение (вручную, либо щелкнув номер доли в " +"превью), чтобы обеÑпечить правильную работу цикла." + +msgid "Bar Beats:" +msgstr "Ударов в такте:" + +msgid "" +"Configure the Beats Per Bar. This used for music-aware transitions between " +"AudioStreams." +msgstr "" +"Параметр количеÑтва ударов в такте. Ðто иÑпользуетÑÑ Ð´Ð»Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð¾ " +"оÑнованных переходов между звуковыми потоками AudioStream." + +msgid "Music Playback:" +msgstr "ВоÑпроизведение:" + +msgid "New Configuration" +msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ" + +msgid "Remove Variation" +msgstr "Удалить вариант" + +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "" +"Предупреждение: ÐеÑколько конфигураций имеют идентичные наÑтройки. Дубликаты " +"игнорируютÑÑ." + +msgid "" +"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-" +"rendered for all supported subpixel layouts (5x)." +msgstr "" +"Примечание: ЕÑли Ñглаживание ÑубпикÑелей LCD выбрано, каждый глиф будет " +"предварительно отрендерен Ð´Ð»Ñ Ð²Ñех поддерживаемых Ñлоев ÑубпикÑелей (5x)." + +msgid "Advanced Import Settings for '%s'" +msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ '%s'" + +msgid "Rendering Options" +msgstr "Параметры рендеринга" + +msgid "Select font rendering options, fallback font, and metadata override:" +msgstr "" +"Выберите параметры рендеринга шрифта, запаÑной шрифт и замененную метадату:" + +msgid "Pre-render Configurations" +msgstr "Конфигурации предварительного рендера" + +msgid "" +"Add font size, and variation coordinates, and select glyphs to pre-render:" +msgstr "" +"Добавьте размер шрифта и координаты вариантов, и выберите глифы Ð´Ð»Ñ " +"предварительного рендеринга:" + +msgid "Configuration:" +msgstr "КонфигурациÑ:" + +msgid "Add configuration" +msgstr "Добавить конфигурацию" + +msgid "Dynamically rendered TrueType/OpenType font" +msgstr "ДинамичеÑки отображаемый шрифт TrueType/OpenType" + +msgid "Can't load font texture:" +msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ текÑтуру шрифта:" + +msgid "Image margin too big." +msgstr "ÐŸÐ¾Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñлишком большие." + msgid "Importing Scene..." msgstr "Импортирование Ñцены..." @@ -3362,22 +4240,67 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" -"%s: Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура иÑпользуетÑÑ ÐºÐ°Ðº карта нормалей в 3D. Включено краÑно-" -"зелёное Ñжатие текÑтуры Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти (Ñиний канал " +"%s: ТекÑтура иÑпользуетÑÑ ÐºÐ°Ðº карта нормалей в 3D. Включено краÑно-зелёное " +"Ñжатие текÑтуры Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти (Ñиний канал " "отбраÑываетÑÑ)." +msgid "2D/3D (Auto-Detect)" +msgstr "2D/3D (Ðвтоопределение)" + msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" +msgid "<Unnamed Material>" +msgstr "<БезымÑнный материал>" + +msgid "Import ID: %s" +msgstr "ID импорта: %s" + +msgid "" +"Type: %s\n" +"Import ID: %s" +msgstr "" +"Тип: %s\n" +"ID импорта: %s" + +msgid "Error opening scene" +msgstr "Ошибка при открытии Ñцены" + +msgid "Advanced Import Settings for AnimationLibrary '%s'" +msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ AnimationLibrary '%s'" + +msgid "Advanced Import Settings for Scene '%s'" +msgstr "РаÑширенные наÑтройки импорта Ð´Ð»Ñ Ñцены '%s'" + +msgid "Select folder to extract material resources" +msgstr "Выбрать папку Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¾Ð²" + +msgid "Extract Materials to Resource Files" +msgstr "Извлечь материалы в файлы реÑурÑов" + +msgid "Set paths to save animations as resource files on Reimport" +msgstr "" +"Задать пути Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¹ в виде файлов реÑурÑов при повторном " +"импорте" + +msgid "Actions..." +msgstr "ДейÑтвиÑ..." + +msgid "Extract Materials" +msgstr "Извлечь материалы" + msgid "Meshes" msgstr "Сетка" msgid "Materials" msgstr "Материалы" +msgid "Save Extension:" +msgstr "РаÑширение:" + msgid "Select Importer" msgstr "Выберите импортёр" @@ -3414,6 +4337,9 @@ msgstr "Импортировать как:" msgid "Preset" msgstr "ПреÑет" +msgid "Advanced..." +msgstr "Дополнительно..." + msgid "Save Scenes, Re-Import, and Restart" msgstr "Сохранить Ñцены, переимпортировать и перезапуÑтить" @@ -3433,12 +4359,64 @@ msgstr "" "Выберите файл реÑурÑа в файловой ÑиÑтеме или в инÑпекторе, чтобы наÑтроить " "параметры импорта." +msgid "No Event Configured" +msgstr "Событие не наÑтроено" + +msgid "Keyboard Keys" +msgstr "Клавиши клавиатуры" + +msgid "Mouse Buttons" +msgstr "Кнопки мыши" + +msgid "Joypad Buttons" +msgstr "Кнопки джойÑтика" + +msgid "Joypad Axes" +msgstr "ОÑи джойÑтика" + +msgid "Event Configuration" +msgstr "ÐаÑтройки ÑобытиÑ" + +msgid "Manual Selection" +msgstr "Ручной выбор" + +msgid "Filter Inputs" +msgstr "Фильтр ввода" + +msgid "Additional Options" +msgstr "Дополнительные опции" + msgid "Device:" msgstr "УÑтройÑтво:" +msgid "Command / Control (auto)" +msgstr "Command / Control (авто)" + +msgid "" +"Automatically remaps between 'Meta' ('Command') and 'Control' depending on " +"current platform." +msgstr "" +"ÐвтоматичеÑкое переключение между «Meta» («Command») и «Control» в " +"завиÑимоÑти от текущей платформы." + +msgid "" +"The following resources will be duplicated and embedded within this resource/" +"object." +msgstr "" +"Следующие реÑурÑÑ‹ будут продублированы и вÑтроены в Ñтот реÑурÑ/объект." + +msgid "This object has no resources." +msgstr "Ðтот объект не имеет реÑурÑов." + msgid "Failed to load resource." msgstr "Ðе удалоÑÑŒ загрузить реÑурÑ." +msgid "(Current)" +msgstr "(Текущий)" + +msgid "Expand Non-Default" +msgstr "Развернуть изменённые" + msgid "Property Name Style" msgstr "Стиль имени ÑвойÑтва" @@ -3535,20 +4513,48 @@ msgstr "Переназначить в локали:" msgid "Locale" msgstr "Локаль" +msgid "POT Generation" +msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ POT" + +msgid "Files with translation strings:" +msgstr "Файлы Ñо Ñтроками перевода:" + +msgid "Generate POT" +msgstr "Сгенерировать POT" + +msgid "Set %s on %d nodes" +msgstr "Задать %s на %d узлах" + +msgid "%s (%d Selected)" +msgstr "%s (%d выбрано)" + msgid "Select a single node to edit its signals and groups." -msgstr "Выберите один узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп." +msgstr "Выберите один узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ Ñигналов и групп." + +msgid "Plugin name cannot be blank." +msgstr "Ð˜Ð¼Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° не может быть пуÑтым." + +msgid "Script extension must match chosen language extension (.%s)." +msgstr "" +"РаÑширение Ñкрипта должно ÑоответÑтвовать раÑширению выбранного Ñзыка (.%s)." + +msgid "Subfolder name is not a valid folder name." +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð°Ð¿ÐºÐ¸ не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым именем папки." + +msgid "Subfolder cannot be one which already exists." +msgstr "Подпапка Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ именем уже ÑущеÑтвует." msgid "Edit a Plugin" msgstr "Редактировать плагин" msgid "Create a Plugin" -msgstr "Создать дополнение" +msgstr "Создать плагин" msgid "Update" -msgstr "Обновление" +msgstr "Обновить" msgid "Plugin Name:" -msgstr "Ð˜Ð¼Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ:" +msgstr "Ð˜Ð¼Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°:" msgid "Subfolder:" msgstr "Подпапка:" @@ -3643,6 +4649,12 @@ msgstr "Выбирайте, перемещайте и Ñоздавайте Ñ‚Ð¾Ñ msgid "Enable snap and show grid." msgstr "Включить привÑзку и отображение Ñетки." +msgid "Sync:" +msgstr "Синхронизировать:" + +msgid "Blend:" +msgstr "Смешивание:" + msgid "Point" msgstr "Точка" @@ -3685,15 +4697,9 @@ msgstr "Удалить точки и треугольники." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Создать ÑмеÑÑŒ треугольники автоматичеÑки (а не вручную)" -msgid "Blend:" -msgstr "Смешивание:" - msgid "Parameter Changed:" msgstr "Параметр изменён:" -msgid "Edit Filters" -msgstr "Редактировать фильтры" - msgid "Output node can't be added to the blend tree." msgstr "Узел вывода не может быть добавлен в дерево ÑмешиваниÑ." @@ -3762,9 +4768,21 @@ msgstr "Добавить узел..." msgid "Enable Filtering" msgstr "Включить фильтрацию" +msgid "Library Name:" +msgstr "Ð˜Ð¼Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸:" + +msgid "Animation name can't be empty." +msgstr "Ð˜Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸ не может быть пуÑтым." + msgid "Load Animation" msgstr "Загрузить анимацию" +msgid "Invalid AnimationLibrary file." +msgstr "ÐедопуÑтимый файл AnimationLibrary." + +msgid "Invalid Animation file." +msgstr "ÐедопуÑтимый файл анимации." + msgid "Animation Name:" msgstr "Ðазвание анимации:" @@ -3774,6 +4792,21 @@ msgstr "Ð’ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" msgid "Open in Inspector" msgstr "Открыть в инÑпекторе" +msgid "Paste Animation to Library from clipboard" +msgstr "Ð’Ñтавить анимацию в библиотеку из буфера обмена" + +msgid "Save animation library to resource on disk" +msgstr "Сохранить библиотеку анимаций в реÑÑƒÑ€Ñ Ð½Ð° диÑке" + +msgid "Copy animation to clipboard" +msgstr "Копировать анимацию в буфер обмена" + +msgid "Save animation to resource on disk" +msgstr "Сохранить анимацию в реÑÑƒÑ€Ñ Ð½Ð° диÑке" + +msgid "Edit Animation Libraries" +msgstr "Редактировать библиотеки анимаций" + msgid "Storage" msgstr "Хранилище" @@ -3807,6 +4840,9 @@ msgstr "Изменена поÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" msgid "Change Blend Time" msgstr "Изменить Ð²Ñ€ÐµÐ¼Ñ ÑмешиваниÑ" +msgid "Duplicated Animation Name:" +msgstr "ПовторÑющееÑÑ Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:" + msgid "Play selected animation backwards from current pos. (A)" msgstr "" "ВоÑпроизвеÑти выбранную анимацию в обратном направлении Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ позиции. " @@ -3816,9 +4852,6 @@ msgid "Play selected animation backwards from end. (Shift+A)" msgstr "" "ВоÑпроизвеÑти выбранную анимацию в обратном направлении Ñ ÐºÐ¾Ð½Ñ†Ð°. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "ОÑтановить воÑпроизведение анимации. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "ВоÑпроизвеÑти выбранную анимацию Ñначала. (Shift+D)" @@ -3837,6 +4870,9 @@ msgstr "ИнÑтрументы анимации" msgid "Animation" msgstr "ÐнимациÑ" +msgid "Manage Animations..." +msgstr "Управление анимациÑми..." + msgid "Edit Transitions..." msgstr "Редактировать переходы..." @@ -4026,6 +5062,9 @@ msgstr "Ðе удалоÑÑŒ проверить хеш SHA-256" msgid "Asset Download Error:" msgstr "Ошибка загрузки шаблона:" +msgid "Ready to install!" +msgstr "Готово к уÑтановке!" + msgid "Downloading (%s / %s)..." msgstr "Загрузка (%s / %s)..." @@ -4210,8 +5249,29 @@ msgstr "Сгруппирован" msgid "Add Node Here" msgstr "Добавить узел Ñюда" +msgid "Instantiate Scene Here" +msgstr "ИнÑтанцировать Ñцену здеÑÑŒ" + +msgid "Paste Node(s) Here" +msgstr "Ð’Ñтавить узел(узлы) здеÑÑŒ" + +msgid "Move Node(s) Here" +msgstr "ПеремеÑтить узел(узлы) Ñюда" + +msgid "px" +msgstr "пикÑ" + +msgid "units" +msgstr "ед" + +msgid "Moving:" +msgstr "Перемещение:" + +msgid "Rotating:" +msgstr "Вращение:" + msgid "Scaling:" -msgstr "МаÑштаб:" +msgstr "МаÑштабирование:" msgid "" "Project Camera Override\n" @@ -4713,6 +5773,9 @@ msgstr "" "При удалённом иÑпользовании на уÑтройÑтве, Ñто работает Ñффективнее еÑли " "ÑÐµÑ‚ÐµÐ²Ð°Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема включена." +msgid " - Variation" +msgstr " - ВариациÑ" + msgid "Convert to CPUParticles2D" msgstr "Преобразовать в CPUParticles2D" @@ -4755,12 +5818,60 @@ msgstr "Объём" msgid "Emission Source:" msgstr "ИÑточник излучениÑ:" +msgid "A processor material of type 'ParticleProcessMaterial' is required." +msgstr "ТребуетÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» типа «ParticleProcessMaterial»." + +msgid "Convert to CPUParticles3D" +msgstr "Преобразовать в CPUParticles3D" + +msgid "Generating Visibility AABB (Waiting for Particle Simulation)" +msgstr "Создание видимого AABB (ожидание ÑимулÑции чаÑтиц)" + msgid "Generate Visibility AABB" -msgstr "Генерировать AABB" +msgstr "Генерировать видимый AABB" + +msgid "Generate AABB" +msgstr "Сгенерировать AABB" + +msgid "Low" +msgstr "Ðизкий" + +msgid "Moderate" +msgstr "Умеренный" + +msgid "High" +msgstr "Ð’Ñ‹Ñокий" + +msgid "Subdivisions: %s" +msgstr "Подразделы: %s" + +msgid "Cell size: %s" +msgstr "Размер Ñчейки: %s" + +msgid "Video RAM size: %s MB (%s)" +msgstr "ВидеопамÑти RAM: %s MB (%s)" + +msgid "Bake SDF" +msgstr "Запечь SDF" + +msgid "" +"No faces detected during GPUParticlesCollisionSDF3D bake.\n" +"Check whether there are visible meshes matching the bake mask within its " +"extents." +msgstr "" +"При запекании GPUParticlesCollisionSDF3D лицевые чаÑти не обнаружены.\n" +"Проверьте, еÑÑ‚ÑŒ ли видимые меши, ÑоответÑтвующие маÑке Ð·Ð°Ð¿ÐµÐºÐ°Ð½Ð¸Ñ Ð² пределах " +"ее границ." + +msgid "Select path for SDF Texture" +msgstr "Выбрать путь к SDF текÑтуре" msgid "Gradient Edited" msgstr "Градиент отредактирован" +msgid "Reverse/mirror gradient." +msgstr "Развернуть/отразить градиент." + msgid "Swap GradientTexture2D Fill Points" msgstr "ПоменÑÑ‚ÑŒ меÑтами точки заливки GradientTexture2D" @@ -4770,6 +5881,9 @@ msgstr "ПоменÑÑ‚ÑŒ меÑтами точки градиентной зал msgid "Toggle Grid Snap" msgstr "Переключить Ñетку привÑзки" +msgid "Configure" +msgstr "КонфигурациÑ" + msgid "Create Occluder Polygon" msgstr "Создан затенÑющий полигон" @@ -4784,6 +5898,9 @@ msgid "Failed creating lightmap images, make sure path is writable." msgstr "" "Сбой ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ оÑвещенноÑти, убедитеÑÑŒ, что путь доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи." +msgid "No editor scene root found." +msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ñцена редактора не найдена." + msgid "Bake Lightmaps" msgstr "Запекать карты оÑвещениÑ" @@ -4845,6 +5962,18 @@ msgstr "Ðет полиÑетки Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸." msgid "Mesh has no UV in layer %d." msgstr "ПолиÑетка не имеет UV в Ñлое %d." +msgid "MeshInstance3D lacks a Mesh." +msgstr "Ð’ MeshInstance3D отÑутÑтвует Mesh." + +msgid "Mesh has no surface to create outlines from." +msgstr "Mesh не имеет поверхноÑти Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÑƒÑ€Ð¾Ð²." + +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES." +msgstr "Тип примитива Mesh не ÑвлÑетÑÑ PRIMITIVE_TRIANGLES." + +msgid "Could not create outline." +msgstr "Ðе удалоÑÑŒ Ñоздать контур." + msgid "Create Outline" msgstr "Создать контур" @@ -5049,12 +6178,6 @@ msgstr "Изменить уведомитель AABB" msgid "Change Particles AABB" msgstr "Изменить AABB чаÑтиц" -msgid "Change Box Shape Extents" -msgstr "Изменить границы прÑмоугольника" - -msgid "Change Probe Extents" -msgstr "Изменить Probe Extents" - msgid "Change Capsule Shape Radius" msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ ÐºÐ°Ð¿Ñулы" @@ -5133,6 +6256,12 @@ msgstr "МанипулÑÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° (без вÑтавленног msgid "Animation Key Inserted." msgstr "Ключ анимации вÑтавлен." +msgid "Objects: %d\n" +msgstr "Объекты: %d\n" + +msgid "Draw Calls: %d" +msgstr "Вызовы отриÑовки: %d" + msgid "Top View." msgstr "Вид Ñверху." @@ -5193,6 +6322,9 @@ msgstr "Режим без теней" msgid "Shadow Atlas" msgstr "ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐ½ÐµÐ¹" +msgid "Display Advanced..." +msgstr "Показать дополнительные..." + msgid "View Environment" msgstr "Окружение" @@ -5273,6 +6405,9 @@ msgstr "ПривÑзать узлы к полу" msgid "Couldn't find a solid floor to snap the selection to." msgstr "Ðе удалоÑÑŒ найти Ñплошной пол, к которому можно привÑзать выделение." +msgid "Preview disabled." +msgstr "Превью отключено." + msgid "Use Local Space" msgstr "ИÑпользовать локальное проÑтранÑтво" @@ -5873,6 +7008,9 @@ msgstr "Стандартный" msgid "Connections to method:" msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº методу:" +msgid "Source" +msgstr "ИÑточник" + msgid "Target" msgstr "Цель" @@ -5995,6 +7133,9 @@ msgstr "Переход к Ñледующей точке оÑтанова" msgid "Go to Previous Breakpoint" msgstr "Перейти к предыдущей точке оÑтанова" +msgid "Save File As" +msgstr "Сохранить файл как" + msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "У Ñтого Ñкелета нет коÑтей, Ñоздайте дочерние Bone2D узлы." @@ -6016,6 +7157,9 @@ msgstr "ПерезапиÑать позу покоÑ" msgid "Create physical bones" msgstr "Создать физичеÑкие коÑти" +msgid "Export Skeleton Profile As..." +msgstr "ÐкÑпортировать профиль Ñкелета как..." + msgid "Play IK" msgstr "ВоÑпроизвеÑти IK" @@ -6037,6 +7181,9 @@ msgstr "Создать LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "ПредпроÑмотр LightOccluder2D" +msgid "Can't convert a Sprite2D from a foreign scene." +msgstr "Ðевозможно конвертировать Sprite2D из другой Ñцены." + msgid "Can't convert a sprite using animation frames to mesh." msgstr "" "Ðе удаетÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ Ñпрайт иÑпользующий анимационные кадры в Ñетку." @@ -6097,7 +7244,7 @@ msgid "ERROR: Couldn't load frame resource!" msgstr "ОШИБКÐ: Ðевозможно загрузить кадр!" msgid "Resource clipboard is empty or not a texture!" -msgstr "Буфер обмена чиÑÑ‚ или не Ñодержит текÑтуру!" +msgstr "Буфер обмена пуÑÑ‚ или не Ñодержит текÑтуру!" msgid "Paste Frame" msgstr "Ð’Ñтавить кадр" @@ -6120,15 +7267,15 @@ msgstr "(пуÑто)" msgid "Animations:" msgstr "Ðнимации:" -msgid "Speed:" -msgstr "СкороÑÑ‚ÑŒ:" - -msgid "Loop" -msgstr "Зациклить" +msgid "Delete Animation" +msgstr "Удалить анимацию" msgid "Animation Frames:" msgstr "Кадры анимации:" +msgid "Frame Duration:" +msgstr "ДлительноÑÑ‚ÑŒ кадра:" + msgid "Zoom Reset" msgstr "СброÑить маÑштабирование" @@ -6177,21 +7324,51 @@ msgstr "Шаг:" msgid "Styleboxes" msgstr "Стили" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "{num} цвет" +msgstr[1] "{num} цвета" +msgstr[2] "{num} цветов" + msgid "No colors found." msgstr "Цвета не найдены." +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "{num} конÑтанта" +msgstr[1] "{num} конÑтанты" +msgstr[2] "{num} конÑтант" + msgid "No constants found." msgstr "КонÑтанты не найдены." msgid "No fonts found." msgstr "Шрифты не найдены." +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "{num} размер шрифта" +msgstr[1] "{num} размера шрифта" +msgstr[2] "{num} размеров шрифта" + msgid "No icons found." msgstr "Иконки не найдены." +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "{num} Ñтиль" +msgstr[1] "{num} ÑтилÑ" +msgstr[2] "{num} Ñтилей" + msgid "No styleboxes found." msgstr "Стили не найдены." +msgid "{num} currently selected" +msgid_plural "{num} currently selected" +msgstr[0] "{num} выбрано в данный момент" +msgstr[1] "{num} выбрано в данный момент" +msgstr[2] "{num} выбрано в данный момент" + msgid "Nothing was selected for the import." msgstr "Ð”Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° ничего не выбрано." @@ -6340,6 +7517,9 @@ msgstr "Добавить тип Темы" msgid "Remove Theme Type" msgstr "Удалить тип Темы" +msgid "Remove Data Type Items From Theme" +msgstr "Удалить Ñлементы типа данных из темы" + msgid "Add Color Item" msgstr "Добавить цвет" @@ -6468,12 +7648,18 @@ msgstr "Добавить тип Ñлемента" msgid "Add Type" msgstr "Добавить тип" +msgid "Override All Default Theme Items" +msgstr "Переопределить вÑе Ñлементы темы по умолчанию" + msgid "Set Variation Base Type" msgstr "Задать базовый тип вариации" msgid "Set Base Type" msgstr "Задать базовый тип" +msgid "Add a type from a list of available types or create a new one." +msgstr "Добавить тип из ÑпиÑка доÑтупных типов или Ñоздать новый." + msgid "Show Default" msgstr "Показать по умолчанию" @@ -6615,15 +7801,66 @@ msgstr "Перевернуть по горизонтали" msgid "Flip Vertically" msgstr "Перевернуть по вертикали" +msgid "Painting:" +msgstr "РиÑование:" + +msgid "Shift+Ctrl: Draw rectangle." +msgstr "Shift+Ctrl: РиÑовать прÑмоугольник." + +msgid "Place Random Tile" +msgstr "РазмеÑтить Ñлучайный тайл" + msgid "Tiles" msgstr "Тайлы" +msgid "Toggle grid visibility." +msgstr "Переключить видимоÑÑ‚ÑŒ Ñетки." + +msgid "Delete All Tile Proxies" +msgstr "Удалить вÑе прокÑи тайлов" + +msgid "Global actions:" +msgstr "Глобальные дейÑтвиÑ:" + msgid "Atlas" msgstr "ÐтлаÑ" +msgid "Setup" +msgstr "ÐаÑтройка" + +msgid "Select tiles." +msgstr "Выделить тайлы." + +msgid "No tiles selected." +msgstr "Тайлы не выбраны." + +msgid "Paint Properties:" +msgstr "СвойÑтва риÑованиÑ:" + +msgid "Create Tiles in Non-Transparent Texture Regions" +msgstr "Создавать тайлы в непрозрачных облаÑÑ‚ÑÑ… текÑтуры" + +msgid "Remove Tiles in Fully Transparent Texture Regions" +msgstr "Удалить тайлы в полноÑтью прозрачных облаÑÑ‚ÑÑ… текÑтуры" + msgid "Yes" msgstr "Да" +msgid "No" +msgstr "Ðет" + +msgid "Add a new atlas source" +msgstr "Добавить новый иÑходник атлаÑа" + +msgid "Add a Scene Tile" +msgstr "Добавить тайл-Ñцену" + +msgid "Scenes collection properties:" +msgstr "СвойÑтва коллекции Ñцен:" + +msgid "Tile properties:" +msgstr "СвойÑтва тайла:" + msgid "TileSet" msgstr "Ðабор тайлов" @@ -6659,9 +7896,15 @@ msgstr "Ð’Ñ‹ хотите удалить ветку %s?" msgid "Do you want to remove the %s remote?" msgstr "Ð’Ñ‹ хотите удалить отÑлеживаемую ветку %s?" +msgid "Create VCS metadata files for:" +msgstr "Создать файлы метаданных VCS длÑ:" + msgid "Apply" msgstr "Применить" +msgid "Connect to VCS" +msgstr "ПодключитьÑÑ Ðº VCS" + msgid "Remote Login" msgstr "Удалённый вход" @@ -6810,6 +8053,9 @@ msgstr "ЛогичеÑкое" msgid "Sampler" msgstr "СÑмплер" +msgid "[default]" +msgstr "[по умолчанию]" + msgid "Add Input Port" msgstr "Добавить входной порт" @@ -6822,6 +8068,9 @@ msgstr "Удалить входной порт" msgid "Remove Output Port" msgstr "Удалить выходной порт" +msgid "Set Parameter Name" +msgstr "Задать Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" + msgid "Set Input Default Port" msgstr "Задать входной порт по умолчанию" @@ -6834,6 +8083,12 @@ msgstr "Узел(узлы) перемещён(ны)" msgid "Visual Shader Input Type Changed" msgstr "Изменен тип ввода визуального шейдера" +msgid "ParameterRef Name Changed" +msgstr "Изменено Ð¸Ð¼Ñ ParameterRef" + +msgid "Varying Name Changed" +msgstr "Изменено Ð¸Ð¼Ñ Varying" + msgid "Vertex" msgstr "Вершины" @@ -7138,12 +8393,18 @@ msgstr "Возвращает гиперболичеÑкий Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ Ð¿Ð°Ñ msgid "Finds the truncated value of the parameter." msgstr "Ðаходит уÑечённое до целого значение параметра." +msgid "Converts screen UV to a SDF." +msgstr "Конвертировать UV Ñкрана в SDF." + msgid "Perform the cubic texture lookup." msgstr "ВыполнÑет поиÑк кубичеÑкой текÑтуры." msgid "Transform function." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ." +msgid "Transform operator." +msgstr "Оператор преобразованиÑ." + msgid "" "Calculate the outer product of a pair of vectors.\n" "\n" @@ -7177,6 +8438,12 @@ msgstr "ВычиÑлÑет обратную транÑформацию." msgid "Calculates the transpose of a transform." msgstr "ВычиÑлÑет транÑпонирование преобразованиÑ." +msgid "Sums two transforms." +msgstr "Суммирует два преобразованиÑ." + +msgid "Subtracts two transforms." +msgstr "Вычитает два преобразованиÑ." + msgid "Multiplies vector by transform." msgstr "Умножает вектор на преобразование." @@ -7343,6 +8610,12 @@ msgstr "ПожалуйÑта, выберите файл «project.godot» или msgid "This directory already contains a Godot project." msgstr "Ðтот каталог уже Ñодержит проект Godot." +msgid "" +"The selected path is not empty. Choosing an empty folder is highly " +"recommended." +msgstr "" +"Выбранный путь не пуÑÑ‚. ÐаÑтоÑтельно рекомендуетÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ пуÑтую папку." + msgid "New Game Project" msgstr "Ðовый игровой проект" @@ -7361,12 +8634,80 @@ msgstr "По Ñтому пути уже ÑущеÑтвует папка Ñ ÑƒÐºÐ msgid "It would be a good idea to name your project." msgstr "Было бы неплохо назвать ваш проект." +msgid "Supports desktop platforms only." +msgstr "Поддерживает только наÑтольные платформы." + +msgid "Advanced 3D graphics available." +msgstr "ДоÑтупна раÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ 3D-графика." + +msgid "Can scale to large complex scenes." +msgstr "Может маÑштабироватьÑÑ Ð´Ð¾ больших Ñложных Ñцен." + +msgid "Uses RenderingDevice backend." +msgstr "ИÑпользует бÑкенд RenderingDevice." + +msgid "Slower rendering of simple scenes." +msgstr "Более медленный рендеринг проÑÑ‚Ñ‹Ñ… Ñцен." + +msgid "Supports desktop + mobile platforms." +msgstr "Поддерживает наÑтольные и мобильные платформы." + +msgid "Less advanced 3D graphics." +msgstr "Менее Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ 3D-графика." + +msgid "Less scalable for complex scenes." +msgstr "Менее маÑштабируемый Ð´Ð»Ñ Ñложных Ñцен." + +msgid "Fast rendering of simple scenes." +msgstr "БыÑтрый рендеринг проÑÑ‚Ñ‹Ñ… Ñцен." + +msgid "Supports desktop, mobile + web platforms." +msgstr "Поддерживает наÑтольные, мобильные и веб-платформы." + +msgid "Least advanced 3D graphics (currently work-in-progress)." +msgstr "Ðаименее Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ 3D-графика (в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð² разработке)." + +msgid "Intended for low-end/older devices." +msgstr "Предназначен Ð´Ð»Ñ Ð±ÑŽÐ´Ð¶ÐµÑ‚Ð½Ñ‹Ñ…/Ñтарых уÑтройÑтв." + +msgid "Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2)." +msgstr "ИÑпользует бÑкенд OpenGL 3 (OpenGL 3.3/ES 3.0/WebGL2)." + +msgid "Fastest rendering of simple scenes." +msgstr "Самый быÑтрый рендеринг проÑÑ‚Ñ‹Ñ… Ñцен." + msgid "Invalid project path (changed anything?)." msgstr "Ðеверный путь к проекту (Что-то изменили?)." +msgid "" +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." +msgstr "" +"Ðе удалоÑÑŒ загрузить проект в «%s» (ошибка %d). Он может отÑутÑтвовать или " +"быть повреждён." + +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ðе удалоÑÑŒ Ñохранить проект в «%s» (ошибка %d)." + +msgid "Warning: This folder is not empty" +msgstr "Предупреждение: Ðта папка не пуÑта" + +msgid "" +"You are about to create a Godot project in a non-empty folder.\n" +"The entire contents of this folder will be imported as project resources!\n" +"\n" +"Are you sure you wish to continue?" +msgstr "" +"Ð’Ñ‹ ÑобираетеÑÑŒ Ñоздать проект Godot в непуÑтой папке.\n" +"Ð’ÑÑ‘ Ñодержимое Ñтой папки будет импортировано как реÑурÑÑ‹ проекта!\n" +"\n" +"Ð’Ñ‹ уверены, что хотите продолжить?" + msgid "Couldn't create project.godot in project path." msgstr "Ðе удалоÑÑŒ Ñоздать project.godot в папке проекта." +msgid "Couldn't create icon.svg in project path." +msgstr "Ðе удалоÑÑŒ Ñоздать icon.svg в папке проекта." + msgid "Error opening package file, not in ZIP format." msgstr "Ошибка при открытии файла пакета, не в формате zip." @@ -7409,6 +8750,14 @@ msgstr "Путь уÑтановки проекта:" msgid "Renderer:" msgstr "ОтриÑовщик:" +msgid "The renderer can be changed later, but scenes may need to be adjusted." +msgstr "" +"ОтриÑовщик может быть изменён позже, но Ñцены могут потребовать " +"корректировки." + +msgid "Version Control Metadata:" +msgstr "Метаданные ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий:" + msgid "Missing Project" msgstr "ОтÑутÑтвующий проект" @@ -7428,13 +8777,164 @@ msgid "Can't open project at '%s'." msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в «%s»." msgid "" +"You requested to open %d projects in parallel. Do you confirm?\n" +"Note that usual checks for engine version compatibility will be bypassed." +msgstr "" +"Ð’Ñ‹ запроÑили параллельное открытие %d проектов. Ð’Ñ‹ уверены?\n" +"Обратите внимание, что обычные проверки ÑовмеÑтимоÑти верÑий движка будут " +"пропущены." + +msgid "" +"The selected project \"%s\" does not specify its supported Godot version in " +"its configuration file (\"project.godot\").\n" +"\n" +"Project path: %s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"Ð’ файле конфигурации («project.godot») выбранного проекта «%s» не указана " +"Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Godot.\n" +"\n" +"Путь проекта: %s\n" +"\n" +"ЕÑли вы продолжите открытие проекта, то файл конфигурации будет преобразован " +"в формат текущей верÑии Godot.\n" +"\n" +"Предупреждение: Ð’Ñ‹ больше не Ñможете открыть проект в предыдущих верÑиÑÑ… " +"движка." + +msgid "" +"The selected project \"%s\" was generated by Godot 3.x, and needs to be " +"converted for Godot 4.x.\n" +"\n" +"Project path: %s\n" +"\n" +"You have three options:\n" +"- Convert only the configuration file (\"project.godot\"). Use this to open " +"the project without attempting to convert its scenes, resources and " +"scripts.\n" +"- Convert the entire project including its scenes, resources and scripts " +"(recommended if you are upgrading).\n" +"- Do nothing and go back.\n" +"\n" +"Warning: If you select a conversion option, you won't be able to open the " +"project with previous versions of the engine anymore." +msgstr "" +"Выбранный проект «%s» был Ñоздан в Godot 3.x, и должен быть конвертирован " +"Ð´Ð»Ñ Godot 4.x.\n" +"\n" +"Путь проекта: %s\n" +"\n" +"У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ три варианта:\n" +"- Конвертировать только файл конфигурации («project.godot»). Выберите Ñтот " +"вариант, чтобы открыть проект, не ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ Ñцены, реÑурÑÑ‹ и Ñкрипты.\n" +"- Конвертировать веÑÑŒ проект, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐ³Ð¾ Ñцены, реÑурÑÑ‹ и Ñценарии " +"(рекомендуетÑÑ, еÑли вы обновлÑетеÑÑŒ).\n" +"- Ðичего не делать и вернутьÑÑ Ð½Ð°Ð·Ð°Ð´.\n" +"\n" +"Предупреждение: ЕÑли вы выберете опцию конвертированиÑ, вы больше не Ñможете " +"открыть проект в предыдущих верÑиÑÑ… движка." + +msgid "Convert project.godot Only" +msgstr "Конвертировать только project.godot" + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"Выбранный проект «%s» был Ñоздан в Ñтарой верÑии движка и должен быть " +"конвертирован Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑии.\n" +"\n" +"Путь проекта: %s\n" +"\n" +"Ð’Ñ‹ хотите преобразовать его?\n" +"\n" +"Предупреждение: Ð’Ñ‹ больше не Ñможете открыть проект в предыдущих верÑиÑÑ… " +"движка." + +msgid "Convert project.godot" +msgstr "Конвертировать project.godot" + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"Ðе удалоÑÑŒ открыть проект «%s», раÑположенный по Ñледующему пути:\n" +"\n" +"%s\n" +"\n" +"ÐаÑтройки проекта были Ñозданы новой верÑией движка, Ñти наÑтройки " +"неÑовмеÑтимы Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑией." + +msgid "" +"Warning: This project uses double precision floats, but this version of\n" +"Godot uses single precision floats. Opening this project may cause data " +"loss.\n" +"\n" +msgstr "" +"Предупреждение: Ð’ Ñтом проекте иÑпользуютÑÑ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð¸Ðµ чиÑла двойной " +"точноÑти, но Ñта верÑиÑ\n" +"Godot иÑпользует плавающие чиÑла одинарной точноÑти. Открытие Ñтого проекта " +"может привеÑти к потере данных.\n" +"\n" + +msgid "" +"Warning: This project uses C#, but this build of Godot does not have\n" +"the Mono module. If you proceed you will not be able to use any C# scripts.\n" +"\n" +msgstr "" +"Предупреждение: Данный проект иÑпользует C#, но Ñта Ñборка Godot не имеет\n" +"Ð¼Ð¾Ð´ÑƒÐ»Ñ Mono. ЕÑли продолжить, вы не Ñможете иÑпользовать Ñкрипты C#.\n" +"\n" + +msgid "" +"Warning: This project was built in Godot %s.\n" +"Opening will upgrade or downgrade the project to Godot %s.\n" +"\n" +msgstr "" +"Предупреждение: Ðтот проект был Ñоздан в Godot %s.\n" +"Открытие приведет к повышению или понижению верÑии проекта до Godot %s.\n" +"\n" + +msgid "" +"Warning: This project uses the following features not supported by this " +"build of Godot:\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Предупреждение: Ðтот проект иÑпользует Ñледующие возможноÑти, не " +"поддерживаемые данной Ñборкой Godot:\n" +"\n" +"%s\n" +"\n" + +msgid "Open anyway? Project will be modified." +msgstr "Открыть вÑÑ‘ равно? Проект будет изменен." + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" "Ðевозможно запуÑтить проект: не назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена.\n" "ПожалуйÑта, отредактируйте проект и уÑтановите главную Ñцену в ÐаÑтройках " -"проекта в категории Application." +"проекта в категории «Application»." msgid "" "Can't run project: Assets need to be imported.\n" @@ -7478,6 +8978,9 @@ msgctxt "Application" msgid "Project Manager" msgstr "Менеджер проектов" +msgid "Filter Projects" +msgstr "Фильтр проектов" + msgid "" "This field filters projects by name and last path component.\n" "To filter projects by name and full path, the query must contain at least " @@ -7490,6 +8993,9 @@ msgstr "" msgid "Loading, please wait..." msgstr "Загрузка, пожалуйÑта, ждите..." +msgid "Last Edited" +msgstr "ПоÑледнее изменение" + msgid "New Project" msgstr "Ðовый проект" @@ -7526,8 +9032,30 @@ msgstr "Удалить вÑе" msgid "Also delete project contents (no undo!)" msgstr "Также удалить Ñодержимое проекта (Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)" +msgid "" +"This option will perform full project conversion, updating scenes, resources " +"and scripts from Godot 3.x to work in Godot 4.0.\n" +"\n" +"Note that this is a best-effort conversion, i.e. it makes upgrading the " +"project easier, but it will not open out-of-the-box and will still require " +"manual adjustments.\n" +"\n" +"IMPORTANT: Make sure to backup your project before converting, as this " +"operation makes it impossible to open it in older versions of Godot." +msgstr "" +"Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ полное конвертирование проекта, обновив Ñцены, реÑурÑÑ‹ и " +"Ñкрипты из Godot 3.x Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ в Godot 4.0.\n" +"\n" +"Обратите внимание, что Ñто конвертирование упрощает обновление проекта, но " +"не гарантирует его работу «из коробки», ручные корректировки вÑÑ‘ ещё " +"необходимы.\n" +"\n" +"Ð’ÐЖÐО: ОбÑзательно Ñделайте резервную копию вашего проекта перед " +"конвертированием, так как Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð´ÐµÐ»Ð°ÐµÑ‚ невозможным его открытие в " +"Ñтарых верÑиÑÑ… Godot." + msgid "Can't run project" -msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить проект" +msgstr "Ðе удалоÑÑŒ запуÑтить проект" msgid "" "You currently don't have any projects.\n" @@ -7536,33 +9064,51 @@ msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð²Ð°Ñ Ð½ÐµÑ‚ никаких проектов.\n" "Хотите изучить официальные примеры в Библиотеке реÑурÑов?" +msgid "Add Project Setting" +msgstr "Добавить наÑтройку проекта" + msgid "Delete Item" msgstr "Удалить Ñлемент" +msgid "(All)" +msgstr "(Ð’Ñе)" + msgid "Add Input Action" -msgstr "Добавить дейÑтвие" +msgstr "Добавить дейÑтвие ввода" msgid "Change Action deadzone" msgstr "Изменить мёртвую зону дейÑтвиÑ" -msgid "Add Input Action Event" -msgstr "Добавить дейÑтвие" - msgid "Erase Input Action" -msgstr "Удалить дейÑтвие" +msgstr "Удалить дейÑтвие ввода" msgid "Rename Input Action Event" -msgstr "Переименовать дейÑтвие" +msgstr "Переименовать дейÑтвие ввода" + +msgid "Update Input Action Order" +msgstr "Обновить порÑдок дейÑтвий ввода" msgid "Project Settings (project.godot)" msgstr "ÐаÑтройки проекта (project.godot)" +msgid "Advanced Settings" +msgstr "РаÑширенные наÑтройки" + +msgid "Select a Setting or Type its Name" +msgstr "Выберите наÑтройку или введите её имÑ" + +msgid "Changed settings will be applied to the editor after restarting." +msgstr "Изменённые наÑтройки будут применены поÑле перезапуÑка редактора." + msgid "Input Map" msgstr "СпиÑок дейÑтвий" msgid "Localization" msgstr "ЛокализациÑ" +msgid "Autoload" +msgstr "Ðвтозагрузка" + msgid "Plugins" msgstr "Плагины" @@ -7575,9 +9121,6 @@ msgstr "Выбрать ÑвойÑтво" msgid "Select Virtual Method" msgstr "Выбрать виртуальный метод" -msgid "Select Method" -msgstr "Выбрать метод" - msgid "Batch Rename" msgstr "Групповое переименование" @@ -7596,6 +9139,21 @@ msgstr "Дополнительные параметры" msgid "Substitute" msgstr "Заменить" +msgid "Node name." +msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°." + +msgid "Node's parent name, if available." +msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла, еÑли оно доÑтупно." + +msgid "Node type." +msgstr "Тип узла." + +msgid "Current scene name." +msgstr "Ð˜Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ Ñцены." + +msgid "Root node name." +msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ узла." + msgid "" "Sequential integer counter.\n" "Compare counter options." @@ -7610,9 +9168,15 @@ msgid "If set, the counter restarts for each group of child nodes." msgstr "" "ЕÑли уÑтановлено, Ñчетчик перезапуÑкаетÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группы дочерних узлов." +msgid "Initial value for the counter." +msgstr "Ðачальное значение Ð´Ð»Ñ Ñчётчика." + msgid "Step" msgstr "Шаг" +msgid "Amount by which counter is incremented for each node." +msgstr "Значение, на которое увеличиваетÑÑ Ñчётчик Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ узла." + msgid "Padding" msgstr "ОтÑтуп" @@ -7656,12 +9220,21 @@ msgstr "Ðа Ñимволе %s" msgid "Reparent Node" msgstr "Переподчинить узел" +msgid "Select new parent:" +msgstr "Выберите нового родителÑ:" + msgid "Keep Global Transform" msgstr "Сохранить глобальные преобразованиÑ" msgid "Reparent" msgstr "Переподчинить" +msgid "File name invalid." +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°." + +msgid "Root Type:" +msgstr "Тип корнÑ:" + msgid "2D Scene" msgstr "2D Ñцена" @@ -7671,6 +9244,12 @@ msgstr "3D Ñцена" msgid "User Interface" msgstr "ПользовательÑкий интерфейÑ" +msgid "Scene Name:" +msgstr "Ð˜Ð¼Ñ Ñцены:" + +msgid "Root Name:" +msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½Ñ:" + msgid "Error loading scene from %s" msgstr "Ошибка при загрузке Ñцены из %s" @@ -7776,9 +9355,15 @@ msgstr "" msgid "Make Local" msgstr "Сделать локальным" +msgid "Enable Scene Unique Name(s)" +msgstr "Включить уникальные имена Ñцен" + msgid "Unique names already used by another node in the scene:" msgstr "Данное уникальное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользовано у другого узла в Ñцене:" +msgid "Disable Scene Unique Name(s)" +msgstr "Отключить уникальные имена Ñцен" + msgid "New Scene Root" msgstr "Ðовый корень Ñцены" @@ -7915,8 +9500,24 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" -"ДоÑтуп к узлу можно получить из любой точки Ñцены, предшеÑтвовав ему Ñ " -"префикÑом «%s» на пути узла. Ðажмите, чтобы отключить" +"ДоÑтуп к Ñтому узлу можно получить из любого меÑта Ñцены, предварÑÑ ÐµÐ³Ð¾ " +"префикÑом «%s» в пути к узлу.\n" +"Ðажмите, чтобы отключить Ñто." + +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "Узел имеет {num} Ñоединение." +msgstr[1] "Узел имеет {num} ÑоединениÑ." +msgstr[2] "Узел имеет {num} Ñоединений." + +msgid "Node is in this group:" +msgid_plural "Node is in the following groups:" +msgstr[0] "Узел в Ñтой группе:" +msgstr[1] "Узел в Ñледующих группах:" +msgstr[2] "Узел в Ñледующих группах:" + +msgid "Click to show signals dock." +msgstr "Ðажмите, чтобы показать панель Ñигналов." msgid "Open Script:" msgstr "Открыть Ñкрипт:" @@ -7986,6 +9587,12 @@ msgstr "Открыть Ñкрипт / Выбрать меÑто" msgid "Open Script" msgstr "Открыть Ñкрипт" +msgid "Inherit %s" +msgstr "ÐаÑледует %s" + +msgid "Inherit" +msgstr "ÐаÑледует" + msgid "File exists, it will be reused." msgstr "Файл ÑущеÑтвует, будет иÑпользован повторно." @@ -8048,6 +9655,12 @@ msgstr "ÐедопуÑтимый базовый путь." msgid "Wrong extension chosen." msgstr "Выбрано неверное раÑширение." +msgid "Mode:" +msgstr "Режим:" + +msgid "Global shader parameter '%s' already exists'" +msgstr "Глобальный параметр шейдера «%s» уже ÑущеÑтвует" + msgid "Change Cylinder Radius" msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð°" @@ -8090,6 +9703,9 @@ msgstr "ÐедопуÑтимый формат ÑкземплÑра ÑÐ»Ð¾Ð²Ð°Ñ€Ñ msgid "Invalid instance dictionary (invalid subclasses)" msgstr "ÐедопуÑтимый ÑкземплÑÑ€ ÑÐ»Ð¾Ð²Ð°Ñ€Ñ (неверные подклаÑÑÑ‹)" +msgid "Path to Blender installation is valid." +msgstr "Путь к уÑтановке Blender ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым." + msgid "Next Plane" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾ÑкоÑÑ‚ÑŒ" @@ -8211,6 +9827,15 @@ msgstr "Размер" msgid "Network Profiler" msgstr "Сетевой профайлер" +msgid "Not possible to add a new property to synchronize without a root." +msgstr "Ðевозможно добавить новое ÑвойÑтво Ð´Ð»Ñ Ñинхронизации без корнÑ." + +msgid "Spawn" +msgstr "РазмеÑтить" + +msgid "Delete Property?" +msgstr "Удалить ÑвойÑтво?" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" "РеÑÑƒÑ€Ñ NavigationMesh должен быть уÑтановлен или Ñоздан Ð´Ð»Ñ Ñтого узла." @@ -8260,6 +9885,12 @@ msgstr "Ðнализ геометрии..." msgid "Done!" msgstr "Сделано!" +msgid "Error loading %s: %s." +msgstr "Ошибка загрузки %s: %s." + +msgid "Add an action set." +msgstr "Добавить набор дейÑтвий." + msgid "Pose" msgstr "Поза" @@ -8363,25 +9994,16 @@ msgstr "ÐедейÑтвительный публичный ключ Ð´Ð»Ñ Ñ€Ð° msgid "Invalid package name:" msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "«Use Custom Build» должен быть включен Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"«Export AAB» дейÑтвителен только при включённой опции «ИÑпользовать " -"пользовательÑкую Ñборку»." - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" -"\"Min SDK\" должно быть валидным целым чиÑлом, полученное \"%s\" - не " -"валидно." +"«Min SDK» должен быть значением целого типа, но получено «%s», что " +"недопуÑтимо." msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" -"\"Min SDK\" не может быть меньше чем %d - Ñто верÑÐ¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Godot " -"библиотекой." +"\"Min SDK\" не может быть меньше %d верÑии, требуемой библиотекой Godot." msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." @@ -8393,8 +10015,8 @@ msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" -"\"Target SDK\" %d выше чем верÑÐ¸Ñ Ð¿Ð¾ умолчанию %d. Ðто может Ñработать, но " -"не теÑтировано и может быть не Ñтабильным." +"«Target SDK» %d выше чем верÑÐ¸Ñ Ð¿Ð¾ умолчанию %d. Ðто может работать, но не " +"теÑтировалоÑÑŒ и может быть неÑтабильным." msgid "Code Signing" msgstr "ПодпиÑÑŒ кода" @@ -8421,6 +10043,13 @@ msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл a msgid "'apksigner' returned with error #%d" msgstr "«apksigner» завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ #%d" +msgid "" +"output: \n" +"%s" +msgstr "" +"вывод: \n" +"%s" + msgid "Verifying %s..." msgstr "Проверка %s..." @@ -8443,13 +10072,6 @@ msgid "Unsupported export format!" msgstr "Ðеподдерживаемый формат ÑкÑпорта!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Попытка Ñборки из пользовательÑкого шаблона, но информации о верÑии Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ " -"не ÑущеÑтвует. ПожалуйÑта, переуÑтановите из меню «Проект»." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -8539,6 +10161,19 @@ msgstr "Символ «%s» в идентификаторе не допуÑкаРmsgid "Failed to open executable file \"%s\"." msgstr "Ðе удалоÑÑŒ открыть иÑполнÑемый файл \"%s\"." +msgid "Executable file header corrupted." +msgstr "Заголовок иÑполнÑемого файла поврежден." + +msgid "32-bit executables cannot have embedded data >= 4 GiB." +msgstr "" +"32-разрÑдные иÑполнÑемые файлы не могут иметь вÑтроенных данных >= 4 ГБ." + +msgid "Executable \"pck\" section not found." +msgstr "ИÑполнÑемый раздел \"pck\" не найден." + +msgid "Could not create temp directory:" +msgstr "Ðе удалоÑÑŒ Ñоздать временный каталог:" + msgid "Can't get filesystem access." msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к файловой ÑиÑтеме." @@ -8616,6 +10251,12 @@ msgstr "" msgid "Could not start xcrun executable." msgstr "Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить иÑполнÑемый файл xcrun." +msgid "Built-in CodeSign failed with error \"%s\"." +msgstr "Ð’Ñтроенный CodeSign завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ \"%s\"." + +msgid "Built-in CodeSign require regex module." +msgstr "Ð”Ð»Ñ Ð²Ñтроенного CodeSign требуетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ регулÑрных выражений." + msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." @@ -8711,6 +10352,13 @@ msgstr "" "Apple Silicon." msgid "" +"Code signing: Using ad-hoc signature. The exported project will be blocked " +"by Gatekeeper" +msgstr "" +"ПодпиÑание кода: ИÑпользование ad-hoc подпиÑи. ÐкÑпортированный проект будет " +"заблокирован Gatekeeper" + +msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" @@ -8801,6 +10449,9 @@ msgstr "Ðе удалоÑÑŒ запиÑать файл: \"%s\"." msgid "Could not read file: \"%s\"." msgstr "Ðе удалоÑÑŒ прочитать файл: \"%s\"." +msgid "PWA" +msgstr "ПрогреÑÑивное веб-приложение" + msgid "Could not read HTML shell: \"%s\"." msgstr "Ðе удалоÑÑŒ прочитать HTML-оболочку: \"%s\"." @@ -8852,6 +10503,9 @@ msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°:" msgid "Invalid product version:" msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð°:" +msgid "Windows executables cannot be >= 4 GiB." +msgstr "ИÑполнÑемые файлы Windows не могут иметь размер >= 4 ГБ." + msgid "" "This node has no shape, so it can't collide or interact with other objects.\n" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " @@ -8874,6 +10528,12 @@ msgstr "" "ÐедопуÑтимый полигон. Ð’ режиме «Segments» необходимо по крайней мере 2 точки." msgid "" +"The One Way Collision property will be ignored when the parent is an Area2D." +msgstr "" +"СвойÑтво One Way Collision будет игнорироватьÑÑ, еÑли родителем ÑвлÑетÑÑ " +"Area2D." + +msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" @@ -8959,6 +10619,13 @@ msgstr "" "PathFollow2D работает только при уÑтановке его в качеÑтве дочернего узла " "Path2D." +msgid "" +"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a " +"parent node!" +msgstr "" +"PhysicalBone2D работает только Ñо Skeleton2D или другим PhysicalBone2D в " +"качеÑтве родительÑкого узла!" + msgid "Path property must point to a valid Node2D node to work." msgstr "" "Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы ÑвойÑтво Path должно указывать на дейÑтвующий узел " @@ -8978,6 +10645,17 @@ msgstr "" "У Ñтой коÑти отÑутÑтвует Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ REST-позициÑ. Перейдите к узлу " "Skeleton2D и уÑтановите её." +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon3D Ñлужит формой ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ узлам унаÑледованным от " +"CollisionObject3D.\n" +"ПожалуйÑта иÑпользуйте его только в качеÑтве дочернего Ð´Ð»Ñ Area3D, " +"StaticBody3D, RigidBody3D, CharacterBody3D и др. чтобы придать им форму." + msgid "Nothing is visible because no mesh has been assigned." msgstr "Ðичто не видно, потому что не назначена Ñетка." @@ -9037,6 +10715,13 @@ msgstr "" "ЛКМ: Применить цвет\n" "ПКМ: Удалить преÑет" +msgid "" +"Color: #%s\n" +"LMB: Apply color" +msgstr "" +"Цвет: #%s\n" +"ЛКМ: Применить цвет" + msgid "Pick a color from the editor window." msgstr "Выберите цвет в Ñкране редактора." @@ -9118,6 +10803,16 @@ msgstr "" "Размер облаÑти проÑмотра должен быть больше или равен 2 пикÑелÑм в обоих " "измерениÑÑ…, чтобы отобразить что-либо." +msgid "Unsupported BMFont texture format." +msgstr "Ðеподдерживаемый формат текÑтуры BMFont." + +msgid "" +"Shader keywords cannot be used as parameter names.\n" +"Choose another name." +msgstr "" +"Ключевые Ñлова шейдера Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в качеÑтве имен параметров.\n" +"Выберите другое имÑ." + msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." @@ -9143,6 +10838,12 @@ msgstr "Повторить" msgid "Invalid comparison function for that type." msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого типа." +msgid "Invalid arguments for the built-in function: \"%s(%s)\"." +msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð²Ñтроенной функции: «%s(%s)»." + +msgid "Invalid assignment of '%s' to '%s'." +msgstr "ÐедопуÑтимое приÑвоение «%s» в «%s»." + msgid "Varying may not be assigned in the '%s' function." msgstr "Varying не может быть задано в функции «%s»." @@ -9154,3 +10855,79 @@ msgstr "Ðазначить форму." msgid "Constants cannot be modified." msgstr "КонÑтанты не могут быть изменены." + +msgid "Cannot convert from '%s' to '%s'." +msgstr "Ðевозможно преобразовать «%s» в «%s»." + +msgid "Expected ')' in expression." +msgstr "ОжидаетÑÑ Â«)» в выражении." + +msgid "No matching constructor found for: '%s'." +msgstr "Ðе найден подходÑщий конÑтруктор длÑ: «%s»." + +msgid "No matching function found for: '%s'." +msgstr "Ðе найдена подходÑÑ‰Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð»Ñ: «%s»." + +msgid "Invalid arguments to unary operator '%s': %s." +msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ ÑƒÐ½Ð°Ñ€Ð½Ð¾Ð³Ð¾ оператора «%s»: %s." + +msgid "Invalid argument to ternary operator: '%s'." +msgstr "ÐедопуÑтимый аргумент Ð´Ð»Ñ Ñ‚ÐµÑ€Ð½Ð°Ñ€Ð½Ð¾Ð³Ð¾ оператора: «%s»." + +msgid "Invalid arguments to operator '%s': '%s'." +msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° «%s»: «%s»." + +msgid "Invalid shader type. Valid types are: %s" +msgstr "Ðеверный тип шейдера. ДопуÑтимые типы: %s" + +msgid "Expected an identifier for render mode." +msgstr "ОжидаетÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ режима рендеринга." + +msgid "Nested structs are not allowed." +msgstr "Вложенные Ñтруктуры не допуÑкаютÑÑ." + +msgid "Expected data type." +msgstr "ОжидаетÑÑ Ñ‚Ð¸Ð¿ данных." + +msgid "Expected an identifier or '['." +msgstr "ОжидалÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ или '['." + +msgid "Empty structs are not allowed." +msgstr "ПуÑтые Ñтруктуры не допуÑкаютÑÑ." + +msgid "The '%s' data type is not supported for uniforms." +msgstr "Тип данных '%s' не поддерживаетÑÑ ÑƒÐ½Ð¸Ñ„Ð¾Ñ€Ð¼Ð°Ð¼Ð¸." + +msgid "Duplicated hint: '%s'." +msgstr "ДублируетÑÑ Ð¿Ð¾Ð´Ñказка: «%s»." + +msgid "Invalid argument name." +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°." + +msgid "Missing condition." +msgstr "Пропущено уÑловие." + +msgid "Condition evaluation error." +msgstr "Ошибка вычиÑÐ»ÐµÐ½Ð¸Ñ ÑƒÑловиÑ." + +msgid "The const '%s' is declared but never used." +msgstr "КонÑтанта '%s' объÑвлена, но не иÑпользуетÑÑ." + +msgid "The function '%s' is declared but never used." +msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ '%s' объÑвлена, но не иÑпользуетÑÑ." + +msgid "The struct '%s' is declared but never used." +msgstr "Структура '%s' объÑвлена, но не иÑпользуетÑÑ." + +msgid "The uniform '%s' is declared but never used." +msgstr "Юниформа '%s' объÑвлена, но не иÑпользуетÑÑ." + +msgid "The local variable '%s' is declared but never used." +msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ '%s' объÑвлена, но не иÑпользуетÑÑ." + +msgid "" +"The total size of the %s for this shader on this device has been exceeded " +"(%d/%d). The shader may not work correctly." +msgstr "" +"Полный размер %s Ð´Ð»Ñ Ñтого шейдера на Ñтом уÑтройÑтве превышает (%d/%d). " +"Шейдер может работать некорректно." diff --git a/editor/translations/editor/sk.po b/editor/translations/editor/sk.po index cbe2cbaade..5d70b699e1 100644 --- a/editor/translations/editor/sk.po +++ b/editor/translations/editor/sk.po @@ -517,9 +517,6 @@ msgstr "OdpojiÅ¥" msgid "Connect a Signal to a Method" msgstr "PripojiÅ¥ Signál k Metóde" -msgid "Edit Connection:" -msgstr "UpraviÅ¥ Pripojenie:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Naozaj chcete odstrániÅ¥ vÅ¡etky pripojenia z \"%s\" signálu?" @@ -1289,6 +1286,9 @@ msgstr "ZmeniÅ¥ veľkosÅ¥ Array-u" msgid "Set Multiple:" msgstr "NastaviÅ¥ Viac:" +msgid "Edit Filters" +msgstr "UpraviÅ¥ Filtre" + msgid "Language:" msgstr "Jazyk:" @@ -1753,23 +1753,6 @@ msgid "Manage Templates" msgstr "SpravovaÅ¥ Å ablóny" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Toto pripravà vás projekt pre vlastný Android builds keÄ inÅ¡talujete source " -"template do \"res://android/build\".\n" -"Teraz môžete pridaÅ¥ modifikácie a tak vytvoriÅ¥ vlastné APK na export " -"(pridávanie modulov, zmeniÅ¥ AndroidManifest.xml, atÄ.).\n" -"Poznámka že v záujme vytvorenia vlastných zostavenà namiesto použitia vopred " -"vytvorených súborov APK by mala byÅ¥ v predvoľbe exportu systému Android " -"povolená možnosÅ¥ \"Use Costom Build\"." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2430,6 +2413,9 @@ msgstr "Vyberte a premiestnite body, vytvorte body z RMB." msgid "Enable snap and show grid." msgstr "PovoliÅ¥ prichytenie a zobraziÅ¥ mriežku." +msgid "Blend:" +msgstr "Blend:" + msgid "Point" msgstr "Bod" @@ -2474,12 +2460,6 @@ msgstr "VymazaÅ¥ body a trojuholnÃky." msgid "Generate blend triangles automatically (instead of manually)" msgstr "VygenerovaÅ¥ blend trojuholnÃky Automaticky (nie manuálne)" -msgid "Blend:" -msgstr "Blend:" - -msgid "Edit Filters" -msgstr "UpraviÅ¥ Filtre" - msgid "Output node can't be added to the blend tree." msgstr "Nemôžete pridaÅ¥ output node do blend tree." @@ -2596,9 +2576,6 @@ msgstr "SpusÅ¥iÅ¥ vybranú animáciu odzadu z aktuálnej pozÃcie. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "SpustiÅ¥ vybranú animáciu odzadu z konca. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "ZastaviÅ¥ playback animácie. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "SpustiÅ¥ vybranú animáciu od zaÄiatku. (Shift+D)" diff --git a/editor/translations/editor/sv.po b/editor/translations/editor/sv.po index e75414e9bd..bb8c623dec 100644 --- a/editor/translations/editor/sv.po +++ b/editor/translations/editor/sv.po @@ -3,12 +3,12 @@ # Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. # This file is distributed under the same license as the Godot source code. # bergmarklund <davemcgroin@gmail.com>, 2017, 2018. -# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017, 2021. +# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017, 2021, 2023. # Jakob Sinclair <sinclair.jakob@mailbox.org>, 2018. # . <grenoscar@gmail.com>, 2018, 2020. # Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>, 2018. # Magnus Helander <helander@fastmail.net>, 2018. -# Daniel K <danielkimblad@hotmail.com>, 2018. +# Daniel K <danielkimblad@hotmail.com>, 2018, 2023. # Toiya <elviraa98@gmail.com>, 2019. # Fredrik Welin <figgemail@gmail.com>, 2019. # Mattias Münster <mattiasmun@gmail.com>, 2019. @@ -33,8 +33,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 11:20+0000\n" -"Last-Translator: Ludvig Svenonius <ludvig.svenonius@protonmail.com>\n" +"PO-Revision-Date: 2023-02-09 18:26+0000\n" +"Last-Translator: Daniel K <danielkimblad@hotmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -42,11 +42,172 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "Nollställ" + +msgid "Left Mouse Button" +msgstr "Vänster Musknapp" + +msgid "Right Mouse Button" +msgstr "Höger Musknapp" + +msgid "Middle Mouse Button" +msgstr "Mitten Musknapp" + +msgid "Mouse Wheel Up" +msgstr "Mus Scrollhjul Upp" + +msgid "Mouse Wheel Down" +msgstr "Mus Scrollhjul Ner" + +msgid "Mouse Wheel Left" +msgstr "Mus Scrollhjul Vänster" + +msgid "Mouse Wheel Right" +msgstr "Mus Scrollhjul Höger" + +msgid "Mouse Thumb Button 1" +msgstr "Tum Knapp Mus 1" + +msgid "Mouse Thumb Button 2" +msgstr "Tum Knapp Mus 2" msgid "Button" msgstr "Knapp" +msgid "Double Click" +msgstr "Dubbelklick" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "Musrörelse pÃ¥ plats (%s) med hastighet (%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "Vänster Spak X-Axel, Joystick 0 X-Axel" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "Vänster Spak Y-Axel, Joystick 0 Y-Axel" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "Höger Spak X-Axel, Joystick 1 X-Axel" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "Höger Spak Y-Axel, Joystick 1 Y-Axel" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "Joystick 2 X-Axel, Vänster avtryckare, Sony L2, Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "Joystick 2 Y-Axel, Höger Avtryckare, Sony R2, Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "Joystick 3 X-Axel" + +msgid "Joystick 3 Y-Axis" +msgstr "Joystick 3 Y-Axel" + +msgid "Joystick 4 X-Axis" +msgstr "Joystick 4 X-Axel" + +msgid "Joystick 4 Y-Axis" +msgstr "Joystick 4 Y-Axel" + +msgid "Unknown Joypad Axis" +msgstr "Okänd Joypad Axel" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "Joypadrörelse pÃ¥ axel %d (%s) med värde %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "Nedre Action, Sony Kryss, Xbox A, Nintendo B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "Höger Action, Sony Cirkel, Xbox B, Nintendo A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "Vänster Action, Sony Fyrkant, Xbox X, Nintendo Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "Övre Action, Sony Triangel, Xbox Y, Nintendo X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "Tillbaka, Sony Select, XBox Back, Nintendo -" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "Guide, Sony PS, Xbox Home" + +msgid "Start, Nintendo +" +msgstr "Start, Nintendo +" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "Vänster Spak, Sony L3, XBox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "Höger Spak, Sony R3, Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "Vänster Kantknapp, Sony L1, Xbox LB" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "Höger Kantknapp, Sony R1, Xbox RB" + +msgid "D-pad Up" +msgstr "Styrknapp Upp" + +msgid "D-pad Down" +msgstr "Styrknapp Ner" + +msgid "D-pad Left" +msgstr "Styrknapp Vänster" + +msgid "D-pad Right" +msgstr "Styrknapp Höger" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox Dela-knappen, PS5 Mikrofon, Nintendo Capture" + +msgid "Xbox Paddle 1" +msgstr "Xbox Paddelknapp 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox Paddelknapp 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox Paddelknapp 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox Paddelknapp 4" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 Pekplatta" + +msgid "touched" +msgstr "berörd" + +msgid "released" +msgstr "släppt" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "Skärm %s vid (%s) med %s beröringspunkter" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "" +"Skärm dragen med %s beröringspunkter pÃ¥ position (%s) med hastighet (%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "Förstoringsgest vid (%s) med faktor %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "Panoreringsgest vid (%s) med delta (%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "MIDI Inmatning pÃ¥ Kanel=%s Meddelande=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "Inmatningshändelse med Genväg=%s" + msgid "Select" msgstr "Välj" @@ -56,6 +217,21 @@ msgstr "Avbryt" msgid "Up" msgstr "Upp" +msgid "Down" +msgstr "Ner" + +msgid "Page Up" +msgstr "Page Up" + +msgid "Page Down" +msgstr "Page Down" + +msgid "Home" +msgstr "Home" + +msgid "End" +msgstr "End" + msgid "Cut" msgstr "Klipp" @@ -71,15 +247,114 @@ msgstr "Ã…ngra" msgid "Redo" msgstr "Ã…terställ" +msgid "New Line" +msgstr "Ny Rad" + +msgid "New Blank Line" +msgstr "Ny Blank Rad" + +msgid "New Line Above" +msgstr "Ny Rad Ovanför" + +msgid "Backspace" +msgstr "Backsteg" + +msgid "Backspace Word" +msgstr "Backsteg Ord" + +msgid "Backspace all to Left" +msgstr "Backsteg alla till Vänster" + msgid "Delete" msgstr "Ta bort" +msgid "Delete Word" +msgstr "Ta bort Ord" + +msgid "Delete all to Right" +msgstr "Ta bort alla till Höger" + +msgid "Caret Left" +msgstr "Markör Vänster" + +msgid "Caret Word Left" +msgstr "Markör Ord Vänster" + +msgid "Caret Right" +msgstr "Markör Höger" + +msgid "Caret Word Right" +msgstr "Markör Ord Höger" + +msgid "Caret Up" +msgstr "Markör Upp" + +msgid "Caret Down" +msgstr "Markör Ner" + +msgid "Caret Line Start" +msgstr "Markör Rad Början" + +msgid "Caret Line End" +msgstr "Markör Rad Slut" + +msgid "Caret Page Up" +msgstr "Markör Sida Upp" + +msgid "Caret Page Down" +msgstr "Markör Sida Ner" + +msgid "Caret Document Start" +msgstr "Markör Dokument Början" + +msgid "Caret Document End" +msgstr "Markör Dokument Slut" + +msgid "Caret Add Below" +msgstr "Markör Lägg till Under" + +msgid "Caret Add Above" +msgstr "Markör Lägg till Ovan" + +msgid "Scroll Up" +msgstr "Rulla Upp" + +msgid "Scroll Down" +msgstr "Rulla Ner" + msgid "Select All" msgstr "Välj Alla" +msgid "Select Word Under Caret" +msgstr "Välj Ord Under Markör" + +msgid "Add Selection for Next Occurrence" +msgstr "Lägg till Val för Nästa Förekomst" + +msgid "Toggle Insert Mode" +msgstr "Växla Läge Infoga" + +msgid "Text Submitted" +msgstr "Text Skickad" + +msgid "Duplicate Nodes" +msgstr "Dubblerade Noder" + +msgid "Delete Nodes" +msgstr "Ta bort Noder" + +msgid "Go Up One Level" +msgstr "GÃ¥ Upp En NivÃ¥" + msgid "Refresh" msgstr "Uppdatera" +msgid "Show Hidden" +msgstr "Visa Dolda" + +msgid "Swap Input Direction" +msgstr "Växla Inmatnings-riktning" + msgid "Invalid input %d (not passed) in expression" msgstr "Ogiltig inmatning %d (ej överförd) i uttrycket" @@ -122,12 +397,54 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "Exempel: %s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d föremÃ¥l" +msgstr[1] "%d föremÃ¥l" + +msgid "" +"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " +"'\"'" +msgstr "" +"Ogiltigt namn pÃ¥ handling. Det fÃ¥r inte vara tomt eller innehÃ¥lla '/', ':', " +"'=', '\\' or '\"'" + msgid "An action with the name '%s' already exists." -msgstr "En process med namnet '%s' existerar redan." +msgstr "En Handling med namnet '%s' finns redan." + +msgid "Add Event" +msgstr "Lägg till Händelse" + +msgid "Remove Action" +msgstr "Ta bort Handling" + +msgid "Cannot Remove Action" +msgstr "Kan inte ta bort Handling" + +msgid "Edit Event" +msgstr "Redigera Händelse" + +msgid "Remove Event" +msgstr "Ta bort Händelse" + +msgid "Filter by name..." +msgstr "Filtrera efter namn..." + +msgid "Clear All" +msgstr "Rensa Alla" + +msgid "Add New Action" +msgstr "Lägg till ny Handling" msgid "Add" msgstr "Lägg till" +msgid "Show Built-in Actions" +msgstr "Visa Inbyggda Handlingar" + msgid "Action" msgstr "Ã…tgärd" @@ -269,12 +586,29 @@ msgstr "Ändra Animationsinterpoleringsläge" msgid "Change Animation Loop Mode" msgstr "Ändra Animationsslingläge" +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "" +"Komprimerade spÃ¥r kan inte redigeras eller tas bort. Du mÃ¥ste importera " +"animationen pÃ¥ nytt med komprimeringen inaktiverad för att kunna redigera " +"den." + msgid "Remove Anim Track" msgstr "Ta bort Anim spÃ¥r" +msgid "Create new track for %s and insert key?" +msgstr "Skapa ett nytt spÃ¥r för %s och infoga nyckel?" + +msgid "Create %d new tracks and insert keys?" +msgstr "Skapa %d nya spÃ¥r och infoga nycklar?" + msgid "Create" msgstr "Skapa" +msgid "Animation Insert Key" +msgstr "Infoga animeringsnyckel" + msgid "node '%s'" msgstr "nod '%s'" @@ -294,6 +628,10 @@ msgstr "Ändra Animationssteg" msgid "Rearrange Tracks" msgstr "Ändra ordning pÃ¥ spÃ¥r" +msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." +msgstr "" +"3D-spÃ¥r för position/rotation/skala gäller endast för 3D-baserade noder." + msgid "" "Audio tracks can only point to nodes of type:\n" "-AudioStreamPlayer\n" @@ -320,6 +658,18 @@ msgstr "Lägg till Bezier-spÃ¥r" msgid "Track path is invalid, so can't add a key." msgstr "Kurva är felaktig sÃ¥ det gÃ¥r inte att skapa en nyckel." +msgid "Track is not of type Node3D, can't insert key" +msgstr "SpÃ¥ret är inte av typen Node3D, kan inte infoga nyckel" + +msgid "Add Position Key" +msgstr "Lägg till positionsnyckel" + +msgid "Add Rotation Key" +msgstr "Lägg till Rotation Key" + +msgid "Add Scale Key" +msgstr "Lägg till skalningsnyckel" + msgid "Add Track Key" msgstr "Lägg till spÃ¥rnyckel" @@ -329,9 +679,15 @@ msgstr "SpÃ¥rväg ogiltig, kan sÃ¥ledes inte lägga till en metod nyckel." msgid "Add Method Track Key" msgstr "Lägg till metodspÃ¥rnyckel" +msgid "Animation Move Keys" +msgstr "Animation Flyttknappar" + msgid "Scale" msgstr "Skala" +msgid "BlendShape" +msgstr "BlendShape" + msgid "Methods" msgstr "Metoder" @@ -344,18 +700,56 @@ msgstr "Klippbordet är tomt!" msgid "Paste Tracks" msgstr "Klistra in spÃ¥r" +msgid "Animation Scale Keys" +msgstr "Tangenter för animerade skalor" + +msgid "Make Easing Keys" +msgstr "Gör lättnadstangenter" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" "Detta alternativ fungerar ej för att redigera Bezier, dÃ¥ det enbart är ett " "spÃ¥r." +msgid "Animation Add RESET Keys" +msgstr "Animering Lägg till RESET-tangenter" + +msgid "Bake Animation as Linear keys." +msgstr "Bake Animation som linjära nycklar." + +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To modify this animation, navigate to the scene's Advanced Import settings " +"and select the animation.\n" +"Some options, including looping, are available here. To add custom tracks, " +"enable \"Save To File\" and\n" +"\"Keep Custom Tracks\"." +msgstr "" +"Denna animationen tillhör en importerad scen, sÃ¥ ändringar i de importerade " +"spÃ¥ren kommer inte sparas.\n" +"\n" +"För att aktivera förmÃ¥gan att lägga till anpassade spÃ¥r, navigera till " +"scenens import inställningar och ställ in\n" +"\"Animation > Lagring\" till \"Filer\", aktivera \"Animation > BehÃ¥ll " +"Anpassade SpÃ¥r\", sedan importera om.\n" +"Alternativt, använd en importförinställning som importerar animationer till " +"separata filer." + msgid "Warning: Editing imported animation" msgstr "Varning: Redigerar importerad animation" msgid "Select an AnimationPlayer node to create and edit animations." msgstr "Välj en AnimationsSpelar-nod för att skapa och redigera animationer." +msgid "Imported Scene" +msgstr "Importerad Scen" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "Växla mellan redigeringen av bezierkurvor och spÃ¥rredigeringen." + msgid "Only show tracks from nodes selected in tree." msgstr "Visa enbart spÃ¥r frÃ¥n valda noder i trädet." @@ -389,6 +783,9 @@ msgstr "Skala urval" msgid "Scale From Cursor" msgstr "Skala FrÃ¥n Muspekare" +msgid "Make Easing Selection" +msgstr "Gör ett val för lättnader" + msgid "Duplicate Selection" msgstr "Fördubbla val" @@ -407,15 +804,30 @@ msgstr "GÃ¥ till FöregÃ¥ende Steg" msgid "Apply Reset" msgstr "Verkställ Ã¥terställning" +msgid "Bake Animation" +msgstr "Baka Animering" + +msgid "Optimize Animation (no undo)" +msgstr "Optimera Animering (ingen Ã¥ngra)" + +msgid "Clean-Up Animation (no undo)" +msgstr "Uppstädning av Animation (inget att Ã¥ngra)" + msgid "Use Bezier Curves" msgstr "Använd Bezier-kurvor" msgid "Anim. Optimizer" msgstr "Anim. Optimerare" +msgid "Max. Velocity Error:" +msgstr "Max. Hastighetsfel:" + msgid "Max. Angular Error:" msgstr "Max. Vinkel-fel:" +msgid "Max. Precision Error:" +msgstr "Max. Precisionsfel:" + msgid "Optimize" msgstr "Optimera" @@ -437,12 +849,21 @@ msgstr "Städa upp" msgid "Scale Ratio:" msgstr "Skalnings förhÃ¥llande:" +msgid "Select Transition and Easing" +msgstr "Välj ÖvergÃ¥ng och Lättnad" + +msgid "Anim. Baker" +msgstr "Anim. Bakare" + msgid "Select Tracks to Copy" msgstr "Välj SpÃ¥r att Kopiera" msgid "Select All/None" msgstr "Välj Alla/Inga" +msgid "Animation Change Keyframe Time" +msgstr "Ändra Tidsnyckelns Tid pÃ¥ Animationen" + msgid "Add Audio Track Clip" msgstr "Lägg till LjudspÃ¥rsklipp" @@ -461,6 +882,16 @@ msgstr "Radnummer:" msgid "%d replaced." msgstr "%d ersatt." +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d matcha" +msgstr[1] "%d matchar" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "%d av %d matcha" +msgstr[1] "%d av %d matchar" + msgid "Match Case" msgstr "Matcha gemener/versaler" @@ -531,6 +962,12 @@ msgstr "Lägg till extra Call Argument:" msgid "Extra Call Arguments:" msgstr "Extra Call Argument:" +msgid "Allows to drop arguments sent by signal emitter." +msgstr "Gör det möjligt att släppa argument som skickas av signalgivaren." + +msgid "Unbind Signal Arguments:" +msgstr "Koppla bort signalargument:" + msgid "Receiver Method:" msgstr "Mottagarmetod:" @@ -561,6 +998,9 @@ msgstr "Anslut" msgid "Signal:" msgstr "Signal:" +msgid "No description." +msgstr "Ingen beskrivning." + msgid "Connect '%s' to '%s'" msgstr "Anslut '%s' till '%s'" @@ -579,27 +1019,33 @@ msgstr "Koppla frÃ¥n" msgid "Connect a Signal to a Method" msgstr "Anslut en Signal till en Metod" -msgid "Edit Connection:" -msgstr "Redigera Koppling:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Är du säker att du vill ta bort alla kopplingar frÃ¥n \"%s\" signalen?" msgid "Signals" msgstr "Signaler" +msgid "Filter Signals" +msgstr "Filtersignaler" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "Är du säker att du vill ta bort alla kopplingar frÃ¥n denna signal?" msgid "Disconnect All" msgstr "Koppla av alla" +msgid "Copy Name" +msgstr "Kopiera namn" + msgid "Edit..." msgstr "Ändra..." msgid "Go to Method" msgstr "GÃ¥ till metod" +msgid "Change Type of \"%s\"" +msgstr "Ändra typ av \"%s\"" + msgid "Change" msgstr "Ändra" @@ -609,6 +1055,12 @@ msgstr "Skapa Ny %s" msgid "No results for \"%s\"." msgstr "Inga resultat för \"%s\"." +msgid "This class is marked as deprecated." +msgstr "Den här klassen är markerad som inaktuell." + +msgid "This class is marked as experimental." +msgstr "Denna klass är markerad som experimentell." + msgid "No description available for %s." msgstr "Ingen beskrivning tillgänglig för %s." @@ -618,6 +1070,9 @@ msgstr "Favoriter:" msgid "Recent:" msgstr "Senaste:" +msgid "(Un)favorite selected item." +msgstr "(Av)favoritmarkerat objekt." + msgid "Search:" msgstr "Sök:" @@ -636,6 +1091,18 @@ msgstr "Kopiera Nod-Sökväg" msgid "Instance:" msgstr "Instans:" +msgid "" +"This node has been instantiated from a PackedScene file:\n" +"%s\n" +"Click to open the original file in the Editor." +msgstr "" +"Den här noden har installerats frÃ¥n en PackedScene-fil:\n" +"%s\n" +"Klicka för att öppna originalfilen i redigeraren." + +msgid "ms" +msgstr "ms" + msgid "Value" msgstr "Värde" @@ -672,18 +1139,57 @@ msgstr "Namn" msgid "Time" msgstr "Tid" +msgid "Fit to Frame" +msgstr "Anpassa till ram" + +msgid "Linked" +msgstr "Länkad" + +msgid "CPU" +msgstr "PROCESSOR" + +msgid "GPU" +msgstr "GPU" + +msgid "Execution resumed." +msgstr "Utförandet har Ã¥terupptagits." + msgid "Warning:" msgstr "Varning:" msgid "Error:" msgstr "Fel:" -msgid "Source" -msgstr "Källa" +msgid "Stack Trace:" +msgstr "StackspÃ¥rning:" + +msgid "Debug session started." +msgstr "Felsökningssessionen har pÃ¥börjats." + +msgid "Debug session closed." +msgstr "Felsökningssessionen är avslutad." + +msgid "Line %d" +msgstr "Linje %d" + +msgid "Delete Breakpoint" +msgstr "Ta bort brytpunkt" + +msgid "Delete All Breakpoints in:" +msgstr "Ta bort alla brytpunkter i:" + +msgid "Delete All Breakpoints" +msgstr "Ta bort alla brytpunkter" msgid "C++ Source" msgstr "C++ Källa" +msgid "Filter Stack Variables" +msgstr "Filtrera stackvariabler" + +msgid "Visual Profiler" +msgstr "Visuell profilering" + msgid "Total:" msgstr "Totalt:" @@ -743,6 +1249,12 @@ msgstr "Öppna Scen" msgid "Owners of: %s (Total: %d)" msgstr "Ägare av: %s (Totalt: %d)" +msgid "Localization remap" +msgstr "Ommappning av lokalisering" + +msgid "Localization remap for path '%s' and locale '%s'." +msgstr "Lokaliseringsomvandling för sökvägen %s och sprÃ¥ket %s." + msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " @@ -946,6 +1458,12 @@ msgstr "Dämpa" msgid "Bypass" msgstr "GÃ¥ förbi" +msgid "Duplicate Bus" +msgstr "Duplicera buss" + +msgid "Delete Bus" +msgstr "Radera buss" + msgid "Reset Volume" msgstr "Ã…terställ Volym" @@ -1024,18 +1542,27 @@ msgstr "Giltiga tecken:" msgid "Must not collide with an existing engine class name." msgstr "FÃ¥r inte vara samma som ett befintligt engine class-namn." +msgid "Must not collide with an existing global script class name." +msgstr "FÃ¥r inte vara samma som ett befintligt globalt konstant-namn." + msgid "Must not collide with an existing built-in type name." msgstr "FÃ¥r inte vara samma som ett befintligt inbyggt typ-namn." msgid "Must not collide with an existing global constant name." msgstr "FÃ¥r inte vara samma som ett befintligt globalt konstant-namn." +msgid "Keyword cannot be used as an Autoload name." +msgstr "Nyckelord kan inte användas som ett autoladdningsnamn." + msgid "Autoload '%s' already exists!" msgstr "Autoload '%s' finns redan!" msgid "Rename Autoload" msgstr "Byt namn pÃ¥ Autload" +msgid "Toggle Autoload Globals" +msgstr "Växla AutoLoad Globals" + msgid "Move Autoload" msgstr "Flytta Autoload" @@ -1048,12 +1575,18 @@ msgstr "Aktivera" msgid "Rearrange Autoloads" msgstr "Ändra ordning pÃ¥ Autoloads" +msgid "Can't add Autoload:" +msgstr "Kunde inte lägga till Auto laddning:" + msgid "%s is an invalid path. File does not exist." msgstr "%s är en ogiltig genväg. Filen existerar inte." msgid "%s is an invalid path. Not in resource path (res://)." msgstr "%s är en ogiltig genväg. Inte i resurs-genväg (res://)." +msgid "Add Autoload" +msgstr "Lägg till Auto laddning" + msgid "Path:" msgstr "Sökväg:" @@ -1063,12 +1596,71 @@ msgstr "Node Namn:" msgid "Global Variable" msgstr "Global variabel" +msgid "3D Engine" +msgstr "3D motor" + msgid "2D Physics" msgstr "2D-Fysik" msgid "3D Physics" msgstr "3D-Fysik" +msgid "XR" +msgstr "XR" + +msgid "RenderingDevice" +msgstr "Renderare" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Text Server: Fallback" +msgstr "Textserver: Fallback" + +msgid "Text Server: Advanced" +msgstr "Textserver: Avancerad" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "TTF, OTF, Typ 1, WOFF1-teckensnitt" + +msgid "WOFF2 Fonts" +msgstr "WOFF2-teckensnitt" + +msgid "SIL Graphite Fonts" +msgstr "SIL Graphite-teckensnitt" + +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "Rendering av tecknade distansfält med flera kanaler för teckensnitt" + +msgid "3D Nodes as well as RenderingServer access to 3D features." +msgstr "3D Noder samt RenderingServer tillgÃ¥ng till 3D-funktioner." + +msgid "2D Physics nodes and PhysicsServer2D." +msgstr "2D-fysiknoder och PhysicsServer2D." + +msgid "3D Physics nodes and PhysicsServer3D." +msgstr "3D-fysiknoder och PhysicsServer3D." + +msgid "Navigation, both 2D and 3D." +msgstr "Navigering, bÃ¥de 2D och 3D." + +msgid "XR (AR and VR)." +msgstr "XR (AR och VR)." + +msgid "" +"RenderingDevice based rendering (if disabled, the OpenGL back-end is " +"required)." +msgstr "" +"RenderingDevice-baserad rendering (om den är inaktiverad krävs OpenGL-" +"serverdelen)." + +msgid "" +"OpenGL back-end (if disabled, the RenderingDevice back-end is required)." +msgstr "OpenGL-backend (om den är inaktiverad krävs RenderingDevice-backend)." + +msgid "Vulkan back-end of RenderingDevice." +msgstr "Vulkan-back-end av RenderingDevice." + msgid "File '%s' format is invalid, import aborted." msgstr "Fil '%s''s format är ogiltig, import avbruten." @@ -1350,6 +1942,12 @@ msgstr "Egenskaper" msgid "default:" msgstr "standard:" +msgid "Constructors" +msgstr "Konstruktör" + +msgid "Operators" +msgstr "Operatorer" + msgid "Theme Properties" msgstr "Tema Egenskaper" @@ -1360,7 +1958,7 @@ msgid "Enumerations" msgstr "Uppräkningar" msgid "Property Descriptions" -msgstr "Egenskapsbeskrivningar" +msgstr "Egendomsbeskrivning" msgid "" "There is currently no description for this property. Please help us by " @@ -1369,9 +1967,15 @@ msgstr "" "Det finns för närvarande ingen beskrivning för denna egenskap. Snälla hjälp " "oss genom att [color=$color][url=$url]bidra med en[/url][/color]!" +msgid "Constructor Descriptions" +msgstr "Konstruktör beskrivning" + msgid "Method Descriptions" msgstr "Metodbeskrivning" +msgid "Operator Descriptions" +msgstr "Operator beskrivning" + msgid "%d match." msgstr "%d matcha." @@ -1402,6 +2006,9 @@ msgstr "Ändra storlek pÃ¥ Array" msgid "Set Multiple:" msgstr "Sätt Flera:" +msgid "Edit Filters" +msgstr "Redigera Filter" + msgid "Language:" msgstr "SprÃ¥k:" @@ -2207,9 +2814,6 @@ msgstr "Triangel existerar redan." msgid "Parameter Changed:" msgstr "Parameter ändrad:" -msgid "Edit Filters" -msgstr "Redigera Filter" - msgid "Node Moved" msgstr "Nod Flyttad" @@ -2598,6 +3202,9 @@ msgstr "Kasta" msgid "Standard" msgstr "Standard" +msgid "Source" +msgstr "Källa" + msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." msgstr "" @@ -2648,9 +3255,6 @@ msgstr "(tom)" msgid "Animations:" msgstr "Animationer:" -msgid "Loop" -msgstr "Slinga" - msgid "Updating the editor" msgstr "Uppdaterar editorn" diff --git a/editor/translations/editor/th.po b/editor/translations/editor/th.po index 661f212c82..b93243806a 100644 --- a/editor/translations/editor/th.po +++ b/editor/translations/editor/th.po @@ -496,6 +496,9 @@ msgstr "จาà¸à¸ªà¸±à¸à¸à¸²à¸“:" msgid "Scene does not contain any script." msgstr "ไม่มีสคริปต์ในฉาà¸" +msgid "Select Method" +msgstr "เลืà¸à¸à¹€à¸¡à¸—็à¸à¸”" + msgid "Remove" msgstr "ลบ" @@ -551,9 +554,6 @@ msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" msgid "Connect a Signal to a Method" msgstr "เชื่à¸à¸¡à¸•à¹ˆà¸à¸ªà¸±à¸à¸à¸²à¸“ไปยังเมธà¸à¸”" -msgid "Edit Connection:" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•à¹ˆà¸:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸à¸§à¹ˆà¸²à¸ˆà¸°à¸¥à¸šà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•à¹ˆà¸à¸—ั้งหมดจาà¸à¸ªà¸±à¸à¸à¸²à¸“ \"%s\"?" @@ -674,30 +674,15 @@ msgstr "คำเตืà¸à¸™:" msgid "Error:" msgstr "ผิดพลาด:" -msgid "C++ Error" -msgstr "C++ ผิดพลาด" - -msgid "C++ Error:" -msgstr "C++ ผิดพลาด:" - -msgid "Source" -msgstr "ต้นฉบับ" - -msgid "C++ Source" -msgstr "C++ ต้นฉบับ" - -msgid "Source:" -msgstr "ต้นฉบับ:" - -msgid "C++ Source:" -msgstr "C++ ต้นฉบับ:" - msgid "Stack Trace" msgstr "à¹à¸—ร็à¸à¸ªà¹à¸•à¸„" msgid "Copy Error" msgstr "คัดลà¸à¸à¸œà¸´à¸”พลาด" +msgid "C++ Source" +msgstr "C++ ต้นฉบับ" + msgid "Video RAM" msgstr "หน่วยความจำวีดีโà¸" @@ -1514,12 +1499,12 @@ msgstr "à¹à¸ªà¸”งทุà¸à¸ ูมิภาค" msgid "Show Selected Locales Only" msgstr "à¹à¸ªà¸”งเฉพาะภภายในเท่านั้น" +msgid "Edit Filters" +msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" + msgid "Language:" msgstr "ภาษา:" -msgid "Script" -msgstr "สคริปต์" - msgid "Clear Output" msgstr "เคลียร์เà¸à¸²à¸•à¹Œà¸žà¸¸à¸•" @@ -1962,22 +1947,6 @@ msgid "Manage Templates" msgstr "จัดà¸à¸²à¸£à¹€à¸—มเพลต" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"นี่จะตั้งค่าโปรเจคต์ขà¸à¸‡à¸„ุณสำหรับà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸ªà¸³à¸«à¸£à¸±à¸š Android ที่à¸à¸³à¸«à¸™à¸”เà¸à¸‡ " -"โดยà¸à¸²à¸£à¸•à¸´à¸”ตั้งเทมเพลตต้นฉบับไปยัง \"res: // android / build\"\n" -"คุณสามารถปรับเปลี่ยนà¹à¸¥à¸°à¸ªà¸£à¹‰à¸²à¸‡ APK à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡à¸ªà¸³à¸«à¸£à¸±à¸šà¸ªà¹ˆà¸‡à¸à¸à¸ (เพิ่มโมดูล, เปลี่ยน " -"AndroidManifest.xml เป็นต้น)\n" -"โปรดทราบว่าในà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡à¹à¸—นที่จะใช้ APK ที่สร้างไว้ล่วงหน้า ควรเปิดใช้ตัวเลืà¸à¸ " -"\"Use Custom Build\" ในพรีเซ็ตà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¸‚à¸à¸‡ Android" - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2766,6 +2735,9 @@ msgstr "เลืà¸à¸à¸«à¸£à¸·à¸à¹€à¸¥à¸·à¹ˆà¸à¸™à¸ˆà¸¸à¸” สร้างภmsgid "Enable snap and show grid." msgstr "เปิà¸à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸²à¸£à¹€à¸‚้าหาà¹à¸¥à¹à¸ªà¸”งเส้นà¸à¸£à¸´à¸”" +msgid "Blend:" +msgstr "ผสม:" + msgid "Point" msgstr "จุด" @@ -2808,12 +2780,6 @@ msgstr "ลบจุดà¹à¸¥à¸°à¸ªà¸²à¸¡à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡" msgid "Generate blend triangles automatically (instead of manually)" msgstr "สร้างสามเหลี่ยม blend à¸à¸±à¸•à¹‚นมัติ (à¹à¸—นที่à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸šà¸šà¸›à¸à¸•à¸´)" -msgid "Blend:" -msgstr "ผสม:" - -msgid "Edit Filters" -msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" - msgid "Output node can't be added to the blend tree." msgstr "โหนดเà¸à¸²à¸‹à¹Œà¸žà¸¸à¸•à¹„ม่สามารถเพิ่มไปยัง blend tree" @@ -2927,9 +2893,6 @@ msgstr "เล่นà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลืà¸à¸à¸¢à¹‰à¸ msgid "Play selected animation backwards from end. (Shift+A)" msgstr "เล่นà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลืà¸à¸à¸¢à¹‰à¸à¸™à¸«à¸¥à¸±à¸‡à¸ˆà¸²à¸à¸—้ายสุด (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "หยุดà¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "เล่นà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่เลืà¸à¸à¸ˆà¸²à¸à¹€à¸£à¸´à¹ˆà¸¡à¸•à¹‰à¸™ (Shift+D)" @@ -3950,12 +3913,6 @@ msgstr "à¹à¸à¹‰à¹„ข Notifier AABB" msgid "Change Particles AABB" msgstr "à¹à¸à¹‰à¹„ข Particles AABB" -msgid "Change Box Shape Extents" -msgstr "ปรับขนาดทรงสี่เหลี่ยม" - -msgid "Change Probe Extents" -msgstr "à¹à¸à¹‰à¹„ขขนาด Probe" - msgid "Change Capsule Shape Radius" msgstr "ปรับรัศมีทรงà¹à¸„ปซูล" @@ -4671,6 +4628,9 @@ msgstr "มาตรà¸à¸²à¸™" msgid "Connections to method:" msgstr "เชื่à¸à¸¡à¹„ปยังเมธà¸à¸”:" +msgid "Source" +msgstr "ต้นฉบับ" + msgid "Target" msgstr "เป้าหมาย" @@ -4891,12 +4851,6 @@ msgstr "(ว่างเปล่า)" msgid "Animations:" msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" -msgid "Speed:" -msgstr "ความเร็ว:" - -msgid "Loop" -msgstr "วน" - msgid "Animation Frames:" msgstr "เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" @@ -5743,9 +5697,6 @@ msgstr "เพิ่มà¸à¸²à¸£à¸à¸£à¸°à¸—ำ" msgid "Change Action deadzone" msgstr "เปลี่ยน Action deadzone" -msgid "Add Input Action Event" -msgstr "เพิ่มปุ่มà¸à¸”ขà¸à¸‡à¸à¸²à¸£à¸à¸£à¸°à¸—ำ" - msgid "Erase Input Action" msgstr "ลบà¸à¸²à¸£à¸à¸£à¸°à¸—ำ" @@ -5773,9 +5724,6 @@ msgstr "เลืà¸à¸à¸„ุณสมบัติ" msgid "Select Virtual Method" msgstr "เลืà¸à¸à¹€à¸¡à¸—็à¸à¸”" -msgid "Select Method" -msgstr "เลืà¸à¸à¹€à¸¡à¸—็à¸à¸”" - msgid "Batch Rename" msgstr "เปลี่ยนชื่à¸à¸«à¸¥à¸²à¸¢à¸£à¸²à¸¢à¸à¸²à¸£" @@ -6426,12 +6374,6 @@ msgstr "public key ผิดพลาดสำหรับ APK expansion" msgid "Invalid package name:" msgstr "ชื่à¸à¹à¸žà¹‡à¸„เà¸à¸ˆà¸œà¸´à¸”พลาด:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Use Custom Build\" จำเป็นต้à¸à¸‡à¹€à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸«à¸²à¸à¸ˆà¸°à¹ƒà¸Šà¹‰à¸›à¸¥à¸±à¹Šà¸à¸à¸´à¸™" - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "\"Export AAB\" จะใช้ได้เฉพาะเมื่à¸à¹€à¸›à¸´à¸”ใช้งาน \"Use Custom Build\"" - msgid "Invalid filename! Android App Bundle requires the *.aab extension." msgstr "ชื่à¸à¹„ฟล์ผิดพลาด! à¹à¸à¸™à¸”รà¸à¸¢à¸”์à¹à¸à¸›à¸šà¸±à¸™à¹€à¸”ิลจำเป็นต้à¸à¸‡à¸¡à¸µà¸™à¸²à¸¡à¸ªà¸à¸¸à¸¥ *.aab" @@ -6441,12 +6383,6 @@ msgstr "à¸à¸²à¸£à¸‚ยาย APK เข้าà¸à¸±à¸™à¹„ม่ได้à¸à¸±à msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "ชื่à¸à¹„ฟล์ผิดพลาด! à¹à¸à¸™à¸”รà¸à¸¢à¸”์ APK จำเป็นต้à¸à¸‡à¸¡à¸µà¸™à¸²à¸¡à¸ªà¸à¸¸à¸¥ *.apk" -msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"พยายามสร้างจาà¸à¹€à¸—มเพลตที่สร้างขึ้นเà¸à¸‡ à¹à¸•à¹ˆà¹„ม่มีข้à¸à¸¡à¸¹à¸¥à¹€à¸§à¸à¸£à¹Œà¸Šà¸±à¸™ โปรดติดตั้งใหม่จาà¸à¹€à¸¡à¸™à¸¹ \"โปรเจà¸à¸•à¹Œ\"" - msgid "Building Android Project (gradle)" msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจคà¹à¸à¸™à¸”รà¸à¸¢à¸”์ (gradle)" diff --git a/editor/translations/editor/tr.po b/editor/translations/editor/tr.po index 5c845faf1a..8710f48c5b 100644 --- a/editor/translations/editor/tr.po +++ b/editor/translations/editor/tr.po @@ -89,13 +89,14 @@ # Dream Drunk <myemailpoly149@gmail.com>, 2022. # alpdenthedev <ekrem_ekrem_45@hotmail.com>, 2022. # Muhammed Said Gülberk <msgulberk@gmail.com>, 2022. +# Cave Johnson <aperturelabs123@proton.me>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-12-05 10:16+0000\n" -"Last-Translator: Muhammed Said Gülberk <msgulberk@gmail.com>\n" +"PO-Revision-Date: 2023-02-09 09:37+0000\n" +"Last-Translator: Cave Johnson <aperturelabs123@proton.me>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -103,11 +104,35 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "BelirtilmemiÅŸ" msgid "Physical" msgstr "Fiziksel" +msgid "Left Mouse Button" +msgstr "Sol Fare Düğmesi" + +msgid "Right Mouse Button" +msgstr "SaÄŸ Fare Düğmesi" + +msgid "Middle Mouse Button" +msgstr "Orta Fare Düğmesi" + +msgid "Mouse Wheel Up" +msgstr "Fare TekerleÄŸi Yukarı" + +msgid "Mouse Wheel Down" +msgstr "Fare TekerleÄŸi AÅŸağı." + +msgid "Mouse Wheel Left" +msgstr "Sol Fare Tekerlek Düğmesi" + +msgid "Mouse Wheel Right" +msgstr "SaÄŸ Fare Tekerlek Düğmesi" + msgid "Button" msgstr "Düğme" @@ -655,6 +680,9 @@ msgstr "Sinyaller:" msgid "Scene does not contain any script." msgstr "Sahne hiç komut içermiyor." +msgid "Select Method" +msgstr "Metot Seç" + msgid "Remove" msgstr "Kaldır" @@ -710,9 +738,6 @@ msgstr "BaÄŸlantıyı kes" msgid "Connect a Signal to a Method" msgstr "Bir Yönteme Bir Sinyal BaÄŸlayın" -msgid "Edit Connection:" -msgstr "BaÄŸlantıyı Düzenle:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "" "\"%s\" sinyalinden tüm baÄŸlantıları kaldırmak istediÄŸinizden emin misiniz?" @@ -855,23 +880,8 @@ msgstr "Uyarılar:" msgid "Error:" msgstr "Hata:" -msgid "C++ Error" -msgstr "C++ Hatası" - -msgid "C++ Error:" -msgstr "C++ Hatası:" - -msgid "Source" -msgstr "Kaynak" - -msgid "C++ Source" -msgstr "C++ Kaynağı" - -msgid "Source:" -msgstr "Kaynak:" - -msgid "C++ Source:" -msgstr "C++ Kaynak:" +msgid "%s Error" +msgstr "%s Hatası" msgid "Stack Trace" msgstr "Bellek Dökümü" @@ -882,6 +892,9 @@ msgstr "Hatayı Kopyala" msgid "Open C++ Source on GitHub" msgstr "GitHub'da C++ Kaynağını Açın" +msgid "C++ Source" +msgstr "C++ Kaynağı" + msgid "Video RAM" msgstr "Görüntü BelleÄŸi" @@ -1847,12 +1860,12 @@ msgstr "Tüm Dilleri Göster" msgid "Show Selected Locales Only" msgstr "Sadece Seçili Dilleri Göster" +msgid "Edit Filters" +msgstr "Süzgeçleri Düzenle" + msgid "Language:" msgstr "Dil:" -msgid "Script" -msgstr "Betik" - msgid "Variant" msgstr "Varyant" @@ -2406,24 +2419,6 @@ msgid "Install from file" msgstr "Dosyadan Kur" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Bu, kaynak ÅŸablonunu \"res://android/build\" dizinine kurarak projenizi özel " -"Android derlemeleri için ayarlayacaktır.\n" -"Daha sonra dışa aktarırken deÄŸiÅŸiklikleri uygulayabilir ve kendi özel " -"APK'nızı oluÅŸturabilirsiniz (modül ekleme, AndroidManifest.xml dosyasını " -"deÄŸiÅŸtirme vb.).\n" -"Önceden oluÅŸturulmuÅŸ APK'ları kullanmak yerine özel derlemeler yapmak için " -"Android dışa aktarma ön ayarında \"Özel Derleme Kullan\" seçeneÄŸinin " -"etkinleÅŸtirilmesi gerektiÄŸini unutmayın." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2648,9 +2643,6 @@ msgstr "Kısayollar" msgid "Binding" msgstr "BaÄŸlayıcı" -msgid "%s Error" -msgstr "%s Hatası" - msgid "All Devices" msgstr "Tüm Aygıtlar" @@ -3565,6 +3557,9 @@ msgstr "Noktaları seç ve taşı. SaÄŸ fare düğmesi ile yeni noktalar oluÅŸtu msgid "Enable snap and show grid." msgstr "Yapıştırmayı etkinleÅŸtir ve ızgarayı göster." +msgid "Blend:" +msgstr "Karışma:" + msgid "Point" msgstr "Nokta" @@ -3607,15 +3602,9 @@ msgstr "Noktaları ve üçgenleri sil." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Otomatik üçgen harmanlayıcı oluÅŸtur (el ile)" -msgid "Blend:" -msgstr "Karışma:" - msgid "Parameter Changed:" msgstr "Parametre DeÄŸiÅŸtirildi:" -msgid "Edit Filters" -msgstr "Süzgeçleri Düzenle" - msgid "Output node can't be added to the blend tree." msgstr "Çıktı düğümü iÅŸleme aÄŸacına eklenemiyor." @@ -3735,9 +3724,6 @@ msgstr "Seçilen animasyonu geçerli konumdan geriye doÄŸru oynat. (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Seçilen animasyonu geriye doÄŸru oynat. (Shift + A)" -msgid "Stop animation playback. (S)" -msgstr "Animasyonu oynatmayı durdur. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Seçilen animasyonu baÅŸlangıç anından oynat. (ÃœstKrkt + D)" @@ -4942,12 +4928,6 @@ msgstr "Bildirici DeÄŸiÅŸtir AABB" msgid "Change Particles AABB" msgstr "Parçacık AABB DeÄŸiÅŸimi" -msgid "Change Box Shape Extents" -msgstr "Kübik Åžekli GeniÅŸlet" - -msgid "Change Probe Extents" -msgstr "DeÅŸme GeniÅŸlemesini DeÄŸiÅŸtir" - msgid "Change Capsule Shape Radius" msgstr "Kapsülün Çapını DeÄŸiÅŸtir" @@ -5755,6 +5735,9 @@ msgstr "Standart" msgid "Connections to method:" msgstr "Metotlara baÄŸlantılar:" +msgid "Source" +msgstr "Kaynak" + msgid "Target" msgstr "Hedef" @@ -5993,12 +5976,6 @@ msgstr "(boÅŸ)" msgid "Animations:" msgstr "Animasyonlar:" -msgid "Speed:" -msgstr "Hız:" - -msgid "Loop" -msgstr "Döngü" - msgid "Animation Frames:" msgstr "Animasyon Çerçeveleri:" @@ -7364,9 +7341,6 @@ msgstr "GiriÅŸ Eylemi Ekle" msgid "Change Action deadzone" msgstr "Eylem DeÄŸiÅŸtir ölübölgesi" -msgid "Add Input Action Event" -msgstr "GiriÅŸ Ä°ÅŸlem Olayı Ekle" - msgid "Erase Input Action" msgstr "Girdi Eylemini Sil" @@ -7394,9 +7368,6 @@ msgstr "Özellik Seç" msgid "Select Virtual Method" msgstr "Sanal Metot Seç" -msgid "Select Method" -msgstr "Metot Seç" - msgid "Batch Rename" msgstr "Tümden Yeniden Adlandır" @@ -8162,15 +8133,6 @@ msgstr "APK geniÅŸletmesi için geçersiz ortak anahtar." msgid "Invalid package name:" msgstr "Geçersiz paket ismi:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"Eklentileri kullanabilmek için \"Özel Derleme Kullan\" seçeneÄŸi aktif olmalı." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"AAB Dışa Aktar\" yalnızca \"Özel Yapı Kullan\" etkinleÅŸtirildiÄŸinde " -"geçerlidir." - msgid "Signing debug %s..." msgstr "%s hata ayıklaması imzalanıyor..." @@ -8208,13 +8170,6 @@ msgid "Unsupported export format!" msgstr "Desteklenmeyen dışa aktarım biçimi!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Özel olarak oluÅŸturulmuÅŸ bir ÅŸablondan oluÅŸturmaya çalışılıyor, ancak bunun " -"için sürüm bilgisi yok. Lütfen 'Proje' menüsünden yeniden yükleyin." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/uk.po b/editor/translations/editor/uk.po index 4722883f7a..9c1363c20f 100644 --- a/editor/translations/editor/uk.po +++ b/editor/translations/editor/uk.po @@ -608,6 +608,9 @@ msgstr "З Ñигналу:" msgid "Scene does not contain any script." msgstr "У Ñцені немає жодного Ñкрипту." +msgid "Select Method" +msgstr "Вибір методу" + msgid "Remove" msgstr "Вилучити" @@ -668,9 +671,6 @@ msgstr "Роз'єднати" msgid "Connect a Signal to a Method" msgstr "З'єднати Ñигнал із методом" -msgid "Edit Connection:" -msgstr "Редагувати з’єднаннÑ:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу «%s»?" @@ -815,23 +815,8 @@ msgstr "ПопередженнÑ:" msgid "Error:" msgstr "Помилка:" -msgid "C++ Error" -msgstr "Помилка C++" - -msgid "C++ Error:" -msgstr "Помилка C++:" - -msgid "Source" -msgstr "Джерело" - -msgid "C++ Source" -msgstr "Код C++" - -msgid "Source:" -msgstr "Код:" - -msgid "C++ Source:" -msgstr "Код C++:" +msgid "%s Error" +msgstr "Помилка %s" msgid "Stack Trace" msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека" @@ -842,6 +827,9 @@ msgstr "Помилка копіюваннÑ" msgid "Open C++ Source on GitHub" msgstr "Відкрити початковий код C++ на GitHub" +msgid "C++ Source" +msgstr "Код C++" + msgid "Video RAM" msgstr "Відеопам'ÑÑ‚ÑŒ" @@ -1814,12 +1802,12 @@ msgstr "Показати уÑÑ– локалізації" msgid "Show Selected Locales Only" msgstr "Показати лише позначені локалізації" +msgid "Edit Filters" +msgstr "Редагувати фільтри" + msgid "Language:" msgstr "Мова:" -msgid "Script" -msgstr "Скрипт" - msgid "Variant" msgstr "Варіант" @@ -2378,23 +2366,6 @@ msgid "Install from file" msgstr "Ð’Ñтановити з файла" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Це налаштує ваш проєкт на викориÑÑ‚Ð°Ð½Ð½Ñ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… збірок Android шлÑхом " -"вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° джерела до «res://android/build».\n" -"Далі, ви можете внеÑти зміни Ñ– зібрати влаÑний нетиповий APK при " -"екÑпортуванні (додаючи модулі, змінюючи AndroidManifest.xml тощо).\n" -"Зауважте, що з метою ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… збірок, заміÑÑ‚ÑŒ викориÑÑ‚Ð°Ð½Ð½Ñ " -"попередньо зібраних APK, Ñлід позначити пункт «СкориÑтатиÑÑ Ð½ÐµÑ‚Ð¸Ð¿Ð¾Ð²Ð¾ÑŽ " -"збіркою» у шаблоні екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2621,9 +2592,6 @@ msgstr "Клавіатурні ÑкороченнÑ" msgid "Binding" msgstr "Палітурка" -msgid "%s Error" -msgstr "Помилка %s" - msgid "All Devices" msgstr "УÑÑ– приÑтрої" @@ -3558,6 +3526,9 @@ msgstr "" msgid "Enable snap and show grid." msgstr "Увімкнути Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ñ– показати Ñітку." +msgid "Blend:" +msgstr "Змішувати:" + msgid "Point" msgstr "Точка" @@ -3600,15 +3571,9 @@ msgstr "Вилучити точки Ñ– трикутники." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Створити трикутники Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ (а не вручну)" -msgid "Blend:" -msgstr "Змішувати:" - msgid "Parameter Changed:" msgstr "Змінено параметр:" -msgid "Edit Filters" -msgstr "Редагувати фільтри" - msgid "Output node can't be added to the blend tree." msgstr "Вузол Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ можна додавати до дерева злиттÑ." @@ -3733,9 +3698,6 @@ msgstr "" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "Відтворити вибрану анімацію назад з кінцÑ. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Зупинити Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Відтворити вибрану анімацію від початку. (Shift+D)" @@ -4969,12 +4931,6 @@ msgstr "Змінити AABB ÑповіщеннÑ" msgid "Change Particles AABB" msgstr "Змінити AABB чаÑток" -msgid "Change Box Shape Extents" -msgstr "Змінити розміри кубічної форми" - -msgid "Change Probe Extents" -msgstr "Змінити розміри зонду" - msgid "Change Capsule Shape Radius" msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ð¸ капÑули" @@ -5794,6 +5750,9 @@ msgstr "Стандартний" msgid "Connections to method:" msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· методом:" +msgid "Source" +msgstr "Джерело" + msgid "Target" msgstr "ПризначеннÑ" @@ -6041,12 +6000,6 @@ msgstr "(порожньо)" msgid "Animations:" msgstr "Ðнімації:" -msgid "Speed:" -msgstr "ШвидкіÑÑ‚ÑŒ:" - -msgid "Loop" -msgstr "Зациклити" - msgid "Animation Frames:" msgstr "Кадри анімації:" @@ -7481,9 +7434,6 @@ msgstr "Додати дію" msgid "Change Action deadzone" msgstr "Змінити «мертву» зону дії" -msgid "Add Input Action Event" -msgstr "Додати подію за вхідною дією" - msgid "Erase Input Action" msgstr "Витерти Ð·Ð°Ð¿Ð¸Ñ Ð´Ñ–Ñ—" @@ -7511,9 +7461,6 @@ msgstr "Вибір влаÑтивоÑÑ‚Ñ–" msgid "Select Virtual Method" msgstr "Вибір віртуального методу" -msgid "Select Method" -msgstr "Вибір методу" - msgid "Batch Rename" msgstr "Пакетне перейменуваннÑ" @@ -8310,16 +8257,6 @@ msgstr "Ðекоректний відкритий ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚ msgid "Invalid package name:" msgstr "Ðекоректна назва пакунка:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "" -"Щоб можна було кориÑтуватиÑÑ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ°Ð¼Ð¸, Ñлід позначити пункт " -"«ВикориÑтовувати нетипову збірку»." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"Пункт «ЕкÑпортувати AAB» Ñ” чинним, лише Ñкщо увімкнено «ВикориÑтовувати " -"нетипове збираннÑ»." - msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." @@ -8364,14 +8301,6 @@ msgid "Unsupported export format!" msgstr "Ðепідтримуваний формат екÑпортуваннÑ!" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"ÐамагаємоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð½Ð° оÑнові нетипового шаблона збираннÑ, але не " -"виÑвлено даних щодо верÑÑ–Ñ—. Будь лаÑка, повторно вÑтановіть шаблон за " -"допомогою меню «Проєкт»." - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/editor/vi.po b/editor/translations/editor/vi.po index 491c82e76f..481d9bad69 100644 --- a/editor/translations/editor/vi.po +++ b/editor/translations/editor/vi.po @@ -528,6 +528,9 @@ msgstr "Từ tÃn hiệu:" msgid "Scene does not contain any script." msgstr "Cảnh không chứa táºp lệnh nà o cả." +msgid "Select Method" +msgstr "Chá»n PhÆ°Æ¡ng thức" + msgid "Remove" msgstr "Xóa" @@ -584,9 +587,6 @@ msgstr "Hủy kết nối" msgid "Connect a Signal to a Method" msgstr "Kết nối tÃn hiệu và o má»™t hà m" -msgid "Edit Connection:" -msgstr "Chỉnh sá»a kết nối:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Bạn muốn xoá tất cả kết nối từ tÃn hiệu \"%s\"?" @@ -701,18 +701,6 @@ msgstr "Cảnh báo:" msgid "Error:" msgstr "Lá»—i:" -msgid "C++ Error" -msgstr "Lá»—i C++" - -msgid "C++ Error:" -msgstr "Lá»—i C++:" - -msgid "Source" -msgstr "Nguồn" - -msgid "Source:" -msgstr "Nguồn:" - msgid "Copy Error" msgstr "Sao chép lá»—i" @@ -1534,12 +1522,12 @@ msgstr "Äã bá» ghim %s" msgid "Copy Property Path" msgstr "Sao chép Ä‘Æ°á»ng dẫn thuá»™c tÃnh" +msgid "Edit Filters" +msgstr "Chỉnh sá»a Lá»c" + msgid "Language:" msgstr "Ngôn ngữ:" -msgid "Script" -msgstr "Tệp lệnh" - msgid "Clear Output" msgstr "Xoá đầu ra" @@ -2041,23 +2029,6 @@ msgid "Install from file" msgstr "Cà i đặt từ tệp" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"Việc nà y sẽ thiết láºp dá»± án của bạn cho các bản dá»±ng Android tùy chỉnh bằng " -"cách cà i đặt bản mẫu nguồn và o \"res://android/build\".\n" -"Bạn có thể áp dụng các sá»a đổi và dá»±ng tệp APK tùy chỉnh khi xuất (thêm các " -"mô Ä‘un, thay đổi AndroidManifest.xml, v.v.).\n" -"LÆ°u ý rằng để tạo các bản dá»±ng tùy chỉnh thay cho tệp APK dá»±ng sẵn, tùy chá»n " -"\"Sá» dụng bản dá»±ng tùy chỉnh\" phải được báºt trong thiết láºp sẵn xuất sang " -"Android." - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2874,6 +2845,9 @@ msgstr "Chá»n và di chuyển các Ä‘iểm, chuá»™t phải để tạo Ä‘iểm. msgid "Enable snap and show grid." msgstr "Báºt DÃnh và hiện lÆ°á»›i." +msgid "Blend:" +msgstr "Trá»™n:" + msgid "Point" msgstr "Äiểm" @@ -2916,12 +2890,6 @@ msgstr "Xóa tam giác và các Ä‘iểm." msgid "Generate blend triangles automatically (instead of manually)" msgstr "Tá»± Ä‘á»™ng tạo tam giác trá»™n (thay vì phải vất vả thủ công)" -msgid "Blend:" -msgstr "Trá»™n:" - -msgid "Edit Filters" -msgstr "Chỉnh sá»a Lá»c" - msgid "Output node can't be added to the blend tree." msgstr "Nút đầu ra không thể thêm và o Cây Trá»™n." @@ -3031,9 +2999,6 @@ msgstr "Chạy hoạt ảnh đã chá»n ngược lại từ vị trà hiện tẠmsgid "Play selected animation backwards from end. (Shift+A)" msgstr "Chạy hoạt ảnh đã chá»n ngược lại từ cuối. (Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "Dừng chạy lại hoạt ảnh. (S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "Chạy hoạt ảnh đã chá»n từ đầu. (Shift+D)" @@ -3800,9 +3765,6 @@ msgstr "Thay đổi bán kÃnh ánh sáng" msgid "Change Sphere Shape Radius" msgstr "Thay Äổi Bán KÃnh Hình Cầu" -msgid "Change Box Shape Extents" -msgstr "Chỉnh chiá»u dà i hình há»™p" - msgid "Change Capsule Shape Radius" msgstr "Chỉnh bán kÃnh hình nhá»™ng" @@ -4281,6 +4243,9 @@ msgstr "Chuẩn" msgid "Connections to method:" msgstr "Kết nối đến phÆ°Æ¡ng thức:" +msgid "Source" +msgstr "Nguồn" + msgid "Target" msgstr "Mục tiêu" @@ -4484,12 +4449,6 @@ msgstr "(trống)" msgid "Animations:" msgstr "Các hoạt hình:" -msgid "Speed:" -msgstr "Tốc Ä‘á»™:" - -msgid "Loop" -msgstr "Lặp" - msgid "Animation Frames:" msgstr "Khung hình hoạt hình:" @@ -5143,9 +5102,6 @@ msgstr "Tiện Ãch" msgid "Select Property" msgstr "Chá»n Thuá»™c tÃnh" -msgid "Select Method" -msgstr "Chá»n PhÆ°Æ¡ng thức" - msgid "Prefix:" msgstr "Tiá»n tố:" @@ -5655,13 +5611,6 @@ msgstr "Khóa công khai của bá»™ APK mở rá»™ng không hợp lệ." msgid "Invalid package name:" msgstr "Tên gói không hợp lệ:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "\"Sá» dụng Bản dá»±ng tùy chỉnh\" phải được báºt để sá» dụng các tiện Ãch." - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "" -"\"Xuất AAB\" chỉ dùng được khi \"Sá» dụng Bản dá»±ng tùy chỉnh\" được báºt." - msgid "Exporting for Android" msgstr "Äang xuất sang Android" @@ -5671,13 +5620,6 @@ msgstr "Tên tệp không hợp lệ! Android App Bundle cần Ä‘uôi *.aab ở msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Tên tệp không hợp lệ! Android APK cần Ä‘uôi *.apk ở cuối." -msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"Cố gắng dá»±ng từ má»™t bản mẫu được dá»±ng tùy chỉnh, nhÆ°ng không có thông tin " -"phiên bản nà o tồn tại. Vui lòng cà i đặt lại từ bảng chá»n'Dá»± án'." - msgid "Building Android Project (gradle)" msgstr "Äang dá»±ng dá»± án Android (gradle)" diff --git a/editor/translations/editor/zh_CN.po b/editor/translations/editor/zh_CN.po index 4f6c2e4dc6..918935ec61 100644 --- a/editor/translations/editor/zh_CN.po +++ b/editor/translations/editor/zh_CN.po @@ -58,7 +58,7 @@ # idleman <1524328475@qq.com>, 2019. # king <wangding1992@126.com>, 2019. # silentbird <silentbird520@outlook.com>, 2019. -# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020, 2021, 2022. +# Haoyu Qiu <timothyqiu32@gmail.com>, 2019, 2020, 2021, 2022, 2023. # Revan Ji <jiruifancr@gmail.com>, 2020. # nieyuanhong <15625988003@163.com>, 2020. # binotaliu <binota@protonmail.ch>, 2020. @@ -76,7 +76,7 @@ # twoBornottwoB <305766341@qq.com>, 2021. # Magian <magian1127@gmail.com>, 2021. # Weiduo Xie <xwditfr@gmail.com>, 2021. -# suplife <2634557184@qq.com>, 2021, 2022. +# suplife <2634557184@qq.com>, 2021, 2022, 2023. # luoji <564144019@qq.com>, 2021. # zeng haochen <m18621006730@163.com>, 2021. # Sam Sun <oppositenormal@outlook.com>, 2021. @@ -84,16 +84,19 @@ # nitenook <admin@alterbaum.net>, 2021. # jker <cxgmfy@163.com>, 2021. # Ankar <1511276198@qq.com>, 2022. -# 风é’å±± <idleman@yeah.net>, 2022. +# 风é’å±± <idleman@yeah.net>, 2022, 2023. # 1104 EXSPIRAVIT_ <m18621006730@gmail.com>, 2022. # ChairC <974833488@qq.com>, 2022. +# èµµä¸ä¸€ <279631638@qq.com>, 2023. +# WangYi13 <wyi13@outlook.com>, 2023. +# matrixant <yuan545@hotmail.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-12-28 00:54+0000\n" -"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 06:54+0000\n" +"Last-Translator: 风é’å±± <idleman@yeah.net>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" "Language: zh_CN\n" @@ -101,34 +104,212 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "未设置" msgid "Physical" msgstr "物ç†" +msgid "Left Mouse Button" +msgstr "é¼ æ ‡å·¦é”®" + +msgid "Right Mouse Button" +msgstr "é¼ æ ‡å³é”®" + +msgid "Middle Mouse Button" +msgstr "é¼ æ ‡ä¸é”®" + +msgid "Mouse Wheel Up" +msgstr "é¼ æ ‡æ»šè½®å‘上" + +msgid "Mouse Wheel Down" +msgstr "é¼ æ ‡æ»šè½®å‘下" + +msgid "Mouse Wheel Left" +msgstr "é¼ æ ‡æ»šè½®å‘å·¦" + +msgid "Mouse Wheel Right" +msgstr "é¼ æ ‡æ»šè½®å‘å³" + +msgid "Mouse Thumb Button 1" +msgstr "é¼ æ ‡æ‹‡æŒ‡é”® 1" + +msgid "Mouse Thumb Button 2" +msgstr "é¼ æ ‡æ‹‡æŒ‡é”® 2" + msgid "Button" msgstr "按钮" +msgid "Double Click" +msgstr "åŒå‡»" + +msgid "Mouse motion at position (%s) with velocity (%s)" +msgstr "é¼ æ ‡ç§»åŠ¨è‡³ï¼ˆ%s)速度为(%s)" + +msgid "Left Stick X-Axis, Joystick 0 X-Axis" +msgstr "å·¦æ‘‡æ† X è½´ã€æŽ§åˆ¶æ† 0 X è½´" + +msgid "Left Stick Y-Axis, Joystick 0 Y-Axis" +msgstr "å·¦æ‘‡æ† Y è½´ã€æŽ§åˆ¶æ† 0 Y è½´" + +msgid "Right Stick X-Axis, Joystick 1 X-Axis" +msgstr "å³æ‘‡æ† X è½´ã€æŽ§åˆ¶æ† 1 X è½´" + +msgid "Right Stick Y-Axis, Joystick 1 Y-Axis" +msgstr "å³æ‘‡æ† Y è½´ã€æŽ§åˆ¶æ† 1 Y è½´" + +msgid "Joystick 2 X-Axis, Left Trigger, Sony L2, Xbox LT" +msgstr "æŽ§åˆ¶æ† 2 X è½´ã€å·¦æ‰³æœºã€ç´¢å°¼ L2ã€Xbox LT" + +msgid "Joystick 2 Y-Axis, Right Trigger, Sony R2, Xbox RT" +msgstr "æŽ§åˆ¶æ† 2 Y è½´ã€å³æ‰³æœºã€ç´¢å°¼ R2ã€Xbox RT" + +msgid "Joystick 3 X-Axis" +msgstr "æŽ§åˆ¶æ† 3 X è½´" + +msgid "Joystick 3 Y-Axis" +msgstr "æŽ§åˆ¶æ† 3 Y è½´" + +msgid "Joystick 4 X-Axis" +msgstr "æŽ§åˆ¶æ† 4 X è½´" + +msgid "Joystick 4 Y-Axis" +msgstr "æŽ§åˆ¶æ† 4 Y è½´" + +msgid "Unknown Joypad Axis" +msgstr "未知控制æ†è½´" + +msgid "Joypad Motion on Axis %d (%s) with Value %.2f" +msgstr "手柄 %d(%s)轴è¿åŠ¨ %.2f" + +msgid "Bottom Action, Sony Cross, Xbox A, Nintendo B" +msgstr "下侧动作ã€ç´¢å°¼å‰é”®ã€Xbox Aã€ä»»å¤©å ‚ B" + +msgid "Right Action, Sony Circle, Xbox B, Nintendo A" +msgstr "å³ä¾§åŠ¨ä½œã€ç´¢å°¼åœ†åœˆã€Xbox Bã€ä»»å¤©å ‚ A" + +msgid "Left Action, Sony Square, Xbox X, Nintendo Y" +msgstr "左侧动作ã€ç´¢å°¼æ–¹å—ã€Xbox Xã€ä»»å¤©å ‚ Y" + +msgid "Top Action, Sony Triangle, Xbox Y, Nintendo X" +msgstr "上侧动作ã€ç´¢å°¼ä¸‰è§’ã€Xbox Yã€ä»»å¤©å ‚ X" + +msgid "Back, Sony Select, Xbox Back, Nintendo -" +msgstr "返回ã€ç´¢å°¼ Selectã€Xbox Backã€ä»»å¤©å ‚ -" + +msgid "Guide, Sony PS, Xbox Home" +msgstr "指å—ã€ç´¢å°¼ PSã€Xbox Home" + +msgid "Start, Nintendo +" +msgstr "开始ã€ä»»å¤©å ‚ +" + +msgid "Left Stick, Sony L3, Xbox L/LS" +msgstr "左摇æ†ã€ç´¢å°¼ L3ã€Xbox L/LS" + +msgid "Right Stick, Sony R3, Xbox R/RS" +msgstr "å³æ‘‡æ†ã€ç´¢å°¼ R3ã€Xbox R/RS" + +msgid "Left Shoulder, Sony L1, Xbox LB" +msgstr "左肩键ã€ç´¢å°¼ L1ã€Xbox LB" + +msgid "Right Shoulder, Sony R1, Xbox RB" +msgstr "å³è‚©é”®ã€ç´¢å°¼ R1ã€Xbox RB" + +msgid "D-pad Up" +msgstr "æ–¹å‘键上" + +msgid "D-pad Down" +msgstr "æ–¹å‘键下" + +msgid "D-pad Left" +msgstr "æ–¹å‘键左" + +msgid "D-pad Right" +msgstr "æ–¹å‘é”®å³" + +msgid "Xbox Share, PS5 Microphone, Nintendo Capture" +msgstr "Xbox 分享ã€PS5 麦克风ã€ä»»å¤©å ‚截å±" + +msgid "Xbox Paddle 1" +msgstr "Xbox 拨片 1" + +msgid "Xbox Paddle 2" +msgstr "Xbox 拨片 2" + +msgid "Xbox Paddle 3" +msgstr "Xbox 拨片 3" + +msgid "Xbox Paddle 4" +msgstr "Xbox 拨片 4" + +msgid "PS4/5 Touchpad" +msgstr "PS4/5 触控æ¿" + +msgid "touched" +msgstr "按下" + +msgid "released" +msgstr "放开" + +msgid "Screen %s at (%s) with %s touch points" +msgstr "%s触控å±ï¼ˆ%s)触点数é‡ä¸º %s" + +msgid "" +"Screen dragged with %s touch points at position (%s) with velocity of (%s)" +msgstr "使用 %s 个触点在触控å±ä¸Šæ‹–动至(%s)速度为(%s)" + +msgid "Magnify Gesture at (%s) with factor %s" +msgstr "放大手势,ä½äºŽï¼ˆ%s),系数为 %s" + +msgid "Pan Gesture at (%s) with delta (%s)" +msgstr "平移手势,ä½äºŽï¼ˆ%s),增é‡ä¸ºï¼ˆ%s)" + +msgid "MIDI Input on Channel=%s Message=%s" +msgstr "MIDI 输入,通é“=%s,消æ¯=%s" + +msgid "Input Event with Shortcut=%s" +msgstr "输入事件,快æ·é”®=%s" + +msgid "Accept" +msgstr "接å—" + msgid "Select" msgstr "选择" msgid "Cancel" msgstr "å–消" +msgid "Focus Next" +msgstr "èšç„¦ä¸‹ä¸€ä¸ª" + +msgid "Focus Prev" +msgstr "èšç„¦ä¸Šä¸€ä¸ª" + msgid "Left" -msgstr "左侧" +msgstr "å·¦" msgid "Right" -msgstr "å³ä¾§" +msgstr "å³" msgid "Up" -msgstr "ä¸Šä¼ " +msgstr "上" msgid "Down" -msgstr "下载" +msgstr "下" + +msgid "Page Up" +msgstr "上一页" + +msgid "Page Down" +msgstr "下一页" + +msgid "Home" +msgstr "行首" msgid "End" -msgstr "结æŸ" +msgstr "行尾" msgid "Cut" msgstr "剪切" @@ -145,24 +326,126 @@ msgstr "撤销" msgid "Redo" msgstr "é‡åš" +msgid "Completion Query" +msgstr "补全请求" + +msgid "New Line" +msgstr "æ¢è¡Œ" + +msgid "New Blank Line" +msgstr "新建空行" + +msgid "New Line Above" +msgstr "æ¢è¡Œè‡³ä¸Šæ–¹" + msgid "Indent" msgstr "缩进" +msgid "Dedent" +msgstr "å–消缩进" + +msgid "Backspace" +msgstr "é€€æ ¼" + +msgid "Backspace Word" +msgstr "é€€æ ¼ä¸€ä¸ªå•è¯" + +msgid "Backspace all to Left" +msgstr "é€€æ ¼è‡³æœ€å·¦ä¾§" + msgid "Delete" msgstr "åˆ é™¤" +msgid "Delete Word" +msgstr "åˆ é™¤ä¸€ä¸ªå•è¯" + +msgid "Delete all to Right" +msgstr "åˆ é™¤è‡³æœ€å³ä¾§" + +msgid "Caret Left" +msgstr "å…‰æ ‡å·¦ç§»" + +msgid "Caret Word Left" +msgstr "å…‰æ ‡å·¦ç§»ä¸€ä¸ªå•è¯" + +msgid "Caret Right" +msgstr "å…‰æ ‡å³ç§»" + +msgid "Caret Word Right" +msgstr "å…‰æ ‡å³ç§»ä¸€ä¸ªå•è¯" + +msgid "Caret Up" +msgstr "å…‰æ ‡ä¸Šç§»" + +msgid "Caret Down" +msgstr "å…‰æ ‡ä¸‹ç§»" + +msgid "Caret Line Start" +msgstr "å…‰æ ‡è‡³è¡Œé¦–" + +msgid "Caret Line End" +msgstr "å…‰æ ‡è‡³è¡Œå°¾" + +msgid "Caret Page Up" +msgstr "å…‰æ ‡è‡³ä¸Šé¡µ" + +msgid "Caret Page Down" +msgstr "å…‰æ ‡è‡³ä¸‹é¡µ" + +msgid "Caret Document Start" +msgstr "å…‰æ ‡è‡³æ–‡æ¡£å¼€å¤´" + +msgid "Caret Document End" +msgstr "å…‰æ ‡è‡³æ–‡æ¡£æœ«å°¾" + +msgid "Caret Add Below" +msgstr "å‘ä¸‹æ·»åŠ å…‰æ ‡" + +msgid "Caret Add Above" +msgstr "å‘ä¸Šæ·»åŠ å…‰æ ‡" + +msgid "Scroll Up" +msgstr "å‘上滚动" + +msgid "Scroll Down" +msgstr "å‘下滚动" + msgid "Select All" msgstr "全选" +msgid "Select Word Under Caret" +msgstr "é€‰æ‹©å…‰æ ‡ä¸‹çš„å•è¯" + +msgid "Add Selection for Next Occurrence" +msgstr "将下个匹é…é¡¹æ·»åŠ åˆ°é€‰åŒº" + +msgid "Clear Carets and Selection" +msgstr "æ¸…é™¤å…‰æ ‡å’Œé€‰åŒº" + +msgid "Toggle Insert Mode" +msgstr "开关æ’入模å¼" + +msgid "Text Submitted" +msgstr "æ交文本" + msgid "Duplicate Nodes" msgstr "å¤åˆ¶èŠ‚点" msgid "Delete Nodes" msgstr "åˆ é™¤èŠ‚ç‚¹" +msgid "Go Up One Level" +msgstr "å‘上一级" + msgid "Refresh" msgstr "刷新" +msgid "Show Hidden" +msgstr "显示éšè—文件" + +msgid "Swap Input Direction" +msgstr "交æ¢è¾“入方å‘" + msgid "Invalid input %d (not passed) in expression" msgstr "表达å¼çš„输入 %d æ— æ•ˆï¼ˆæœªä¼ é€’ï¼‰" @@ -184,6 +467,12 @@ msgstr "æž„é€ '%s' çš„å‚æ•°æ— æ•ˆ" msgid "On call to '%s':" msgstr "在调用 '%s' 时:" +msgid "Built-in script" +msgstr "内置脚本" + +msgid "Built-in" +msgstr "内置" + msgid "B" msgstr "B" @@ -205,6 +494,13 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" +msgid "Example: %s" +msgstr "示例:%s" + +msgid "%d item" +msgid_plural "%d items" +msgstr[0] "%d 个项目" + msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" @@ -216,9 +512,33 @@ msgstr "å为“%sâ€çš„动作已å˜åœ¨ã€‚" msgid "Add Event" msgstr "æ·»åŠ äº‹ä»¶" +msgid "Remove Action" +msgstr "移除动作" + +msgid "Cannot Remove Action" +msgstr "æ— æ³•ç§»é™¤åŠ¨ä½œ" + +msgid "Edit Event" +msgstr "编辑事件" + +msgid "Remove Event" +msgstr "移除事件" + +msgid "Filter by name..." +msgstr "按å称ç›é€‰..." + +msgid "Clear All" +msgstr "全部清除" + +msgid "Add New Action" +msgstr "æ·»åŠ æ–°åŠ¨ä½œ" + msgid "Add" msgstr "æ·»åŠ " +msgid "Show Built-in Actions" +msgstr "显示内置动作" + msgid "Action" msgstr "动作" @@ -231,6 +551,9 @@ msgstr "时间:" msgid "Value:" msgstr "值:" +msgid "Update Selected Key Handles" +msgstr "更新所选键控制点" + msgid "Insert Key Here" msgstr "æ¤å¤„æ’入关键帧" @@ -240,24 +563,96 @@ msgstr "å¤åˆ¶æ‰€é€‰å…³é”®å¸§" msgid "Delete Selected Key(s)" msgstr "åˆ é™¤æ‰€é€‰å…³é”®å¸§" +msgid "Make Handles Free" +msgstr "改为自由控制柄" + +msgid "Make Handles Linear" +msgstr "改为线性控制柄" + +msgid "Make Handles Balanced" +msgstr "改为平衡控制柄" + +msgid "Make Handles Mirrored" +msgstr "改为镜åƒæŽ§åˆ¶æŸ„" + +msgid "Make Handles Balanced (Auto Tangent)" +msgstr "改为平衡控制柄(自动切线)" + +msgid "Make Handles Mirrored (Auto Tangent)" +msgstr "改为镜åƒæŽ§åˆ¶æŸ„(自动切线)" + msgid "Add Bezier Point" msgstr "æ·»åŠ è´å¡žå°”顶点" msgid "Move Bezier Points" msgstr "移动è´å¡žå°”顶点" +msgid "Animation Duplicate Keys" +msgstr "å¤åˆ¶åŠ¨ç”»å…³é”®å¸§" + +msgid "Animation Delete Keys" +msgstr "åˆ é™¤åŠ¨ç”»å…³é”®å¸§" + msgid "Focus" msgstr "èšç„¦" +msgid "Select All Keys" +msgstr "全选关键帧" + +msgid "Deselect All Keys" +msgstr "å–消选择关键帧" + +msgid "Animation Change Transition" +msgstr "修改动画过渡" + +msgid "Animation Change %s" +msgstr "修改动画 %s" + +msgid "Animation Change Keyframe Value" +msgstr "修改动画关键帧的值" + +msgid "Animation Change Call" +msgstr "修改动画调用" + +msgid "Animation Multi Change Transition" +msgstr "批é‡ä¿®æ”¹åŠ¨ç”»è¿‡æ¸¡" + +msgid "Animation Multi Change %s" +msgstr "批é‡ä¿®æ”¹åŠ¨ç”» %s" + +msgid "Animation Multi Change Keyframe Value" +msgstr "批é‡ä¿®æ”¹åŠ¨ç”»å…³é”®å¸§çš„值" + +msgid "Animation Multi Change Call" +msgstr "批é‡ä¿®æ”¹åŠ¨ç”»è°ƒç”¨" + msgid "Change Animation Length" msgstr "修改动画长度" msgid "Change Animation Loop" msgstr "修改动画循环" +msgid "Can't change loop mode on animation instanced from imported scene." +msgstr "æ— æ³•ä¿®æ”¹ä»Žå¯¼å…¥åœºæ™¯ä¸å®žä¾‹åŒ–的动画的循环模å¼ã€‚" + +msgid "Can't change loop mode on animation embedded in another scene." +msgstr "æ— æ³•ä¿®æ”¹åµŒå…¥å¦ä¸€åœºæ™¯çš„动画的循环模å¼ã€‚" + msgid "Property Track" msgstr "属性轨é“" +msgid "3D Position Track" +msgstr "3D ä½ç½®è½¨é“" + +msgid "3D Rotation Track" +msgstr "3D 旋转轨é“" + +msgid "3D Scale Track" +msgstr "3D 缩放轨é“" + +msgid "Blend Shape Track" +msgstr "æ··åˆå½¢çŠ¶è½¨é“" + msgid "Call Method Track" msgstr "方法调用轨é“" @@ -288,6 +683,9 @@ msgstr "函数:" msgid "Audio Clips:" msgstr "音频剪辑:" +msgid "Animation Clips:" +msgstr "动画剪辑:" + msgid "Change Track Path" msgstr "修改轨é“路径" @@ -295,13 +693,13 @@ msgid "Toggle this track on/off." msgstr "切æ¢è¯¥è½¨é“的开关。" msgid "Update Mode (How this property is set)" -msgstr "更新模å¼ï¼ˆè®¾ç½®å±žæ€§çš„æ–¹å¼ï¼‰" +msgstr "更新模å¼ï¼ˆè®¾ç½®è¯¥å±žæ€§çš„æ–¹å¼ï¼‰" msgid "Interpolation Mode" msgstr "æ’值模å¼" msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "æ— ç¼å¾ªçŽ¯æ¨¡å¼ï¼ˆä½¿ç”¨å¾ªçŽ¯å¼€å§‹æ’值循环结æŸï¼‰" +msgstr "æ— ç¼å¾ªçŽ¯æ¨¡å¼ï¼ˆå¾ªçŽ¯æ’值尾首)" msgid "Remove this track." msgstr "移除该轨é“。" @@ -318,6 +716,9 @@ msgstr "旋转:" msgid "Scale:" msgstr "缩放:" +msgid "Blend Shape:" +msgstr "æ··åˆå½¢çŠ¶ï¼š" + msgid "Type:" msgstr "类型:" @@ -333,6 +734,18 @@ msgstr "入点手柄:" msgid "Out-Handle:" msgstr "出点手柄:" +msgid "Handle mode: Free\n" +msgstr "控柄模å¼ï¼šè‡ªç”±\n" + +msgid "Handle mode: Linear\n" +msgstr "控柄模å¼ï¼šçº¿æ€§\n" + +msgid "Handle mode: Balanced\n" +msgstr "控柄模å¼ï¼šå¹³è¡¡\n" + +msgid "Handle mode: Mirrored\n" +msgstr "控柄模å¼ï¼šé•œåƒ\n" + msgid "Stream:" msgstr "æµï¼š" @@ -346,7 +759,7 @@ msgid "Animation Clip:" msgstr "动画剪辑:" msgid "Toggle Track Enabled" -msgstr "å¯ç”¨ï¼ç¦ç”¨è½¨é“" +msgstr "å¯ç”¨/ç¦ç”¨è½¨é“" msgid "Continuous" msgstr "è¿žç»" @@ -366,8 +779,14 @@ msgstr "线性" msgid "Cubic" msgstr "三次方" +msgid "Linear Angle" +msgstr "线性角" + +msgid "Cubic Angle" +msgstr "三次角" + msgid "Clamp Loop Interp" -msgstr "切æ–循环æ’值" +msgstr "钳制循环æ’值" msgid "Wrap Loop Interp" msgstr "环绕循环æ’值" @@ -393,12 +812,26 @@ msgstr "修改动画æ’值模å¼" msgid "Change Animation Loop Mode" msgstr "修改动画循环模å¼" +msgid "" +"Compressed tracks can't be edited or removed. Re-import the animation with " +"compression disabled in order to edit." +msgstr "ä¸èƒ½ç¼–辑或移除压缩的轨é“。è¦è¿›è¡Œç¼–辑,请ç¦ç”¨åŽ‹ç¼©åŽé‡æ–°å¯¼å…¥åŠ¨ç”»ã€‚" + msgid "Remove Anim Track" msgstr "移除动画轨é“" +msgid "Create new track for %s and insert key?" +msgstr "是å¦ä¸º %s 新建轨é“并æ’入关键帧?" + +msgid "Create %d new tracks and insert keys?" +msgstr "是å¦æ–°å»º %d 个轨é“并æ’入关键帧?" + msgid "Create" msgstr "创建" +msgid "Animation Insert Key" +msgstr "æ’入动画关键帧" + msgid "node '%s'" msgstr "节点“%sâ€" @@ -417,6 +850,12 @@ msgstr "修改动画æ¥é•¿" msgid "Rearrange Tracks" msgstr "é‡æ–°æŽ’列轨é“" +msgid "Blend Shape tracks only apply to MeshInstance3D nodes." +msgstr "æ··åˆå½¢çŠ¶è½¨é“仅应用于 MeshInstance3D 节点。" + +msgid "Position/Rotation/Scale 3D tracks only apply to 3D-based nodes." +msgstr "3D ä½ç½®/旋转/缩放轨é“仅适用于 3D 节点。" + msgid "" "Audio tracks can only point to nodes of type:\n" "-AudioStreamPlayer\n" @@ -443,8 +882,20 @@ msgstr "æ·»åŠ è´å¡žå°”轨é“" msgid "Track path is invalid, so can't add a key." msgstr "轨é“è·¯å¾„æ— æ•ˆï¼Œå› æ¤æ— æ³•æ·»åŠ å…³é”®å¸§ã€‚" +msgid "Track is not of type Node3D, can't insert key" +msgstr "轨é“ä¸æ˜¯ Node3D ç±»åž‹ï¼Œæ— æ³•æ’入关键帧" + +msgid "Add Position Key" +msgstr "æ·»åŠ ä½ç½®å…³é”®å¸§" + +msgid "Add Rotation Key" +msgstr "æ·»åŠ æ—‹è½¬å…³é”®å¸§" + +msgid "Add Scale Key" +msgstr "æ·»åŠ ç¼©æ”¾å…³é”®å¸§" + msgid "Add Track Key" -msgstr "æ·»åŠ è½¨é“帧" +msgstr "æ·»åŠ è½¨é“关键帧" msgid "Track path is invalid, so can't add a method key." msgstr "轨é“è·¯å¾„æ— æ•ˆï¼Œæ‰€ä»¥æ— æ³•æ·»åŠ æ–¹æ³•å¸§ã€‚" @@ -455,6 +906,9 @@ msgstr "æ·»åŠ æ–¹æ³•è½¨é“帧" msgid "Method not found in object:" msgstr "对象方法未找到:" +msgid "Animation Move Keys" +msgstr "移动动画关键帧" + msgid "Position" msgstr "ä½ç½®" @@ -464,6 +918,9 @@ msgstr "旋转" msgid "Scale" msgstr "缩放" +msgid "BlendShape" +msgstr "æ··åˆå½¢çŠ¶" + msgid "Methods" msgstr "方法" @@ -479,16 +936,50 @@ msgstr "剪贴æ¿æ˜¯ç©ºçš„ï¼" msgid "Paste Tracks" msgstr "粘贴轨é“" +msgid "Animation Scale Keys" +msgstr "缩放动画关键帧" + +msgid "Make Easing Keys" +msgstr "改为缓动关键帧" + msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "由于åªæœ‰å•ä¸€è½¨é“ï¼Œå› æ¤è¯¥é€‰é¡¹ä¸é€‚用于è´å¡žå°”编辑。" +msgid "Animation Add RESET Keys" +msgstr "æ·»åŠ åŠ¨ç”» RESET 关键帧" + +msgid "Bake Animation as Linear keys." +msgstr "将动画烘焙为线性关键帧。" + +msgid "" +"This animation belongs to an imported scene, so changes to imported tracks " +"will not be saved.\n" +"\n" +"To modify this animation, navigate to the scene's Advanced Import settings " +"and select the animation.\n" +"Some options, including looping, are available here. To add custom tracks, " +"enable \"Save To File\" and\n" +"\"Keep Custom Tracks\"." +msgstr "" +"æ¤åŠ¨ç”»å±žäºŽå¯¼å…¥çš„åœºæ™¯ï¼Œå› æ¤ä¸ä¼šä¿å˜å¯¹å¯¼å…¥è½¨é“的更改。\n" +"\n" +"如果è¦ç¼–辑这个动画,请å‰å¾€è¯¥åœºæ™¯çš„“高级导入设置â€å¹¶é€‰æ‹©è¯¥åŠ¨ç”»ã€‚\n" +"有包å«å¾ªçŽ¯åœ¨å†…çš„å„ç§é€‰é¡¹ã€‚æ·»åŠ è‡ªå®šä¹‰è½¨é“请å¯ç”¨â€œä¿å˜ä¸ºæ–‡ä»¶â€\n" +"并“ä¿ç•™è‡ªå®šä¹‰è½¨é“â€ã€‚" + msgid "Warning: Editing imported animation" msgstr "è¦å‘Šï¼šæ£åœ¨ç¼–辑导入的动画" msgid "Select an AnimationPlayer node to create and edit animations." msgstr "选择一个 AnimationPlayer 节点以创建和编辑动画。" +msgid "Imported Scene" +msgstr "导入的场景" + +msgid "Toggle between the bezier curve editor and track editor." +msgstr "在è´å¡žå°”曲线编辑器和轨é“编辑器之间进行切æ¢ã€‚" + msgid "Only show tracks from nodes selected in tree." msgstr "ä»…æ˜¾ç¤ºåœ¨æ ‘ä¸é€‰ä¸èŠ‚点的轨é“。" @@ -522,6 +1013,9 @@ msgstr "缩放选ä¸é¡¹" msgid "Scale From Cursor" msgstr "é€šè¿‡å…‰æ ‡ç¼©æ”¾" +msgid "Make Easing Selection" +msgstr "缓动选ä¸é¡¹" + msgid "Duplicate Selection" msgstr "å¤åˆ¶é€‰ä¸é¡¹" @@ -540,6 +1034,18 @@ msgstr "跳到上一æ¥" msgid "Apply Reset" msgstr "应用é‡ç½®" +msgid "Bake Animation" +msgstr "烘焙动画" + +msgid "Optimize Animation (no undo)" +msgstr "ä¼˜åŒ–åŠ¨ç”»ï¼ˆæ— æ³•æ’¤é”€ï¼‰" + +msgid "Clean-Up Animation (no undo)" +msgstr "清ç†åŠ¨ç”»ï¼ˆæ— 法撤销)" + +msgid "Pick a node to animate:" +msgstr "选择è¦è®¾ç½®åŠ¨ç”»çš„节点:" + msgid "Use Bezier Curves" msgstr "使用è´å¡žå°”曲线" @@ -549,9 +1055,15 @@ msgstr "创建 RESET 轨é“" msgid "Anim. Optimizer" msgstr "动画优化器" +msgid "Max. Velocity Error:" +msgstr "最大速度误差:" + msgid "Max. Angular Error:" msgstr "最大角度误差:" +msgid "Max. Precision Error:" +msgstr "最大精度误差:" + msgid "Optimize" msgstr "优化" @@ -573,11 +1085,20 @@ msgstr "清ç†" msgid "Scale Ratio:" msgstr "缩放比率:" +msgid "Select Transition and Easing" +msgstr "选择过渡和缓动" + +msgid "Anim. Baker" +msgstr "动画烘焙器" + msgid "Select Tracks to Copy" msgstr "选择è¦å¤åˆ¶çš„轨é“" msgid "Select All/None" -msgstr "全选ï¼å–消" +msgstr "全选/å–消" + +msgid "Animation Change Keyframe Time" +msgstr "修改动画关键帧的时间" msgid "Add Audio Track Clip" msgstr "æ·»åŠ éŸ³é¢‘è½¨é“剪辑" @@ -597,6 +1118,14 @@ msgstr "è¡Œå·ï¼š" msgid "%d replaced." msgstr "å·²æ›¿æ¢ %d 处。" +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d 个匹é…" + +msgid "%d of %d match" +msgid_plural "%d of %d matches" +msgstr[0] "第 %d 个匹é…,共 %d 个" + msgid "Match Case" msgstr "区分大å°å†™" @@ -613,7 +1142,7 @@ msgid "Selection Only" msgstr "仅选ä¸" msgid "Toggle Scripts Panel" -msgstr "切æ¢è„šæœ¬é¢æ¿" +msgstr "开关脚本é¢æ¿" msgid "Zoom In" msgstr "放大" @@ -653,9 +1182,18 @@ msgstr "连接到脚本:" msgid "From Signal:" msgstr "æ¥è‡ªä¿¡å·ï¼š" +msgid "Filter Nodes" +msgstr "ç›é€‰èŠ‚点" + msgid "Scene does not contain any script." msgstr "场景ä¸åŒ…å«è„šæœ¬ã€‚" +msgid "Select Method" +msgstr "选择方法" + +msgid "Filter Methods" +msgstr "ç›é€‰æ–¹æ³•" + msgid "Remove" msgstr "移除" @@ -665,6 +1203,12 @@ msgstr "æ·»åŠ é¢å¤–调用å‚数:" msgid "Extra Call Arguments:" msgstr "é¢å¤–调用å‚数:" +msgid "Allows to drop arguments sent by signal emitter." +msgstr "å…许丢弃由信å·å‘é€è€…å‘é€çš„å‚数。" + +msgid "Unbind Signal Arguments:" +msgstr "解绑信å·å‚数:" + msgid "Receiver Method:" msgstr "接收方法:" @@ -696,6 +1240,9 @@ msgstr "连接" msgid "Signal:" msgstr "ä¿¡å·ï¼š" +msgid "No description." +msgstr "æ— æ述。" + msgid "Connect '%s' to '%s'" msgstr "å°† “%s†连接到 “%sâ€" @@ -714,27 +1261,33 @@ msgstr "æ–开连接" msgid "Connect a Signal to a Method" msgstr "连接信å·åˆ°æ–¹æ³•" -msgid "Edit Connection:" -msgstr "编辑连接:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "确定è¦ä»Žä¿¡å· “%s†ä¸ç§»é™¤æ‰€æœ‰è¿žæŽ¥å—?" msgid "Signals" msgstr "ä¿¡å·" +msgid "Filter Signals" +msgstr "ç›é€‰ä¿¡å·" + msgid "Are you sure you want to remove all connections from this signal?" msgstr "确定è¦ä»Žè¯¥ä¿¡å·ä¸ç§»é™¤æ‰€æœ‰è¿žæŽ¥å—?" msgid "Disconnect All" msgstr "æ–开全部" +msgid "Copy Name" +msgstr "å¤åˆ¶å称" + msgid "Edit..." msgstr "编辑..." msgid "Go to Method" msgstr "跳转到方法" +msgid "Change Type of \"%s\"" +msgstr "修改“%sâ€çš„类型" + msgid "Change" msgstr "更改" @@ -744,6 +1297,12 @@ msgstr "创建 %s" msgid "No results for \"%s\"." msgstr "未找到 “%sâ€ã€‚" +msgid "This class is marked as deprecated." +msgstr "è¿™ä¸ªç±»è¢«æ ‡è®°ä¸ºå·²åºŸå¼ƒã€‚" + +msgid "This class is marked as experimental." +msgstr "è¿™ä¸ªç±»è¢«æ ‡è®°ä¸ºå®žéªŒæ€§ã€‚" + msgid "No description available for %s." msgstr "没有针对 %s çš„æ述。" @@ -753,6 +1312,9 @@ msgstr "收è—:" msgid "Recent:" msgstr "最近使用:" +msgid "(Un)favorite selected item." +msgstr "收è—/å–消收è—选ä¸é¡¹ã€‚" + msgid "Search:" msgstr "æœç´¢ï¼š" @@ -780,8 +1342,20 @@ msgstr "å¤åˆ¶èŠ‚点路径" msgid "Instance:" msgstr "实例:" +msgid "" +"This node has been instantiated from a PackedScene file:\n" +"%s\n" +"Click to open the original file in the Editor." +msgstr "" +"这个节点是从 PackedScene 文件ä¸å®žä¾‹åŒ–的:\n" +"%s\n" +"点击在编辑器ä¸æ‰“开原始文件。" + msgid "Toggle Visibility" -msgstr "åˆ‡æ¢ éšè—/å¯è§" +msgstr "切æ¢å¯è§æ€§" + +msgid "ms" +msgstr "ms" msgid "Monitors" msgstr "监视" @@ -851,6 +1425,21 @@ msgstr "时间" msgid "Calls" msgstr "调用" +msgid "Fit to Frame" +msgstr "é™åˆ¶åˆ°å•å¸§" + +msgid "Linked" +msgstr "è”åˆ" + +msgid "CPU" +msgstr "CPU" + +msgid "GPU" +msgstr "GPU" + +msgid "Execution resumed." +msgstr "å·²æ¢å¤æ‰§è¡Œã€‚" + msgid "Bytes:" msgstr "å—节:" @@ -860,26 +1449,32 @@ msgstr "è¦å‘Šï¼š" msgid "Error:" msgstr "错误:" -msgid "C++ Error" -msgstr "C++ 错误" +msgid "%s Error" +msgstr "%s 错误" -msgid "C++ Error:" -msgstr "C++ 错误:" +msgid "Stack Trace" +msgstr "æ ˆè¿½è¸ª" -msgid "Source" -msgstr "æ¥æº" +msgid "Stack Trace:" +msgstr "æ ˆè¿½è¸ªï¼š" -msgid "C++ Source" -msgstr "C++ æºæ–‡ä»¶" +msgid "Debug session started." +msgstr "调试会è¯å¼€å§‹ã€‚" -msgid "Source:" -msgstr "æºæ–‡ä»¶ï¼š" +msgid "Debug session closed." +msgstr "调试会è¯ç»“æŸã€‚" -msgid "C++ Source:" -msgstr "C++ æºæ–‡ä»¶ï¼š" +msgid "Line %d" +msgstr "è¡Œ %d" -msgid "Stack Trace" -msgstr "æ ˆè¿½è¸ª" +msgid "Delete Breakpoint" +msgstr "移除æ–点" + +msgid "Delete All Breakpoints in:" +msgstr "移除所有æ–点:" + +msgid "Delete All Breakpoints" +msgstr "移除所有æ–点" msgid "Copy Error" msgstr "å¤åˆ¶é”™è¯¯ä¿¡æ¯" @@ -887,6 +1482,9 @@ msgstr "å¤åˆ¶é”™è¯¯ä¿¡æ¯" msgid "Open C++ Source on GitHub" msgstr "在 GitHub 打开 C++ æºç " +msgid "C++ Source" +msgstr "C++ æºæ–‡ä»¶" + msgid "Video RAM" msgstr "显å˜" @@ -908,6 +1506,9 @@ msgstr "继ç»" msgid "Stack Frames" msgstr "æ ˆå¸§" +msgid "Filter Stack Variables" +msgstr "ç›é€‰æ ˆå˜é‡" + msgid "Breakpoints" msgstr "æ–点" @@ -920,8 +1521,11 @@ msgstr "全部折å " msgid "Profiler" msgstr "性能分æžå™¨" +msgid "Visual Profiler" +msgstr "å¯è§†åˆ†æžå™¨" + msgid "List of Video Memory Usage by Resource:" -msgstr "å 用显å˜çš„资æºåˆ—表:" +msgstr "显å˜èµ„æºå 用列表:" msgid "Total:" msgstr "åˆè®¡ï¼š" @@ -1009,13 +1613,19 @@ msgstr "打开场景" msgid "Owners of: %s (Total: %d)" msgstr "%s 的所有者(总计:%d)" +msgid "Localization remap" +msgstr "本地化é‡æ˜ å°„" + +msgid "Localization remap for path '%s' and locale '%s'." +msgstr "对路径“%sâ€å’ŒåŒºåŸŸè®¾ç½®â€œ%sâ€çš„本地化é‡æ˜ 射。" + msgid "" "Remove the selected files from the project? (Cannot be undone.)\n" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"是å¦ä»Žé¡¹ç›®ä¸åˆ é™¤æ‰€é€‰æ–‡ä»¶ï¼Ÿï¼ˆæ— æ³•æ’¤é”€ã€‚ï¼‰\n" -"æ ¹æ®ä½ çš„æ–‡ä»¶ç³»ç»Ÿè®¾ç½®ï¼Œæ–‡ä»¶ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™æˆ–æ°¸ä¹…åˆ é™¤ã€‚" +"是å¦ä»Žé¡¹ç›®ä¸ç§»é™¤æ‰€é€‰æ–‡ä»¶ï¼Ÿï¼ˆæ— 法撤销。)\n" +"æ ¹æ®ä½ 的文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…åˆ é™¤ã€‚" msgid "" "The files being removed are required by other resources in order for them to " @@ -1024,9 +1634,9 @@ msgid "" "Depending on your filesystem configuration, the files will either be moved " "to the system trash or deleted permanently." msgstr "" -"其他资æºéœ€è¦è¿™äº›å³å°†è¢«åˆ 除的文件æ‰èƒ½æ£å¸¸å·¥ä½œã€‚\n" -"ä»ç„¶è¦åˆ 除å—ï¼Ÿï¼ˆæ— æ³•æ’¤é”€ã€‚ï¼‰\n" -"æ ¹æ®ä½ çš„æ–‡ä»¶ç³»ç»Ÿè®¾ç½®ï¼Œæ–‡ä»¶ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™æˆ–æ°¸ä¹…åˆ é™¤ã€‚" +"其他资æºéœ€è¦è¿™äº›å³å°†è¢«ç§»é™¤çš„文件æ‰èƒ½æ£å¸¸å·¥ä½œã€‚\n" +"ä»ç„¶è¦ç§»é™¤å—ï¼Ÿï¼ˆæ— æ³•æ’¤é”€ã€‚ï¼‰\n" +"æ ¹æ®ä½ 的文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…åˆ é™¤ã€‚" msgid "Cannot remove:" msgstr "æ— æ³•ç§»é™¤ï¼š" @@ -1141,28 +1751,28 @@ msgid "Licenses" msgstr "许å¯è¯" msgid "Error opening asset file for \"%s\" (not in ZIP format)." -msgstr "打开“%sâ€çš„ç´ ææ–‡ä»¶æ—¶å‡ºé”™ï¼ˆéž ZIP æ ¼å¼ï¼‰ã€‚" +msgstr "打开“%sâ€çš„èµ„äº§æ–‡ä»¶æ—¶å‡ºé”™ï¼ˆéž ZIP æ ¼å¼ï¼‰ã€‚" msgid "%s (already exists)" msgstr "%s(已å˜åœ¨ï¼‰" msgid "Contents of asset \"%s\" - %d file(s) conflict with your project:" -msgstr "ç´ æ“%sâ€çš„内容 - %d ä¸ªæ–‡ä»¶ä¸Žä½ çš„é¡¹ç›®å†²çªï¼š" +msgstr "资产“%sâ€çš„内容 - %d ä¸ªæ–‡ä»¶ä¸Žä½ çš„é¡¹ç›®å†²çªï¼š" msgid "Contents of asset \"%s\" - No files conflict with your project:" -msgstr "ç´ æ“%sâ€çš„内容 - æ²¡æœ‰æ–‡ä»¶ä¸Žä½ çš„é¡¹ç›®å†²çªï¼š" +msgstr "资产“%sâ€çš„内容 - æ²¡æœ‰æ–‡ä»¶ä¸Žä½ çš„é¡¹ç›®å†²çªï¼š" msgid "Uncompressing Assets" -msgstr "æ£åœ¨è§£åŽ‹ç´ æ" +msgstr "æ£åœ¨è§£åŽ‹èµ„产" msgid "The following files failed extraction from asset \"%s\":" -msgstr "ä»¥ä¸‹æ–‡ä»¶æ— æ³•ä»Žç´ æ“%sâ€ä¸æå–:" +msgstr "ä»¥ä¸‹æ–‡ä»¶æ— æ³•ä»Žèµ„äº§â€œ%sâ€ä¸æå–:" msgid "(and %s more files)" msgstr "(以åŠå…¶ä»– %s 个文件)" msgid "Asset \"%s\" installed successfully!" -msgstr "ç´ æ“%sâ€å®‰è£…æˆåŠŸï¼" +msgstr "资产“%sâ€å®‰è£…æˆåŠŸï¼" msgid "Success!" msgstr "æˆåŠŸï¼" @@ -1171,7 +1781,7 @@ msgid "Install" msgstr "安装" msgid "Asset Installer" -msgstr "ç´ æ安装器" +msgstr "资产安装器" msgid "Speakers" msgstr "扬声器" @@ -1221,6 +1831,12 @@ msgstr "æ—通" msgid "Bus Options" msgstr "总线选项" +msgid "Duplicate Bus" +msgstr "创建总线副本" + +msgid "Delete Bus" +msgstr "åˆ é™¤æ€»çº¿" + msgid "Reset Volume" msgstr "é‡ç½®éŸ³é‡" @@ -1308,29 +1924,41 @@ msgstr "有效å—符:" msgid "Must not collide with an existing engine class name." msgstr "与引擎内置类å称冲çªã€‚" +msgid "Must not collide with an existing global script class name." +msgstr "与已å˜åœ¨çš„全局脚本类å冲çªã€‚" + msgid "Must not collide with an existing built-in type name." msgstr "与引擎内置类型å称冲çªã€‚" msgid "Must not collide with an existing global constant name." msgstr "与已å˜åœ¨çš„全局常é‡å称冲çªã€‚" +msgid "Keyword cannot be used as an Autoload name." +msgstr "关键å—ä¸å¯ç”¨ä½œè‡ªåŠ¨åŠ è½½å称。" + msgid "Autoload '%s' already exists!" -msgstr "Autoload“%sâ€å·²å˜åœ¨ï¼" +msgstr "è‡ªåŠ¨åŠ è½½â€œ%sâ€å·²å˜åœ¨ï¼" msgid "Rename Autoload" -msgstr "é‡å‘½å Autoload" +msgstr "é‡å‘½åè‡ªåŠ¨åŠ è½½" + +msgid "Toggle Autoload Globals" +msgstr "å¼€å…³è‡ªåŠ¨åŠ è½½å…¨å±€å˜é‡" msgid "Move Autoload" -msgstr "移动 Autoload" +msgstr "ç§»åŠ¨è‡ªåŠ¨åŠ è½½" msgid "Remove Autoload" -msgstr "移除 Autoload" +msgstr "ç§»é™¤è‡ªåŠ¨åŠ è½½" msgid "Enable" msgstr "å¯ç”¨" msgid "Rearrange Autoloads" -msgstr "é‡æŽ’ Autoload" +msgstr "é‡æŽ’è‡ªåŠ¨åŠ è½½" + +msgid "Can't add Autoload:" +msgstr "æ— æ³•æ·»åŠ è‡ªåŠ¨åŠ è½½ï¼š" msgid "%s is an invalid path. File does not exist." msgstr "%s æ˜¯æ— æ•ˆè·¯å¾„ã€‚æ–‡ä»¶ä¸å˜åœ¨ã€‚" @@ -1338,6 +1966,9 @@ msgstr "%s æ˜¯æ— æ•ˆè·¯å¾„ã€‚æ–‡ä»¶ä¸å˜åœ¨ã€‚" msgid "%s is an invalid path. Not in resource path (res://)." msgstr "%s æ˜¯æ— æ•ˆè·¯å¾„ã€‚ä¸æ˜¯èµ„æºè·¯å¾„(res://)。" +msgid "Add Autoload" +msgstr "æ·»åŠ è‡ªåŠ¨åŠ è½½" + msgid "Path:" msgstr "路径:" @@ -1347,6 +1978,9 @@ msgstr "节点å称:" msgid "Global Variable" msgstr "全局å˜é‡" +msgid "3D Engine" +msgstr "3D 引擎" + msgid "2D Physics" msgstr "2D 物ç†" @@ -1356,9 +1990,108 @@ msgstr "3D 物ç†" msgid "Navigation" msgstr "导航" +msgid "XR" +msgstr "XR" + +msgid "RenderingDevice" +msgstr "RenderingDevice" + msgid "OpenGL" msgstr "OpenGL" +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Text Server: Fallback" +msgstr "文本æœåŠ¡å™¨ï¼šåŽå¤‡" + +msgid "Text Server: Advanced" +msgstr "文本æœåŠ¡å™¨ï¼šé«˜çº§" + +msgid "TTF, OTF, Type 1, WOFF1 Fonts" +msgstr "TTFã€OTFã€Type 1ã€WOFF1 å—体" + +msgid "WOFF2 Fonts" +msgstr "WOFF2 å—体" + +msgid "SIL Graphite Fonts" +msgstr "SIL Graphite å—体" + +msgid "Multi-channel Signed Distance Field Font Rendering" +msgstr "多通é“有符å·è·ç¦»åœºå—体渲染" + +msgid "3D Nodes as well as RenderingServer access to 3D features." +msgstr "3D èŠ‚ç‚¹ä»¥åŠ RenderingServer 对 3D 功能的访问。" + +msgid "2D Physics nodes and PhysicsServer2D." +msgstr "2D 物ç†èŠ‚点和 PhysicsServer2D。" + +msgid "3D Physics nodes and PhysicsServer3D." +msgstr "3D 物ç†èŠ‚点和 PhysicsServer3D。" + +msgid "Navigation, both 2D and 3D." +msgstr "导航,2D å’Œ 3D å‡å¯ã€‚" + +msgid "XR (AR and VR)." +msgstr "XR(AR å’Œ VR)。" + +msgid "" +"RenderingDevice based rendering (if disabled, the OpenGL back-end is " +"required)." +msgstr "基于RenderingDevice的渲染(如果ç¦ç”¨ï¼Œåˆ™éœ€è¦OpenGLåŽç«¯ï¼‰ã€‚" + +msgid "" +"OpenGL back-end (if disabled, the RenderingDevice back-end is required)." +msgstr "OpenGL åŽç«¯ï¼ˆå¦‚æžœç¦ç”¨ï¼Œåˆ™éœ€è¦ RenderingDevice åŽç«¯ï¼‰ã€‚" + +msgid "Vulkan back-end of RenderingDevice." +msgstr "RenderingDevice çš„ Vulkan åŽç«¯ã€‚" + +msgid "" +"Fallback implementation of Text Server\n" +"Supports basic text layouts." +msgstr "" +"文本æœåŠ¡å™¨çš„åŽå¤‡å®žçŽ°\n" +"支æŒåŸºæœ¬çš„文本布局。" + +msgid "" +"Text Server implementation powered by ICU and HarfBuzz libraries.\n" +"Supports complex text layouts, BiDi, and contextual OpenType font features." +msgstr "" +"ç”± ICU å’Œ HarfBuzz 库æ供支æŒçš„文本æœåŠ¡å™¨å®žçŽ°ã€‚\n" +"支æŒå¤æ‚的文本布局ã€BiDi 和上下文 OpenType å—体功能。" + +msgid "" +"TrueType, OpenType, Type 1, and WOFF1 font format support using FreeType " +"library (if disabled, WOFF2 support is also disabled)." +msgstr "" +"使用 FreeType åº“æ”¯æŒ TrueTypeã€OpenTypeã€Type 1 å’Œ WOFF1 å—ä½“æ ¼å¼ï¼ˆå¦‚æžœç¦ç”¨ï¼Œ" +"WOFF2 支æŒä¹Ÿä¼šè¢«ç¦ç”¨ï¼‰ã€‚" + +msgid "WOFF2 font format support using FreeType and Brotli libraries." +msgstr "使用 FreeType å’Œ Brotli åº“æ”¯æŒ WOFF2 å—ä½“æ ¼å¼ã€‚" + +msgid "" +"SIL Graphite smart font technology support (supported by Advanced Text " +"Server only)." +msgstr "æ”¯æŒ SIL Graphite 智能å—体技术(仅由高级文本æœåŠ¡å™¨æ”¯æŒï¼‰ã€‚" + +msgid "" +"Multi-channel signed distance field font rendering support using msdfgen " +"library (pre-rendered MSDF fonts can be used even if this option disabled)." +msgstr "" +"使用 msdfgen 库支æŒå¤šé€šé“有符å·è·ç¦»åœºå—体渲染(å³ä½¿ç¦ç”¨æ¤é€‰é¡¹ï¼Œä¹Ÿå¯ä»¥ä½¿ç”¨é¢„渲" +"染的 MSDF å—体)。" + +msgid "General Features:" +msgstr "常规特性:" + +msgid "Text Rendering and Font Options:" +msgstr "文本渲染与å—体选项:" + +msgid "File saving failed." +msgstr "ä¿å˜æ–‡ä»¶å¤±è´¥ã€‚" + msgid "Nodes and Classes:" msgstr "节点和类:" @@ -1374,12 +2107,42 @@ msgstr "新建" msgid "Save" msgstr "ä¿å˜" +msgid "Profile:" +msgstr "é…置文件:" + msgid "Reset to Defaults" msgstr "é‡ç½®ä¸ºé»˜è®¤å€¼" +msgid "Detect from Project" +msgstr "从项目ä¸æ£€æµ‹" + +msgid "Actions:" +msgstr "动作:" + +msgid "Configure Engine Build Profile:" +msgstr "é…置引擎构建é…置文件:" + +msgid "Please Confirm:" +msgstr "请确认:" + +msgid "Engine Build Profile" +msgstr "引擎构建é…置文件" + +msgid "Load Profile" +msgstr "åŠ è½½é…置文件" + msgid "Export Profile" msgstr "导出é…置文件" +msgid "Forced classes on detect:" +msgstr "强制检测类:" + +msgid "Edit Build Configuration Profile" +msgstr "编辑构建é…置文件" + +msgid "Filter Commands" +msgstr "ç›é€‰å‘½ä»¤" + msgid "Paste Params" msgstr "粘贴å‚æ•°" @@ -1401,6 +2164,9 @@ msgstr "[未ä¿å˜]" msgid "Please select a base directory first." msgstr "请先选择一个基础目录。" +msgid "Could not create folder. File with that name already exists." +msgstr "æ— æ³•åˆ›å»ºæ–‡ä»¶å¤¹ã€‚åŒå文件已å˜åœ¨ã€‚" + msgid "Choose a Directory" msgstr "选择目录" @@ -1423,7 +2189,7 @@ msgid "Script Editor" msgstr "脚本编辑器" msgid "Asset Library" -msgstr "ç´ æ库" +msgstr "资产库" msgid "Scene Tree Editing" msgstr "åœºæ™¯æ ‘ç¼–è¾‘" @@ -1437,6 +2203,9 @@ msgstr "文件系统é¢æ¿" msgid "Import Dock" msgstr "导入é¢æ¿" +msgid "History Dock" +msgstr "历å²åœé é¢æ¿" + msgid "Allows to view and edit 3D scenes." msgstr "å…许查看并编辑 3D 场景。" @@ -1444,7 +2213,7 @@ msgid "Allows to edit scripts using the integrated script editor." msgstr "å…许使用内置脚本编辑器编辑脚本。" msgid "Provides built-in access to the Asset Library." -msgstr "æä¾›å¯¹ç´ æ库的内置访问。" +msgstr "æ供对资产库的内置访问。" msgid "Allows editing the node hierarchy in the Scene dock." msgstr "å…许在场景é¢æ¿ä¸ç¼–辑节点层级。" @@ -1460,7 +2229,10 @@ msgstr "å…许使用专门的é¢æ¿æµè§ˆæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿã€‚" msgid "" "Allows to configure import settings for individual assets. Requires the " "FileSystem dock to function." -msgstr "å…许为å„ä¸ªç´ æé…置导入设置。文件系统é¢æ¿éœ€è¦å¯ç”¨ã€‚" +msgstr "å…许为å„个资产é…置导入设置。文件系统é¢æ¿éœ€è¦å¯ç”¨ã€‚" + +msgid "Provides an overview of the editor's and each scene's undo history." +msgstr "æ供编辑器和æ¯ä¸ªåœºæ™¯çš„撤消历å²è®°å½•çš„概览。" msgid "(current)" msgstr "(当å‰ï¼‰" @@ -1469,7 +2241,7 @@ msgid "(none)" msgstr "ï¼ˆæ— ï¼‰" msgid "Remove currently selected profile, '%s'? Cannot be undone." -msgstr "è¦åˆ 除当å‰æ‰€é€‰çš„é…置文件“%sâ€å—ï¼Ÿæ— æ³•æ’¤é”€ã€‚" +msgstr "è¦ç§»é™¤å½“å‰æ‰€é€‰çš„é…置文件“%sâ€å—ï¼Ÿæ— æ³•æ’¤é”€ã€‚" msgid "Profile must be a valid filename and must not contain '.'" msgstr "é…置文件必须是有效的文件å,并且ä¸èƒ½åŒ…å« â€œ.â€" @@ -1501,7 +2273,7 @@ msgstr "主è¦ç‰¹æ€§ï¼š" msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "é…置文件 “%s†已å˜åœ¨ã€‚在导入之å‰å…ˆåˆ 除该é…置文件,导入已ä¸æ¢ã€‚" +msgstr "é…置文件“%sâ€å·²å˜åœ¨ã€‚请在导入之å‰å…ˆç§»é™¤è¯¥é…置文件,导入已ä¸æ¢ã€‚" msgid "Reset to Default" msgstr "é‡ç½®ä¸ºé»˜è®¤å€¼" @@ -1596,6 +2368,9 @@ msgstr "打开文件或目录" msgid "Save a File" msgstr "ä¿å˜æ–‡ä»¶" +msgid "Favorited folder does not exist anymore and will be removed." +msgstr "收è—的文件夹ä¸å†å˜åœ¨ï¼Œå°†è¢«ç§»é™¤ã€‚" + msgid "Go Back" msgstr "åŽé€€" @@ -1636,13 +2411,13 @@ msgid "Refresh files." msgstr "刷新文件。" msgid "(Un)favorite current folder." -msgstr "收è—ï¼å–消收è—当å‰æ–‡ä»¶å¤¹ã€‚" +msgstr "收è—/å–消收è—当å‰æ–‡ä»¶å¤¹ã€‚" msgid "Toggle the visibility of hidden files." msgstr "切æ¢éšè—文件的å¯è§æ€§ã€‚" msgid "View items as a grid of thumbnails." -msgstr "ä»¥ç½‘æ ¼ç¼©ç•¥å›¾æŸ¥çœ‹é¡¹ç›®ã€‚" +msgstr "ä»¥æ …æ ¼ç¼©ç•¥å›¾æŸ¥çœ‹é¡¹ç›®ã€‚" msgid "View items as a list." msgstr "以列表查看项目。" @@ -1656,6 +2431,19 @@ msgstr "预览:" msgid "File:" msgstr "文件:" +msgid "" +"Remove the selected files? For safety only files and empty directories can " +"be deleted from here. (Cannot be undone.)\n" +"Depending on your filesystem configuration, the files will either be moved " +"to the system trash or deleted permanently." +msgstr "" +"是å¦ç§»é™¤é€‰å®šçš„文件?为了安全起è§ï¼Œåªæœ‰æ–‡ä»¶å’Œç©ºç›®å½•å¯ä»¥ä»Žè¿™é‡Œè¢«åˆ 除。(æ— æ³•æ’¤" +"消。)\n" +"æ ¹æ®ä½ 的文件系统设置,文件å¯èƒ½ä¼šè¢«ç§»åŠ¨è‡³ç³»ç»Ÿå›žæ”¶ç«™ï¼Œä¹Ÿå¯èƒ½è¢«æ°¸ä¹…åˆ é™¤ã€‚" + +msgid "Some extensions need the editor to restart to take effect." +msgstr "æŸäº›æ‰©å±•éœ€è¦é‡æ–°å¯åŠ¨ç¼–辑器æ‰èƒ½ç”Ÿæ•ˆã€‚" + msgid "Restart" msgstr "é‡æ–°å¯åŠ¨" @@ -1671,7 +2459,56 @@ msgid "" msgstr "文件 %s 有ä¸åŒç±»åž‹çš„多个导入器,已ä¸æ¢å¯¼å…¥" msgid "(Re)Importing Assets" -msgstr "æ£åœ¨å¯¼å…¥æˆ–é‡æ–°å¯¼å…¥ç´ æ" +msgstr "æ£åœ¨å¯¼å…¥æˆ–é‡æ–°å¯¼å…¥èµ„产" + +msgid "Import resources of type: %s" +msgstr "导入 %s 类型的资æº" + +msgid "No return value." +msgstr "æ— è¿”å›žå€¼ã€‚" + +msgid "Deprecated" +msgstr "已废弃" + +msgid "Experimental" +msgstr "实验性" + +msgid "This method supports a variable number of arguments." +msgstr "这个方法支æŒå¯å˜æ•°é‡çš„å‚数。" + +msgid "" +"This method is called by the engine.\n" +"It can be overridden to customize built-in behavior." +msgstr "" +"这个方法由引擎调用。\n" +"覆盖åŽå¯è‡ªå®šä¹‰å†…置行为。" + +msgid "" +"This method has no side effects.\n" +"It does not modify the object in any way." +msgstr "" +"这个方法没有副作用。\n" +"ä¸ä¼šä»¥ä»»ä½•å½¢å¼ä¿®æ”¹è¯¥å¯¹è±¡ã€‚" + +msgid "" +"This method does not need an instance to be called.\n" +"It can be called directly using the class name." +msgstr "" +"调用这个方法ä¸éœ€è¦å®žä¾‹ã€‚\n" +"å¯ä»¥ç›´æŽ¥ä½¿ç”¨ç±»å调用。" + +msgid "Error codes returned:" +msgstr "返回错误ç :" + +msgid "There is currently no description for this %s." +msgstr "这个 %s ç›®å‰æ²¡æœ‰æ述。" + +msgid "" +"There is currently no description for this %s. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"这个 %s ç›®å‰æ²¡æœ‰æ述。请帮我们[color=$color][url=$url]贡献一个[/url][/" +"color]ï¼" msgid "Top" msgstr "顶部" @@ -1685,9 +2522,30 @@ msgstr "继承:" msgid "Inherited by:" msgstr "派生:" +msgid "" +"This class is marked as deprecated. It will be removed in future versions." +msgstr "è¿™ä¸ªç±»è¢«æ ‡è®°ä¸ºå·²åºŸå¼ƒï¼Œä¼šåœ¨å°†æ¥çš„版本ä¸ç§»é™¤ã€‚" + +msgid "" +"This class is marked as experimental. It is subject to likely change or " +"possible removal in future versions. Use at your own discretion." +msgstr "" +"è¿™ä¸ªç±»è¢«æ ‡è®°ä¸ºå®žéªŒæ€§ï¼Œåœ¨å°†æ¥çš„版本ä¸æžå¯èƒ½å‘生修改,也å¯èƒ½è¢«ç§»é™¤ã€‚使用时请自" +"行斟酌。" + msgid "Description" msgstr "æè¿°" +msgid "There is currently no description for this class." +msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªç±»çš„æ述。" + +msgid "" +"There is currently no description for this class. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"ç›®å‰æ²¡æœ‰è¿™ä¸ªç±»çš„æ述。请帮我们[color=$color][url=$url]贡献一个[/url][/" +"color]ï¼" + msgid "Online Tutorials" msgstr "在线教程" @@ -1700,6 +2558,15 @@ msgstr "覆盖 %s:" msgid "default:" msgstr "默认:" +msgid "property:" +msgstr "属性:" + +msgid "Constructors" +msgstr "æž„é€ å‡½æ•°" + +msgid "Operators" +msgstr "è¿ç®—符" + msgid "Theme Properties" msgstr "主题属性" @@ -1712,6 +2579,9 @@ msgstr "常é‡" msgid "Fonts" msgstr "å—体" +msgid "Font Sizes" +msgstr "å—体大å°" + msgid "Icons" msgstr "å›¾æ ‡" @@ -1721,22 +2591,44 @@ msgstr "æ ·å¼" msgid "Enumerations" msgstr "枚举" +msgid "Annotations" +msgstr "注解" + +msgid "There is currently no description for this annotation." +msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªæ³¨è§£çš„æ述。" + +msgid "" +"There is currently no description for this annotation. Please help us by " +"[color=$color][url=$url]contributing one[/url][/color]!" +msgstr "" +"ç›®å‰æ²¡æœ‰è¿™ä¸ªæ³¨è§£çš„æ述。请帮我们[color=$color][url=$url]贡献一个[/url][/" +"color]ï¼" + msgid "Property Descriptions" msgstr "属性说明" msgid "(value)" msgstr "(值)" +msgid "There is currently no description for this property." +msgstr "ç›®å‰æ²¡æœ‰è¿™ä¸ªå±žæ€§çš„æ述。" + msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" -"当å‰æ²¡æœ‰æ¤å±žæ€§çš„说明。请帮我们[color=$color][url=$url]贡献一个[/url][/" +"ç›®å‰æ²¡æœ‰è¿™ä¸ªå±žæ€§çš„æ述。请帮我们[color=$color][url=$url]贡献一个[/url][/" "color]ï¼" +msgid "Constructor Descriptions" +msgstr "æž„é€ å‡½æ•°è¯´æ˜Ž" + msgid "Method Descriptions" msgstr "方法说明" +msgid "Operator Descriptions" +msgstr "è¿ç®—符说明" + msgid "%d match." msgstr "%d 个匹é…。" @@ -1758,12 +2650,21 @@ msgstr "全部显示" msgid "Classes Only" msgstr "ä»…ç±»" +msgid "Constructors Only" +msgstr "ä»…æž„é€ å‡½æ•°" + msgid "Methods Only" msgstr "仅方法" +msgid "Operators Only" +msgstr "ä»…è¿ç®—符" + msgid "Signals Only" msgstr "ä»…ä¿¡å·" +msgid "Annotations Only" +msgstr "仅注解" + msgid "Constants Only" msgstr "仅常é‡" @@ -1776,6 +2677,9 @@ msgstr "仅主题属性" msgid "Member Type" msgstr "æˆå‘˜ç±»åž‹" +msgid "(constructors)" +msgstr "ï¼ˆæž„é€ å‡½æ•°ï¼‰" + msgid "Class" msgstr "ç±»" @@ -1785,6 +2689,9 @@ msgstr "方法" msgid "Signal" msgstr "ä¿¡å·" +msgid "Annotation" +msgstr "注解" + msgid "Constant" msgstr "常é‡" @@ -1794,9 +2701,21 @@ msgstr "属性" msgid "Theme Property" msgstr "主题属性" +msgid "This member is marked as deprecated." +msgstr "这个æˆå‘˜è¢«æ ‡è®°ä¸ºå·²åºŸå¼ƒã€‚" + +msgid "This member is marked as experimental." +msgstr "这个æˆå‘˜è¢«æ ‡è®°ä¸ºå®žéªŒæ€§ã€‚" + msgid "Property:" msgstr "属性:" +msgid "Pin Value" +msgstr "固定值" + +msgid "Pin Value [Disabled because '%s' is editor-only]" +msgstr "固定值 [å·²ç¦ç”¨ï¼Œå› 为“%sâ€ä»…适用于编辑器]" + msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "将值固定会强制ä¿å˜è¿™ä¸ªå€¼ï¼Œå³ä¾¿å®ƒä¸Žé»˜è®¤å€¼ç›¸ç‰ã€‚" @@ -1804,54 +2723,160 @@ msgstr "将值固定会强制ä¿å˜è¿™ä¸ªå€¼ï¼Œå³ä¾¿å®ƒä¸Žé»˜è®¤å€¼ç›¸ç‰ã€‚" msgid "Open Documentation" msgstr "打开文档" +msgid "Element %d: %s%d*" +msgstr "å…ƒç´ %d:%s%d*" + msgid "Move Up" msgstr "å‘上移动" msgid "Move Down" msgstr "å‘下移动" +msgid "Insert New Before" +msgstr "在å‰æ–¹æ’å…¥" + +msgid "Insert New After" +msgstr "在之åŽæ’å…¥" + +msgid "Clear Array" +msgstr "清空数组" + +msgid "Resize Array..." +msgstr "调整数组大å°..." + +msgid "Add Element" +msgstr "æ·»åŠ å…ƒç´ " + msgid "Resize Array" msgstr "调整数组大å°" +msgid "New Size:" +msgstr "新大å°ï¼š" + +msgid "Element %s" +msgstr "å…ƒç´ %s" + +msgid "Add Metadata" +msgstr "æ·»åŠ å…ƒæ•°æ®" + msgid "Set %s" msgstr "设置 %s" msgid "Set Multiple:" msgstr "批é‡è®¾ç½®ï¼š" +msgid "Remove metadata %s" +msgstr "ç§»é™¤å…ƒæ•°æ® %s" + msgid "Pinned %s" msgstr "å°† %s 固定" msgid "Unpinned %s" msgstr "å°† %s 解除固定" +msgid "Add metadata %s" +msgstr "æ·»åŠ å…ƒæ•°æ® %s" + +msgid "Metadata name can't be empty." +msgstr "元数æ®å称ä¸èƒ½ä¸ºç©ºã€‚" + +msgid "Metadata name must be a valid identifier." +msgstr "元数æ®åç§°å¿…é¡»æ˜¯æœ‰æ•ˆçš„æ ‡è¯†ç¬¦ã€‚" + +msgid "Metadata with name \"%s\" already exists." +msgstr "å为“%sâ€çš„元数æ®å·²å˜åœ¨ã€‚" + +msgid "Names starting with _ are reserved for editor-only metadata." +msgstr "以 _ 开头的å称已为编辑器元数æ®ä¿ç•™ã€‚" + +msgid "Metadata name is valid." +msgstr "元数æ®å称有效。" + +msgid "Add Metadata Property for \"%s\"" +msgstr "为“%sâ€æ·»åŠ 元数æ®å±žæ€§" + +msgid "Copy Value" +msgstr "å¤åˆ¶å€¼" + +msgid "Paste Value" +msgstr "粘贴值" + msgid "Copy Property Path" msgstr "å¤åˆ¶å±žæ€§è·¯å¾„" +msgid "Select existing layout:" +msgstr "选择现å˜å¸ƒå±€ï¼š" + +msgid "Changed Locale Language Filter" +msgstr "修改区域设置è¯è¨€ç›é€‰" + +msgid "Changed Locale Script Filter" +msgstr "修改区域设置文å—ç›é€‰" + +msgid "Changed Locale Country Filter" +msgstr "修改区域设置地区ç›é€‰" + msgid "Changed Locale Filter Mode" msgstr "修改区域设置ç›é€‰æ¨¡å¼" +msgid "Select a Locale" +msgstr "选择区域" + msgid "Show All Locales" msgstr "显示所有区域" msgid "Show Selected Locales Only" msgstr "仅显示选定的区域" +msgid "Edit Filters" +msgstr "编辑ç›é€‰å™¨" + msgid "Language:" msgstr "è¯è¨€ï¼š" -msgid "Script" -msgstr "脚本" +msgid "Country:" +msgstr "地区:" + +msgid "Language" +msgstr "è¯è¨€" + +msgid "Country" +msgstr "地区" msgid "Variant" msgstr "å˜ä½“" +msgid "Filter Messages" +msgstr "消æ¯ç›é€‰" + msgid "Clear Output" msgstr "清空输出" msgid "Copy Selection" msgstr "å¤åˆ¶é€‰ä¸é¡¹" +msgid "" +"Collapse duplicate messages into one log entry. Shows number of occurrences." +msgstr "å°†é‡å¤çš„ä¿¡æ¯æŠ˜å æˆä¸€ä¸ªæ—¥å¿—æ¡ç›®ã€‚显示出现的次数。" + +msgid "Focus Search/Filter Bar" +msgstr "èšç„¦æœç´¢/过滤æ " + +msgid "Toggle visibility of standard output messages." +msgstr "切æ¢æ ‡å‡†è¾“出消æ¯çš„å¯è§æ€§ã€‚" + +msgid "Toggle visibility of errors." +msgstr "切æ¢é”™è¯¯çš„å¯è§æ€§ã€‚" + +msgid "Toggle visibility of warnings." +msgstr "切æ¢è¦å‘Šçš„å¯è§æ€§ã€‚" + +msgid "Toggle visibility of editor messages." +msgstr "切æ¢ç¼–辑器消æ¯çš„å¯è§æ€§ã€‚" + +msgid "Native Shader Source Inspector" +msgstr "本地ç€è‰²å™¨æºæ£€æŸ¥å™¨" + msgid "New Window" msgstr "新窗å£" @@ -1883,6 +2908,11 @@ msgid "" "Make it unique first." msgstr "æ— æ³•ä¿å˜æ¤èµ„æºï¼Œå› 为æ¤èµ„æºä¸å±žäºŽå·²ç¼–辑的场景。请先唯一化æ¤èµ„æºã€‚" +msgid "" +"This resource can't be saved because it was imported from another file. Make " +"it unique first." +msgstr "æ— æ³•ä¿å˜æ¤èµ„æºï¼Œå› 为æ¤èµ„æºæ˜¯ä»Žå…¶ä»–文件导入的。请先唯一化æ¤èµ„æºã€‚" + msgid "Save Resource As..." msgstr "资æºå¦å˜ä¸º..." @@ -1895,6 +2925,21 @@ msgstr "请求文件的类型未知:" msgid "Error while saving." msgstr "ä¿å˜æ—¶å‡ºé”™ã€‚" +msgid "Can't open file '%s'. The file could have been moved or deleted." +msgstr "æ— æ³•æ‰“å¼€æ–‡ä»¶â€œ%sâ€ã€‚该文件å¯èƒ½å·²è¢«ç§»åŠ¨æˆ–åˆ é™¤ã€‚" + +msgid "Error while parsing file '%s'." +msgstr "解æžæ–‡ä»¶â€œ%sâ€æ—¶å‡ºé”™ã€‚" + +msgid "Scene file '%s' appears to be invalid/corrupt." +msgstr "场景文件“%sâ€ä¼¼ä¹Žæ— 效/å·²æŸå。" + +msgid "Missing file '%s' or one its dependencies." +msgstr "缺失文件“%sâ€æˆ–å…¶ä¾èµ–项。" + +msgid "Error while loading file '%s'." +msgstr "åŠ è½½æ–‡ä»¶â€œ%sâ€æ—¶å‡ºé”™ã€‚" + msgid "Saving Scene" msgstr "æ£åœ¨ä¿å˜åœºæ™¯" @@ -1908,6 +2953,13 @@ msgid "This operation can't be done without a tree root." msgstr "æ¤æ“作必须在打开一个场景åŽæ‰èƒ½æ‰§è¡Œã€‚" msgid "" +"This scene can't be saved because there is a cyclic instance inclusion.\n" +"Please resolve it and then attempt to save again." +msgstr "" +"这个场景包å«å¾ªçŽ¯å®žä¾‹åŒ–ï¼Œæ— æ³•ä¿å˜ã€‚\n" +"请解决æ¤é—®é¢˜åŽå°è¯•å†æ¬¡ä¿å˜ã€‚" + +msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "æ— æ³•ä¿å˜åœºæ™¯ã€‚å¯èƒ½æ˜¯å› 为ä¾èµ–é¡¹ï¼ˆå®žä¾‹æˆ–ç»§æ‰¿ï¼‰æ— æ³•æ»¡è¶³ã€‚" @@ -1948,34 +3000,80 @@ msgstr "布局å称未找到ï¼" msgid "Restored the Default layout to its base settings." msgstr "已将默认布局æ¢å¤ä¸ºåŽŸå§‹å†…容。" +msgid "This object is marked as read-only, so it's not editable." +msgstr "è¿™ä¸ªå¯¹è±¡è¢«æ ‡è®°ä¸ºåªè¯»ï¼Œæ‰€ä»¥å®ƒæ˜¯ä¸å¯ç¼–辑的。" + msgid "" "This resource belongs to a scene that was imported, so it's not editable.\n" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" -"æ¤èµ„æºå±žäºŽå·²å¯¼å…¥çš„场景,ä¸å¯ç¼–辑。\n" +"这个资æºå±žäºŽå·²å¯¼å…¥çš„场景,ä¸å¯ç¼–辑。\n" "请阅读与导入场景相关的文档,以更佳ç†è§£æ¤å·¥ä½œæµã€‚" msgid "" +"This resource belongs to a scene that was instantiated or inherited.\n" +"Changes to it must be made inside the original scene." +msgstr "" +"这个资æºå±žäºŽä¸€ä¸ªè¢«å®žä¾‹åŒ–或被继承的场景。\n" +"对该资æºçš„修改必须在原始场景ä¸è¿›è¡Œã€‚" + +msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "æ¤èµ„æºå·²å¯¼å…¥ï¼Œå› æ¤æ— 法编辑。在导入é¢æ¿ä¸æ›´æ”¹è®¾ç½®å¹¶é‡æ–°å¯¼å…¥ã€‚" +msgid "" +"This scene was imported, so changes to it won't be kept.\n" +"Instantiating or inheriting it will allow you to make changes to it.\n" +"Please read the documentation relevant to importing scenes to better " +"understand this workflow." +msgstr "" +"æ¤åœºæ™¯æ˜¯å¯¼å…¥çš„ï¼Œå› æ¤ä¸ä¼šä¿ç•™å¯¹å…¶æ‰€åšçš„更改。\n" +"实例化或继承它将å…许您对其进行更改。\n" +"请阅读与导入场景相关的文档以更好地ç†è§£æ¤å·¥ä½œæµç¨‹ã€‚" + msgid "Changes may be lost!" msgstr "更改å¯èƒ½ä¼šä¸¢å¤±ï¼" +msgid "This object is read-only." +msgstr "这个对象是åªè¯»çš„。" + +msgid "" +"Movie Maker mode is enabled, but no movie file path has been specified.\n" +"A default movie file path can be specified in the project settings under the " +"Editor > Movie Writer category.\n" +"Alternatively, for running single scenes, a `movie_file` string metadata can " +"be added to the root node,\n" +"specifying the path to a movie file that will be used when recording that " +"scene." +msgstr "" +"å·²å¯ç”¨ Movie Maker 模å¼ï¼Œä½†æ²¡æœ‰æŒ‡å®šç”µå½±æ–‡ä»¶è·¯å¾„。\n" +"å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®çš„“编辑器 > Movie Writerâ€ç±»åˆ«ä¸‹æŒ‡å®šé»˜è®¤çš„电影文件路径。\n" +"è¿è¡Œå•ä¸€åœºæ™¯æ—¶ï¼Œä¹Ÿå¯ä»¥åœ¨æ ¹èŠ‚ç‚¹ä¸Šæ·»åŠ `movie_file` å—符串元数æ®ï¼Œ\n" +"指定录制该场景时使用的电影文件的路径。" + msgid "There is no defined scene to run." msgstr "没有设置è¦è¿è¡Œçš„场景。" msgid "Save scene before running..." msgstr "è¿è¡Œå‰ä¿å˜åœºæ™¯..." +msgid "Could not start subprocess(es)!" +msgstr "æ— æ³•å¯åŠ¨å进程ï¼" + +msgid "Reload the played scene." +msgstr "é‡è½½è¿è¡Œçš„场景。" + msgid "Play the project." msgstr "è¿è¡Œæ¤é¡¹ç›®ã€‚" msgid "Play the edited scene." msgstr "è¿è¡Œæ£åœ¨ç¼–辑的场景。" +msgid "Play a custom scene." +msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯ã€‚" + msgid "Open Base Scene" msgstr "打开父场景" @@ -1991,9 +3089,15 @@ msgstr "快速打开脚本..." msgid "Save & Reload" msgstr "ä¿å˜å¹¶é‡æ–°åŠ è½½" +msgid "Save modified resources before reloading?" +msgstr "在é‡æ–°åŠ 载之å‰ä¿å˜ä¿®æ”¹åŽçš„资æºï¼Ÿ" + msgid "Save & Quit" msgstr "ä¿å˜å¹¶é€€å‡º" +msgid "Save modified resources before closing?" +msgstr "在关é—之å‰ä¿å˜ä¿®æ”¹åŽçš„资æºï¼Ÿ" + msgid "Save changes to '%s' before reloading?" msgstr "是å¦åœ¨é‡æ–°åŠ è½½å‰ä¿å˜å¯¹â€œ%sâ€çš„更改?" @@ -2025,12 +3129,30 @@ msgstr "é¼ æ ‡æŒ‰ä¸‹æ—¶æ— æ³•æ’¤é”€ã€‚" msgid "Nothing to undo." msgstr "æ— å¯æ’¤é”€ã€‚" +msgid "Global Undo: %s" +msgstr "全局撤销:%s" + +msgid "Remote Undo: %s" +msgstr "远程撤销:%s" + +msgid "Scene Undo: %s" +msgstr "场景撤销:%s" + msgid "Can't redo while mouse buttons are pressed." msgstr "é¼ æ ‡æŒ‰ä¸‹æ—¶æ— æ³•é‡åšã€‚" msgid "Nothing to redo." msgstr "æ— å¯é‡åšã€‚" +msgid "Global Redo: %s" +msgstr "全局é‡åšï¼š%s" + +msgid "Remote Redo: %s" +msgstr "远程é‡åšï¼š%s" + +msgid "Scene Redo: %s" +msgstr "场景é‡åšï¼š%s" + msgid "Can't reload a scene that was never saved." msgstr "æ— æ³•é‡æ–°åŠ 载从未ä¿å˜è¿‡çš„场景。" @@ -2190,6 +3312,9 @@ msgstr "平移视图" msgid "Dock Position" msgstr "é¢æ¿ä½ç½®" +msgid "Make Floating" +msgstr "浮动" + msgid "Add a new scene." msgstr "æ·»åŠ æ–°åœºæ™¯ã€‚" @@ -2211,6 +3336,18 @@ msgstr "转到上一个打开的场景。" msgid "Copy Text" msgstr "å¤åˆ¶æ–‡æœ¬" +msgid "Next Scene Tab" +msgstr "下一个场景选项å¡" + +msgid "Previous Scene Tab" +msgstr "上一个场景选项å¡" + +msgid "Focus FileSystem Filter" +msgstr "èšç„¦æ–‡ä»¶ç³»ç»Ÿè¿‡æ»¤å™¨" + +msgid "Command Palette" +msgstr "命令é¢æ¿" + msgid "New Scene" msgstr "新建场景" @@ -2229,6 +3366,9 @@ msgstr "最近打开" msgid "Save Scene" msgstr "ä¿å˜åœºæ™¯" +msgid "Export As..." +msgstr "导出为..." + msgid "MeshLibrary..." msgstr "ç½‘æ ¼åº“..." @@ -2244,9 +3384,18 @@ msgstr "项目" msgid "Project Settings..." msgstr "项目设置..." +msgid "Project Settings" +msgstr "项目设置" + msgid "Version Control" msgstr "版本控制" +msgid "Create Version Control Metadata" +msgstr "创建版本控制元数æ®" + +msgid "Version Control Settings" +msgstr "版本控制设置" + msgid "Export..." msgstr "导出..." @@ -2256,6 +3405,9 @@ msgstr "安装 Android 构建模æ¿..." msgid "Open User Data Folder" msgstr "打开 “用户数æ®â€ 文件夹" +msgid "Customize Engine Build Configuration..." +msgstr "自定义引擎构建é…ç½®..." + msgid "Tools" msgstr "工具" @@ -2274,6 +3426,9 @@ msgstr "编辑器" msgid "Editor Settings..." msgstr "编辑器设置..." +msgid "Command Palette..." +msgstr "命令é¢æ¿..." + msgid "Editor Layout" msgstr "编辑器布局" @@ -2301,6 +3456,9 @@ msgstr "管ç†ç¼–辑器功能..." msgid "Manage Export Templates..." msgstr "管ç†å¯¼å‡ºæ¨¡æ¿..." +msgid "Configure FBX Importer..." +msgstr "é…ç½® FBX 导入器..." + msgid "Help" msgstr "帮助" @@ -2328,15 +3486,65 @@ msgstr "关于 Godot" msgid "Support Godot Development" msgstr "æ”¯æŒ Godot å¼€å‘" +msgid "Run the project's default scene." +msgstr "è¿è¡Œé¡¹ç›®çš„默认场景。" + msgid "Run Project" msgstr "è¿è¡Œé¡¹ç›®" +msgid "Pause the running project's execution for debugging." +msgstr "æš‚åœè¿è¡Œä¸çš„项目以进行调试。" + +msgid "Pause Running Project" +msgstr "æš‚åœè¿è¡Œä¸çš„项目" + +msgid "Stop the currently running project." +msgstr "åœæ¢ç›®å‰è¿è¡Œä¸çš„项目。" + +msgid "Stop Running Project" +msgstr "åœæ¢è¿è¡Œä¸çš„项目" + +msgid "Run the currently edited scene." +msgstr "è¿è¡Œå½“å‰ç¼–辑的场景。" + +msgid "Run Current Scene" +msgstr "è¿è¡Œå½“å‰åœºæ™¯" + +msgid "Run a specific scene." +msgstr "è¿è¡Œä¸€ä¸ªç‰¹å®šçš„场景。" + +msgid "Run Specific Scene" +msgstr "è¿è¡Œç‰¹å®šåœºæ™¯" + +msgid "" +"Enable Movie Maker mode.\n" +"The project will run at stable FPS and the visual and audio output will be " +"recorded to a video file." +msgstr "" +"å¯ç”¨ Movie Maker 模å¼ã€‚\n" +"该项目将以稳定的 FPS è¿è¡Œï¼Œå½±åƒå’ŒéŸ³é¢‘输出将被记录到一个视频文件ä¸ã€‚" + +msgid "Choose a renderer." +msgstr "选择渲染器。" + +msgid "Forward+" +msgstr "Forward+" + +msgid "Mobile" +msgstr "移动" + msgid "Compatibility" -msgstr "兼容性" +msgstr "兼容" + +msgid "Changing the renderer requires restarting the editor." +msgstr "改å˜æ¸²æŸ“器需è¦é‡å¯ç¼–辑器。" msgid "Update Continuously" msgstr "æŒç»æ›´æ–°" +msgid "Update When Changed" +msgstr "改å˜æ—¶æ›´æ–°" + msgid "Hide Update Spinner" msgstr "éšè—更新旋转图" @@ -2349,6 +3557,9 @@ msgstr "检查器" msgid "Node" msgstr "节点" +msgid "History" +msgstr "历å²" + msgid "Expand Bottom Panel" msgstr "展开底部é¢æ¿" @@ -2367,21 +3578,8 @@ msgstr "管ç†æ¨¡æ¿" msgid "Install from file" msgstr "从文件安装" -msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"通过将æºæ¨¡æ¿å®‰è£…到 “res://android/build†,将为自定义 Android 构建设置项" -"目。\n" -"然åŽï¼Œå¯ä»¥åº”用修改并在导出时构建自己的自定义 APKï¼ˆæ·»åŠ æ¨¡å—ã€æ›´æ”¹ " -"AndroidManifest.xml ç‰ï¼‰ã€‚\n" -"请注æ„,è¦ä½¿ç”¨è‡ªå®šä¹‰æž„建而ä¸æ˜¯ä½¿ç”¨é¢„先构建的 APK,需在 Android 导出预设ä¸å¯" -"用 “Use Custom Build†选项。" +msgid "Select Android sources file" +msgstr "选择 Android æºæ–‡ä»¶" msgid "" "The Android build template is already installed in this project and it won't " @@ -2390,7 +3588,7 @@ msgid "" "operation again." msgstr "" "Android 构建模æ¿å·²å®‰è£…在æ¤é¡¹ç›®ä¸ï¼Œå°†ä¸ä¼šè¢«è¦†ç›–。\n" -"å†æ¬¡å°è¯•æ‰§è¡Œæ¤æ“作之å‰ï¼Œè¯·æ‰‹åŠ¨åˆ 除 “res://android/build†目录。" +"å†æ¬¡å°è¯•æ‰§è¡Œæ¤æ“作之å‰ï¼Œè¯·æ‰‹åŠ¨ç§»é™¤â€œres://android/buildâ€ç›®å½•ã€‚" msgid "Import Templates From ZIP File" msgstr "从 ZIP 文件ä¸å¯¼å…¥æ¨¡æ¿" @@ -2442,7 +3640,7 @@ msgid "Open Script Editor" msgstr "打开脚本编辑器" msgid "Open Asset Library" -msgstr "æ‰“å¼€ç´ æ库" +msgstr "打开资产库" msgid "Open the next Editor" msgstr "打开下一个编辑器" @@ -2450,6 +3648,9 @@ msgstr "打开下一个编辑器" msgid "Open the previous Editor" msgstr "打开上一个编辑器" +msgid "Ok" +msgstr "确定" + msgid "Warning!" msgstr "è¦å‘Šï¼" @@ -2474,6 +3675,9 @@ msgstr "编辑æ’件" msgid "Installed Plugins:" msgstr "已安装æ’件:" +msgid "Create New Plugin" +msgstr "创建新æ’件" + msgid "Version" msgstr "版本" @@ -2489,6 +3693,9 @@ msgstr "编辑文本:" msgid "On" msgstr "å¯ç”¨" +msgid "Renaming layer %d:" +msgstr "é‡å‘½å层 %d:" + msgid "No name provided." msgstr "没有æä¾›å称。" @@ -2501,12 +3708,44 @@ msgstr "第 %d ä½ï¼Œå€¼ä¸º %d" msgid "Rename" msgstr "é‡å‘½å" +msgid "Rename layer" +msgstr "é‡å‘½å层" + +msgid "Layer %d" +msgstr "层 %d" + +msgid "No Named Layers" +msgstr "æ— å‘½å层" + +msgid "Edit Layer Names" +msgstr "编辑层å称" + +msgid "<empty>" +msgstr "<空>" + +msgid "Temporary Euler may be changed implicitly!" +msgstr "临时欧拉值å¯èƒ½è¢«éšå¼æ”¹å˜!" + +msgid "" +"Temporary Euler will not be stored in the object with the original value. " +"Instead, it will be stored as Quaternion with irreversible conversion.\n" +"This is due to the fact that the result of Euler->Quaternion can be " +"determined uniquely, but the result of Quaternion->Euler can be multi-" +"existent." +msgstr "" +"临时欧拉值ä¸ä¼šä»¥åŽŸå§‹å½¢å¼åœ¨è¯¥å¯¹è±¡ä¸å˜å‚¨ï¼Œè€Œä¼šä»¥å››å…ƒæ•°å½¢å¼å˜å‚¨ï¼Œè¯¥è½¬æ¢ä¸å¯" +"逆。\n" +"è¿™æ˜¯å› ä¸ºæ¬§æ‹‰å€¼ -> 四元数的结果是唯一的,但四元数 -> 欧拉值的结果å¯èƒ½æœ‰å¤šä¸ªã€‚" + msgid "Assign..." msgstr "指定..." msgid "Invalid RID" msgstr "æ— æ•ˆçš„ RID" +msgid "Recursion detected, unable to assign resource to property." +msgstr "æ£€æµ‹åˆ°é€’å½’ï¼Œæ— æ³•å°†èµ„æºåˆ†é…给属性。" + msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." @@ -2529,12 +3768,24 @@ msgstr "选择视å£" msgid "Selected node is not a Viewport!" msgstr "选定节点ä¸æ˜¯ Viewportï¼" +msgid "(Nil) %s" +msgstr "(空)%s" + +msgid "%s (size %s)" +msgstr "%sï¼ˆå¤§å° %s)" + msgid "Size:" msgstr "大å°ï¼š" msgid "Remove Item" msgstr "移除项目" +msgid "Dictionary (Nil)" +msgstr "å—典(空)" + +msgid "Dictionary (size %d)" +msgstr "å—å…¸ï¼ˆå¤§å° %d)" + msgid "New Key:" msgstr "新建键:" @@ -2544,6 +3795,15 @@ msgstr "新建值:" msgid "Add Key/Value Pair" msgstr "æ·»åŠ é”®å€¼å¯¹" +msgid "Localizable String (Nil)" +msgstr "å¯æœ¬åœ°åŒ–å—符串(空)" + +msgid "Localizable String (size %d)" +msgstr "å¯æœ¬åœ°åŒ–å—ç¬¦ä¸²ï¼ˆå¤§å° %d)" + +msgid "Add Translation" +msgstr "æ·»åŠ ç¿»è¯‘" + msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." @@ -2552,9 +3812,15 @@ msgstr "所选资æºï¼ˆ%s)与该属性(%s)所需的类型都ä¸åŒ¹é…。" msgid "Quick Load" msgstr "å¿«é€ŸåŠ è½½" +msgid "Inspect" +msgstr "查看" + msgid "Make Unique" msgstr "唯一化" +msgid "Make Unique (Recursive)" +msgstr "唯一化(递归)" + msgid "Convert to %s" msgstr "转æ¢ä¸º %s" @@ -2567,6 +3833,15 @@ msgstr "新建脚本" msgid "Extend Script" msgstr "扩展脚本" +msgid "New Shader" +msgstr "新建ç€è‰²å™¨" + +msgid "No Remote Debug export presets configured." +msgstr "没有é…置远程调试导出预置。" + +msgid "Remote Debug" +msgstr "远程调试" + msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -2584,6 +3859,16 @@ msgstr "在 _run() 方法ä¸å¡«å†™é€»è¾‘代ç 。" msgid "There is an edited scene already." msgstr "å·²å˜åœ¨ä¸€ä¸ªæ£åœ¨ç¼–辑的场景。" +msgid "" +"Couldn't run editor script, did you forget to override the '_run' method?" +msgstr "æ— æ³•è¿è¡Œç¼–è¾‘å™¨è„šæœ¬ï¼Œä½ æ˜¯å¦å¿˜äº†è¦†ç›–“_runâ€æ–¹æ³•ï¼Ÿ" + +msgid "Edit Built-in Action" +msgstr "编辑内置动作" + +msgid "Edit Shortcut" +msgstr "编辑快æ·é”®" + msgid "Common" msgstr "通用" @@ -2593,6 +3878,9 @@ msgstr "编辑器设置" msgid "General" msgstr "常规" +msgid "Filter Settings" +msgstr "ç›é€‰è®¾ç½®" + msgid "The editor must be restarted for changes to take effect." msgstr "å¿…é¡»é‡æ–°å¯åŠ¨ç¼–辑器æ‰èƒ½ä½¿æ›´æ”¹ç”Ÿæ•ˆã€‚" @@ -2602,8 +3890,81 @@ msgstr "å¿«æ·é”®" msgid "Binding" msgstr "绑定" -msgid "%s Error" -msgstr "%s 错误" +msgid "" +"Hold %s to round to integers.\n" +"Hold Shift for more precise changes." +msgstr "" +"æŒ‰ä½ %s å–整。\n" +"æŒ‰ä½ Shift 获å–更精确的å˜åŒ–。" + +msgid "No notifications." +msgstr "æ— é€šçŸ¥ã€‚" + +msgid "Show notifications." +msgstr "显示通知。" + +msgid "Silence the notifications." +msgstr "将通知é™éŸ³ã€‚" + +msgid "Left Stick Left, Joystick 0 Left" +msgstr "左摇æ†å‘å·¦ï¼ŒæŽ§åˆ¶æ† 0 å‘å·¦" + +msgid "Left Stick Right, Joystick 0 Right" +msgstr "左摇æ†å‘å³ï¼ŒæŽ§åˆ¶æ† 0 å‘å³" + +msgid "Left Stick Up, Joystick 0 Up" +msgstr "左摇æ†å‘ä¸Šï¼ŒæŽ§åˆ¶æ† 0 å‘上" + +msgid "Left Stick Down, Joystick 0 Down" +msgstr "左摇æ†å‘ä¸‹ï¼ŒæŽ§åˆ¶æ† 0 å‘下" + +msgid "Right Stick Left, Joystick 1 Left" +msgstr "å³æ‘‡æ†å‘å·¦ï¼ŒæŽ§åˆ¶æ† 1 å‘å·¦" + +msgid "Right Stick Right, Joystick 1 Right" +msgstr "å³æ‘‡æ†å‘å³ï¼ŒæŽ§åˆ¶æ† 1 å‘å³" + +msgid "Right Stick Up, Joystick 1 Up" +msgstr "å³æ‘‡æ†å‘ä¸Šï¼ŒæŽ§åˆ¶æ† 1 å‘上" + +msgid "Right Stick Down, Joystick 1 Down" +msgstr "å³æ‘‡æ†å‘ä¸‹ï¼ŒæŽ§åˆ¶æ† 1 å‘下" + +msgid "Joystick 2 Left" +msgstr "æŽ§åˆ¶æ† 2 å‘å·¦" + +msgid "Left Trigger, Sony L2, Xbox LT, Joystick 2 Right" +msgstr "左扳机ã€ç´¢å°¼ L2ã€Xbox LTã€æŽ§åˆ¶æ† 2 å‘å³" + +msgid "Joystick 2 Up" +msgstr "æŽ§åˆ¶æ† 2 å‘上" + +msgid "Right Trigger, Sony R2, Xbox RT, Joystick 2 Down" +msgstr "å³æ‰³æœºã€ç´¢å°¼ R2ã€Xbox RTã€æŽ§åˆ¶æ† 2 å‘下" + +msgid "Joystick 3 Left" +msgstr "æŽ§åˆ¶æ† 3 å‘å·¦" + +msgid "Joystick 3 Right" +msgstr "æŽ§åˆ¶æ† 3 å‘å³" + +msgid "Joystick 3 Up" +msgstr "æŽ§åˆ¶æ† 3 å‘上" + +msgid "Joystick 3 Down" +msgstr "æŽ§åˆ¶æ† 3 å‘下" + +msgid "Joystick 4 Left" +msgstr "æŽ§åˆ¶æ† 4 å‘å·¦" + +msgid "Joystick 4 Right" +msgstr "æŽ§åˆ¶æ† 4 å‘å³" + +msgid "Joystick 4 Up" +msgstr "æŽ§åˆ¶æ† 4 å‘上" + +msgid "Joystick 4 Down" +msgstr "æŽ§åˆ¶æ† 4 å‘下" msgid "All Devices" msgstr "所有设备" @@ -2611,6 +3972,12 @@ msgstr "所有设备" msgid "Device" msgstr "设备" +msgid "Listening for input..." +msgstr "æ£åœ¨ç›‘å¬è¾“å…¥..." + +msgid "Filter by event..." +msgstr "按事件ç›é€‰..." + msgid "Project export for platform:" msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š" @@ -2650,6 +4017,15 @@ msgstr "导出项目文件失败。" msgid "Can't open file to read from path \"%s\"." msgstr "æ— æ³•æ‰“å¼€ä½äºŽâ€œ%sâ€çš„文件用于读å–。" +msgid "Can't open executable file from path \"%s\"." +msgstr "æ— æ³•æ‰“å¼€ä½äºŽâ€œ%sâ€çš„å¯æ‰§è¡Œæ–‡ä»¶ã€‚" + +msgid "Can't create encrypted file." +msgstr "æ— æ³•åˆ›å»ºåŠ å¯†æ–‡ä»¶ã€‚" + +msgid "Can't open encrypted file to write." +msgstr "æ— æ³•æ‰“å¼€åŠ å¯†æ–‡ä»¶è¿›è¡Œå†™æ“作。" + msgid "Save ZIP" msgstr "ä¿å˜ ZIP" @@ -2770,6 +4146,9 @@ msgstr "æ£åœ¨ä¸‹è½½" msgid "Connection Error" msgstr "连接错误" +msgid "TLS Handshake Error" +msgstr "TLS æ¡æ‰‹é”™è¯¯" + msgid "Can't open the export templates file." msgstr "æ— æ³•æ‰“å¼€å¯¼å‡ºæ¨¡æ¿æ–‡ä»¶ã€‚" @@ -2878,6 +4257,9 @@ msgstr "所有预设必须都定义导出路径,æ‰èƒ½è¿›è¡Œâ€œå…¨éƒ¨å¯¼å‡ºâ€ msgid "Delete preset '%s'?" msgstr "是å¦åˆ 除预设 “%sâ€ï¼Ÿ" +msgid "%s Export" +msgstr "%s 导出" + msgid "Release" msgstr "å‘布" @@ -2918,12 +4300,25 @@ msgstr "导出选ä¸çš„场景(包括ä¾èµ–项)" msgid "Export selected resources (and dependencies)" msgstr "导出选ä¸çš„资æºï¼ˆåŒ…括ä¾èµ–项)" +msgid "Export all resources in the project except resources checked below" +msgstr "导出项目ä¸çš„所有资æºï¼Œä¸‹æ–¹å‹¾é€‰çš„资æºé™¤å¤–" + +msgid "Export as dedicated server" +msgstr "导出为专用æœåŠ¡å™¨" + msgid "Export Mode:" msgstr "导出模å¼ï¼š" msgid "Resources to export:" msgstr "导出的资æºï¼š" +msgid "" +"\"Strip Visuals\" will replace the following resources with placeholders:" +msgstr "“剥离视觉内容â€å°†ç”¨å ä½ç¬¦å–代以下资æºï¼š" + +msgid "Strip Visuals" +msgstr "剥离视觉内容" + msgid "Keep" msgstr "ä¿æŒ" @@ -2950,9 +4345,35 @@ msgstr "自定义 (以逗å·åˆ†éš”):" msgid "Feature List:" msgstr "特性列表:" +msgid "Encryption" +msgstr "åŠ å¯†" + +msgid "Encrypt Exported PCK" +msgstr "åŠ å¯†å¯¼å‡ºçš„ PCK" + +msgid "Encrypt Index (File Names and Info)" +msgstr "åŠ å¯†ç´¢å¼•ï¼ˆæ–‡ä»¶å和信æ¯ï¼‰" + +msgid "" +"Filters to include files/folders\n" +"(comma-separated, e.g: *.tscn, *.tres, scenes/*)" +msgstr "" +"用于包å«æ–‡ä»¶/文件夹的ç›é€‰å™¨\n" +"(以英文逗å·åˆ†éš”,例如:*.tscn, *.tres, scenes/*)" + +msgid "" +"Filters to exclude files/folders\n" +"(comma-separated, e.g: *.ctex, *.import, music/*)" +msgstr "" +"用于排除文件/文件夹的ç›é€‰å™¨\n" +"(以英文逗å·åˆ†éš”,例如:*.ctex, *.import, music/*)" + msgid "Invalid Encryption Key (must be 64 hexadecimal characters long)" msgstr "æ— æ•ˆçš„åŠ å¯†å¯†é’¥ï¼ˆé•¿åº¦å¿…é¡»ä¸º 64 个åå…进制å—符)" +msgid "Encryption Key (256-bits as hexadecimal):" +msgstr "åŠ å¯†å¯†é’¥ï¼ˆ256 ä½åå…进制ç ):" + msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." @@ -2963,6 +4384,9 @@ msgstr "" msgid "More Info..." msgstr "更多信æ¯..." +msgid "Export PCK/ZIP..." +msgstr "导出 PCK/ZIP..." + msgid "Export Project..." msgstr "导出项目..." @@ -2993,9 +4417,37 @@ msgstr "管ç†å¯¼å‡ºæ¨¡æ¿" msgid "Export With Debug" msgstr "使用调试导出" +msgid "Path to FBX2glTF executable is empty." +msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶çš„路径为空。" + +msgid "Path to FBX2glTF executable is invalid." +msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶çš„è·¯å¾„æ— æ•ˆã€‚" + +msgid "Error executing this file (wrong version or architecture)." +msgstr "执行该文件时出错(版本或架构错误)。" + +msgid "FBX2glTF executable is valid." +msgstr "FBX2glTF å¯æ‰§è¡Œæ–‡ä»¶æœ‰æ•ˆã€‚" + +msgid "Configure FBX Importer" +msgstr "é…ç½® FBX 导入器" + +msgid "" +"FBX2glTF is required for importing FBX files.\n" +"Please download it and provide a valid path to the binary:" +msgstr "" +"导入 FBX æ–‡ä»¶éœ€è¦ FBX2glTF。\n" +"请下载它并æ供该å¯æ‰§è¡Œæ–‡ä»¶çš„有效路径:" + +msgid "Click this link to download FBX2glTF" +msgstr "点击æ¤é“¾æŽ¥ä¸‹è½½ FBX2glTF" + msgid "Browse" msgstr "æµè§ˆ" +msgid "Confirm Path" +msgstr "确认路径" + msgid "Favorites" msgstr "收è—" @@ -3018,6 +4470,12 @@ msgstr "移动出错:" msgid "Error duplicating:" msgstr "å¤åˆ¶å‡ºé”™ï¼š" +msgid "Failed to save resource at %s: %s" +msgstr "ä¿å˜ä½äºŽ %s 的资æºå¤±è´¥ï¼š%s" + +msgid "Failed to load resource at %s: %s" +msgstr "åŠ è½½ä½äºŽ %s 的资æºå¤±è´¥ï¼š%s" + msgid "Unable to update dependencies:" msgstr "æ— æ³•æ›´æ–°ä¾èµ–:" @@ -3069,6 +4527,9 @@ msgstr "新建继承场景" msgid "Set As Main Scene" msgstr "设为主场景" +msgid "Instantiate" +msgstr "实例化" + msgid "Add to Favorites" msgstr "æ·»åŠ åˆ°æ”¶è—" @@ -3084,6 +4545,21 @@ msgstr "查看所有者..." msgid "Move To..." msgstr "移动..." +msgid "Folder..." +msgstr "文件夹..." + +msgid "Scene..." +msgstr "场景..." + +msgid "Script..." +msgstr "脚本..." + +msgid "Resource..." +msgstr "资æº..." + +msgid "TextFile..." +msgstr "文本文件..." + msgid "New Scene..." msgstr "新建场景..." @@ -3093,6 +4569,12 @@ msgstr "新建脚本..." msgid "New Resource..." msgstr "新建资æº..." +msgid "New TextFile..." +msgstr "新建文本文件..." + +msgid "Sort Files" +msgstr "文件排åº" + msgid "Sort by Name (Ascending)" msgstr "按å称(å‡åºï¼‰" @@ -3111,18 +4593,33 @@ msgstr "按最近修改" msgid "Sort by First Modified" msgstr "按最早修改" +msgid "Copy UID" +msgstr "å¤åˆ¶ UID" + msgid "Duplicate..." msgstr "å¤åˆ¶ä¸º..." msgid "Rename..." msgstr "é‡å‘½å..." +msgid "Open in External Program" +msgstr "在外部程åºä¸æ‰“å¼€" + +msgid "Go to previous selected folder/file." +msgstr "转到之å‰é€‰å®šçš„文件夹/文件。" + +msgid "Go to next selected folder/file." +msgstr "转到下一个选定的文件夹/文件。" + msgid "Re-Scan Filesystem" msgstr "é‡æ–°æ‰«æ文件系统" msgid "Toggle Split Mode" msgstr "切æ¢æ‹†åˆ†æ¨¡å¼" +msgid "Filter Files" +msgstr "ç›é€‰æ–‡ä»¶" + msgid "" "Scanning Files,\n" "Please Wait..." @@ -3168,9 +4665,21 @@ msgstr "替æ¢..." msgid "Replace in Files" msgstr "在文件ä¸æ›¿æ¢" +msgid "Replace all (no undo)" +msgstr "全部替æ¢ï¼ˆæ— 法撤销)" + msgid "Searching..." msgstr "æœç´¢ä¸..." +msgid "%d match in %d file" +msgstr "%d 处匹é…,共 %d 个文件" + +msgid "%d matches in %d file" +msgstr "%d 处匹é…,共 %d 个文件" + +msgid "%d matches in %d files" +msgstr "%d 处匹é…,共 %d 个文件" + msgid "Add to Group" msgstr "æ·»åŠ åˆ°åˆ†ç»„" @@ -3207,12 +4716,172 @@ msgstr "分组编辑器" msgid "Manage Groups" msgstr "管ç†åˆ†ç»„" +msgid "The Beginning" +msgstr "开始" + +msgid "Global" +msgstr "全局" + +msgid "Audio Stream Importer: %s" +msgstr "音频æµå¯¼å…¥å™¨ï¼š%s" + msgid "Reimport" msgstr "é‡æ–°å¯¼å…¥" +msgid "Enable looping." +msgstr "å¯ç”¨å¾ªçŽ¯ã€‚" + msgid "Offset:" msgstr "å移:" +msgid "" +"Loop offset (from beginning). Note that if BPM is set, this setting will be " +"ignored." +msgstr "循环å移(相对于开头)。注æ„如果设置了 BPM,这个设置会被忽略。" + +msgid "Loop:" +msgstr "循环:" + +msgid "BPM:" +msgstr "BPM:" + +msgid "" +"Configure the Beats Per Measure (tempo) used for the interactive streams.\n" +"This is required in order to configure beat information." +msgstr "" +"é…置互动æµä½¿ç”¨çš„æ¯å°èŠ‚æ‹æ•°ï¼ˆèŠ‚å¥ï¼‰ã€‚\n" +"这是é…置节æ‹ä¿¡æ¯æ‰€å¿…需的。" + +msgid "Beat Count:" +msgstr "æ‹æ•°ï¼š" + +msgid "" +"Configure the amount of Beats used for music-aware looping. If zero, it will " +"be autodetected from the length.\n" +"It is recommended to set this value (either manually or by clicking on a " +"beat number in the preview) to ensure looping works properly." +msgstr "" +"é…置用于音ä¹æ„ŸçŸ¥å¾ªçŽ¯çš„æ‹æ•°ã€‚如果为零,它将从长度ä¸è‡ªåŠ¨æ£€æµ‹å‡ºæ¥ã€‚\n" +"建议设置这个值(手动或点击预览ä¸çš„æ‹æ•°ï¼‰ï¼Œä»¥ç¡®ä¿å¾ªçŽ¯å·¥ä½œæ£å¸¸ã€‚" + +msgid "Bar Beats:" +msgstr "节æ‹ï¼š" + +msgid "" +"Configure the Beats Per Bar. This used for music-aware transitions between " +"AudioStreams." +msgstr "é…ç½®æ¯å°èŠ‚çš„æ‹æ•°ã€‚这用于音频æµä¹‹é—´çš„音ä¹æ„ŸçŸ¥è¿‡æ¸¡ã€‚" + +msgid "Music Playback:" +msgstr "æ’放音ä¹ï¼š" + +msgid "New Configuration" +msgstr "新建é…ç½®" + +msgid "Remove Variation" +msgstr "移除å˜ä½“" + +msgid "" +"Warning: There are no configurations specified, no glyphs will be pre-" +"rendered." +msgstr "è¦å‘Šï¼šæ²¡æœ‰æŒ‡å®šé…置,没有å—形将被预渲染。" + +msgid "" +"Warning: Multiple configurations have identical settings. Duplicates will be " +"ignored." +msgstr "è¦å‘Šï¼šå¤šä¸ªé…置有相åŒçš„设置。é‡å¤çš„将被忽略。" + +msgid "" +"Note: LCD Subpixel antialiasing is selected, each of the glyphs will be pre-" +"rendered for all supported subpixel layouts (5x)." +msgstr "" +"注æ„:选ä¸äº† LCD 次åƒç´ 抗锯齿,æ¯ä¸ªå—形都会针对所有支æŒçš„次åƒç´ 布局进行预渲染" +"(5 å€ï¼‰ã€‚" + +msgid "" +"Note: Subpixel positioning is selected, each of the glyphs might be pre-" +"rendered for multiple subpixel offsets (up to 4x)." +msgstr "" +"注æ„:选ä¸äº†æ¬¡åƒç´ 定ä½ï¼Œæ¯ä¸ªå—形都å¯èƒ½é’ˆå¯¹å¤šç§æ¬¡åƒç´ å移进行渲染(最多 4 " +"å€ï¼‰ã€‚" + +msgid "Advanced Import Settings for '%s'" +msgstr "“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®" + +msgid "Rendering Options" +msgstr "渲染选项" + +msgid "Select font rendering options, fallback font, and metadata override:" +msgstr "选择å—体渲染选项ã€åŽå¤‡å—体和元数æ®è¦†ç›–:" + +msgid "Pre-render Configurations" +msgstr "预渲染é…ç½®" + +msgid "" +"Add font size, and variation coordinates, and select glyphs to pre-render:" +msgstr "æ·»åŠ å—体大å°å’Œå˜ä½“åæ ‡ï¼Œå¹¶é€‰æ‹©å—形进行预渲染:" + +msgid "Configuration:" +msgstr "é…置:" + +msgid "Add configuration" +msgstr "æ·»åŠ é…ç½®" + +msgid "Clear Glyph List" +msgstr "清空å—形列表" + +msgid "Glyphs from the Translations" +msgstr "翻译ä¸çš„å—å½¢" + +msgid "Select translations to add all required glyphs to pre-render list:" +msgstr "选择翻译以将所有必需的å—å½¢æ·»åŠ åˆ°é¢„æ¸²æŸ“åˆ—è¡¨ä¸ï¼š" + +msgid "Shape all Strings in the Translations and Add Glyphs" +msgstr "塑形翻译ä¸çš„所有å—ç¬¦ä¸²å¹¶æ·»åŠ å—å½¢" + +msgid "Glyphs from the Text" +msgstr "文本ä¸çš„å—å½¢" + +msgid "" +"Enter a text and select OpenType features to shape and add all required " +"glyphs to pre-render list:" +msgstr "" +"输入文本并选择 OpenType 功能æ¥å¡‘形,并将所有必需的å—å½¢æ·»åŠ åˆ°é¢„æ¸²æŸ“åˆ—è¡¨ä¸ï¼š" + +msgid "Shape Text and Add Glyphs" +msgstr "å¡‘å½¢æ–‡æœ¬å¹¶æ·»åŠ å—å½¢" + +msgid "Glyphs from the Character Map" +msgstr "å—ç¬¦æ˜ å°„è¡¨ä¸çš„å—å½¢" + +msgid "" +"Add or remove glyphs from the character map to pre-render list:\n" +"Note: Some stylistic alternatives and glyph variants do not have one-to-one " +"correspondence to character, and not shown in this map, use \"Glyphs from " +"the text\" tab to add these." +msgstr "" +"在å—ç¬¦æ˜ å°„è¡¨ä¸æ·»åŠ 或移除å—形到预渲染列表:\n" +"注æ„: æŸäº›æ ·å¼æ›¿ä»£é¡¹å’Œå—å½¢å˜ä½“与å—符没有一对一的对应关系,并且未在æ¤æ˜ 射表ä¸" +"显示,请使用“文本ä¸çš„å—å½¢â€é€‰é¡¹å¡æ·»åŠ 这些内容。" + +msgid "Dynamically rendered TrueType/OpenType font" +msgstr "动æ€æ¸²æŸ“çš„ TrueType/OpenType å—体" + +msgid "Prerendered multichannel(+true) signed distance field" +msgstr "预渲染的多通é“(+true)有符å·è·ç¦»åœº" + +msgid "Can't load font texture:" +msgstr "æ— æ³•åŠ è½½å—体纹ç†ï¼š" + +msgid "Image margin too big." +msgstr "图åƒè¾¹è·å¤ªå¤§ã€‚" + +msgid "Character margin too bit." +msgstr "å—符边è·å¤ªå°ã€‚" + +msgid "Pre-Import Scene" +msgstr "预导入场景" + msgid "Importing Scene..." msgstr "导入场景ä¸..." @@ -3231,28 +4900,165 @@ msgstr "导入åŽå¤„ç†è„šæœ¬æ— 效或已æŸå(请查看控制å°ï¼‰ï¼š" msgid "Error running post-import script:" msgstr "åŽå¤„ç†è„šæœ¬è¿è¡Œå‘生错误:" +msgid "Did you return a Node-derived object in the `_post_import()` method?" +msgstr "ä½ æ˜¯å¦åœ¨ `_post_import()` 方法ä¸è¿”回了一个 Node 派生对象?" + msgid "Saving..." msgstr "ä¿å˜ä¸..." msgid "" +"Error importing GLSL shader file: '%s'. Open the file in the filesystem dock " +"in order to see the reason." +msgstr "" +"在导入 GLSL ç€è‰²å™¨æ–‡ä»¶æ—¶å‡ºé”™ï¼šâ€œ%sâ€ã€‚在文件系统åœé é¢æ¿ä¸æ‰“开该文件,以便查看" +"åŽŸå› ã€‚" + +msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" "%s:检测到纹ç†è¢«ç”¨äºŽ 3D 法线贴图。æ£åœ¨å¯ç”¨çº¢ç»¿çº¹ç†åŽ‹ç¼©ï¼Œé™ä½Žå†…å˜ä½¿ç”¨ï¼ˆè“通é“" "被丢弃)。" +msgid "" +"%s: Texture detected as used as a roughness map in 3D. Enabling roughness " +"limiter based on the detected associated normal map at %s." +msgstr "" +"%s:检测到纹ç†è¢«ç”¨ä½œ 3D ç²—ç³™åº¦è´´å›¾ã€‚æ ¹æ®åœ¨ %s 处检测到的关è”法线贴图,å¯ç”¨ç²—" +"糙度é™åˆ¶å™¨ã€‚" + +msgid "" +"%s: Texture detected as used in 3D. Enabling mipmap generation and setting " +"the texture compression mode to %s." +msgstr "%s:检测到纹ç†è¢«ç”¨äºŽ 3D。å¯ç”¨ mipmap 生æˆå¹¶å°†çº¹ç†åŽ‹ç¼©æ¨¡å¼è®¾ç½®ä¸º %s。" + +msgid "2D/3D (Auto-Detect)" +msgstr "2D/3D(自动检测)" + msgid "2D" msgstr "2D" msgid "3D" msgstr "3D" +msgid "<Unnamed Material>" +msgstr "<未命åæè´¨>" + +msgid "Import ID: %s" +msgstr "导入 ID:%s" + +msgid "" +"Type: %s\n" +"Import ID: %s" +msgstr "" +"类型:%s\n" +"导入 ID:%s" + +msgid "Error opening scene" +msgstr "打开场景出错" + +msgid "Advanced Import Settings for AnimationLibrary '%s'" +msgstr "动画库“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®" + +msgid "Advanced Import Settings for Scene '%s'" +msgstr "场景“%sâ€é«˜çº§å¯¼å…¥è®¾ç½®" + +msgid "Select folder to extract material resources" +msgstr "选择文件夹以æå–æ质资æº" + +msgid "Select folder where mesh resources will save on import" +msgstr "选择导入时ä¿å˜ç½‘æ ¼èµ„æºçš„文件夹" + +msgid "Select folder where animations will save on import" +msgstr "选择导入时ä¿å˜åŠ¨ç”»çš„文件夹" + +msgid "Existing file with the same name will be replaced." +msgstr "å·²å˜åœ¨çš„åŒå文件将被替æ¢ã€‚" + +msgid "" +"This material already references an external file, no action will be taken.\n" +"Disable the external property for it to be extracted again." +msgstr "" +"该æ质已引用一个外部文件,故ä¸é‡‡å–任何æ“作。\n" +"ç¦ç”¨è¯¥å¤–部属性以å†æ¬¡æå–它。" + +msgid "" +"Material has no name nor any other way to identify on re-import.\n" +"Please name it or ensure it is exported with an unique ID." +msgstr "" +"æ质没有å称,也没有任何其他å¯åœ¨é‡æ–°å¯¼å…¥æ—¶è¯†åˆ«çš„æ–¹å¼ã€‚\n" +"请命å它或确ä¿å®ƒä½¿ç”¨å”¯ä¸€çš„ ID 导出。" + +msgid "Extract Materials to Resource Files" +msgstr "æå–æ质到资æºæ–‡ä»¶" + +msgid "Extract" +msgstr "æå–" + +msgid "" +"This mesh already saves to an external resource, no action will be taken." +msgstr "è¿™ä¸ªç½‘æ ¼å·²ç»ä¿å˜åˆ°ä¸€ä¸ªå¤–部资æºï¼Œæ•…ä¸é‡‡å–任何行动。" + +msgid "Existing file with the same name will be replaced on import." +msgstr "现有的åŒå文件将在导入时被替æ¢ã€‚" + +msgid "" +"Mesh has no name nor any other way to identify on re-import.\n" +"Please name it or ensure it is exported with an unique ID." +msgstr "" +"ç½‘æ ¼æ²¡æœ‰å称,也没有任何其他å¯åœ¨é‡æ–°å¯¼å…¥æ—¶è¯†åˆ«çš„æ–¹å¼ã€‚\n" +"请命å它或确ä¿å®ƒä½¿ç”¨å”¯ä¸€çš„ ID 导出。" + +msgid "Set paths to save meshes as resource files on Reimport" +msgstr "设置路径以在é‡æ–°å¯¼å…¥æ—¶å°†ç½‘æ ¼ä¿å˜ä¸ºèµ„æºæ–‡ä»¶" + +msgid "Set Paths" +msgstr "设置路径" + +msgid "" +"This animation already saves to an external resource, no action will be " +"taken." +msgstr "这个动画已ç»ä¿å˜åˆ°ä¸€ä¸ªå¤–部资æºï¼Œå°†ä¸é‡‡å–任何行动。" + +msgid "Set paths to save animations as resource files on Reimport" +msgstr "设置路径以在é‡æ–°å¯¼å…¥æ—¶å°†åŠ¨ç”»å¦å˜ä¸ºèµ„æºæ–‡ä»¶" + +msgid "Can't make material external to file, write error:" +msgstr "æ— æ³•å°†æè´¨ä¿å˜åˆ°å¤–部文件ä¸ï¼Œå†™å…¥é”™è¯¯ï¼š" + +msgid "Actions..." +msgstr "动作..." + +msgid "Extract Materials" +msgstr "æå–æè´¨" + +msgid "Set Animation Save Paths" +msgstr "设置动画ä¿å˜è·¯å¾„" + +msgid "Set Mesh Save Paths" +msgstr "è®¾ç½®ç½‘æ ¼ä¿å˜è·¯å¾„" + msgid "Meshes" msgstr "ç½‘æ ¼" msgid "Materials" msgstr "æè´¨" +msgid "Save Extension:" +msgstr "ä¿å˜æ‰©å±•å:" + +msgid "Text: *.tres" +msgstr "文本:*.tres" + +msgid "Binary: *.res" +msgstr "二进制:*.res" + +msgid "Text Resource" +msgstr "文本资æº" + +msgid "Binary Resource" +msgstr "二进制资æº" + msgid "Select Importer" msgstr "选择导入器" @@ -3287,6 +5093,9 @@ msgstr "导入为:" msgid "Preset" msgstr "预设" +msgid "Advanced..." +msgstr "高级..." + msgid "Save Scenes, Re-Import, and Restart" msgstr "ä¿å˜åœºæ™¯ã€é‡æ–°å¯¼å…¥ï¼Œç„¶åŽé‡å¯" @@ -3295,19 +5104,68 @@ msgstr "改å˜è¿™ä¸ªå¯¼å…¥çš„文件类型åŽéœ€è¦é‡å¯ç¼–辑器。" msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." -msgstr "è¦å‘Šï¼šå˜åœ¨ä½¿ç”¨æœ¬èµ„æºçš„ç´ æ,将会åœæ¢åŠ 载。" +msgstr "è¦å‘Šï¼šå˜åœ¨ä½¿ç”¨æœ¬èµ„æºçš„资产,将会åœæ¢åŠ 载。" msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "è¦è°ƒæ•´å¯¼å…¥è®¾ç½®ï¼Œè¯·åœ¨æ–‡ä»¶ç³»ç»Ÿæˆ–检查器ä¸é€‰ä¸èµ„æºæ–‡ä»¶ã€‚" +msgid "No Event Configured" +msgstr "未é…置事件" + +msgid "Keyboard Keys" +msgstr "键盘按键" + +msgid "Mouse Buttons" +msgstr "é¼ æ ‡æŒ‰é”®" + +msgid "Joypad Buttons" +msgstr "手柄按键" + +msgid "Joypad Axes" +msgstr "游æˆæ‰‹æŸ„è½´" + +msgid "Event Configuration" +msgstr "事件é…ç½®" + +msgid "Manual Selection" +msgstr "手动选择" + +msgid "Filter Inputs" +msgstr "ç›é€‰è¾“å…¥" + +msgid "Additional Options" +msgstr "é¢å¤–选项" + msgid "Device:" msgstr "设备:" +msgid "Command / Control (auto)" +msgstr "Command / Ctrl(自动)" + +msgid "" +"Automatically remaps between 'Meta' ('Command') and 'Control' depending on " +"current platform." +msgstr "æ ¹æ®å½“å‰å¹³å°ï¼Œåœ¨â€œMetaâ€ï¼ˆâ€œCommandâ€ï¼‰å’Œâ€œCtrlâ€ä¹‹é—´è‡ªåŠ¨é‡æ˜ 射。" + +msgid "" +"The following resources will be duplicated and embedded within this resource/" +"object." +msgstr "以下资æºå°†è¢«å¤åˆ¶å¹¶åµŒå…¥è¯¥èµ„æº/对象ä¸ã€‚" + +msgid "This object has no resources." +msgstr "这个对象没有资æºã€‚" + msgid "Failed to load resource." msgstr "åŠ è½½èµ„æºå¤±è´¥ã€‚" +msgid "(Current)" +msgstr "(当å‰ï¼‰" + +msgid "Expand Non-Default" +msgstr "展开éžé»˜è®¤é¡¹" + msgid "Property Name Style" msgstr "属性åç§°æ ·å¼" @@ -3356,15 +5214,27 @@ msgstr "å¤åˆ¶èµ„æº" msgid "Make Resource Built-In" msgstr "将资æºè½¬ä¸ºå†…ç½®" +msgid "Go to previous edited object in history." +msgstr "å‰å¾€åŽ†å²è®°å½•ä¸ä¸Šä¸€ä¸ªç¼–辑的对象。" + +msgid "Go to next edited object in history." +msgstr "å‰å¾€åŽ†å²è®°å½•ä¸ä¸‹ä¸€ä¸ªç¼–辑的对象。" + msgid "History of recently edited objects." msgstr "最近编辑历å²å¯¹è±¡ã€‚" msgid "Open documentation for this object." msgstr "打开该对象的文档。" +msgid "Filter Properties" +msgstr "ç›é€‰å±žæ€§" + msgid "Manage object properties." msgstr "管ç†å¯¹è±¡å±žæ€§ã€‚" +msgid "This cannot be undone. Are you sure?" +msgstr "这个æ“ä½œæ— æ³•æ’¤æ¶ˆã€‚ä½ ç¡®å®šå—?" + msgid "Add %d Translations" msgstr "æ·»åŠ %d 个翻译" @@ -3386,6 +5256,18 @@ msgstr "移除资æºé‡å®šå‘" msgid "Remove Resource Remap Option" msgstr "移除资æºé‡å®šå‘选项" +msgid "Add %d file(s) for POT generation" +msgstr "å‘ POT 生æˆä¸æ·»åŠ %d 个文件" + +msgid "Remove file from POT generation" +msgstr "从 POT 生æˆä¸ç§»é™¤æ–‡ä»¶" + +msgid "Removed" +msgstr "已移除" + +msgid "%s cannot be found." +msgstr "æ— æ³•æ‰¾åˆ° %s。" + msgid "Translations" msgstr "翻译" @@ -3404,9 +5286,36 @@ msgstr "按区域é‡å®šå‘:" msgid "Locale" msgstr "区域" +msgid "POT Generation" +msgstr "POT 生æˆ" + +msgid "Files with translation strings:" +msgstr "包å«å¯ç¿»è¯‘å—符串的文件:" + +msgid "Generate POT" +msgstr "ç”Ÿæˆ POT" + +msgid "Set %s on %d nodes" +msgstr "设置 %s å…± %d 个节点" + +msgid "%s (%d Selected)" +msgstr "%sï¼ˆé€‰ä¸ %d 个)" + msgid "Select a single node to edit its signals and groups." msgstr "选择一个节点以编辑其信å·å’Œåˆ†ç»„。" +msgid "Plugin name cannot be blank." +msgstr "æ’件å称ä¸èƒ½ä¸ºç©ºã€‚" + +msgid "Script extension must match chosen language extension (.%s)." +msgstr "脚本扩展å必须与所选è¯è¨€çš„扩展å一致(.%s)。" + +msgid "Subfolder name is not a valid folder name." +msgstr "å文件夹å称ä¸æ˜¯æœ‰æ•ˆçš„文件夹å。" + +msgid "Subfolder cannot be one which already exists." +msgstr "å文件夹ä¸èƒ½å·²å˜åœ¨ã€‚" + msgid "Edit a Plugin" msgstr "编辑æ’件" @@ -3476,9 +5385,15 @@ msgstr "åŠ è½½..." msgid "Move Node Point" msgstr "移动节点顶点" +msgid "Change BlendSpace1D Config" +msgstr "修改 BlendSpace1D é…ç½®" + msgid "Change BlendSpace1D Labels" msgstr "修改 BlendSpace1D æ ‡ç¾" +msgid "This type of node can't be used. Only animation nodes are allowed." +msgstr "æ¤ç±»åž‹çš„节点ä¸èƒ½è¢«ä½¿ç”¨ã€‚ä»…å…许使用动画节点。" + msgid "This type of node can't be used. Only root nodes are allowed." msgstr "æ¤ç±»åž‹çš„节点ä¸èƒ½è¢«ä½¿ç”¨ã€‚ä»…å…è®¸ä½¿ç”¨æ ¹èŠ‚ç‚¹ã€‚" @@ -3508,7 +5423,13 @@ msgid "Select and move points, create points with RMB." msgstr "é€‰æ‹©å¹¶ç§»åŠ¨ç‚¹ï¼Œä½¿ç”¨é¼ æ ‡å³é”®åˆ›å»ºç‚¹ã€‚" msgid "Enable snap and show grid." -msgstr "å¯ç”¨å¸é™„å¹¶æ˜¾ç¤ºç½‘æ ¼ã€‚" +msgstr "å¯ç”¨å¸é™„å¹¶æ˜¾ç¤ºæ …æ ¼ã€‚" + +msgid "Sync:" +msgstr "åŒæ¥ï¼š" + +msgid "Blend:" +msgstr "æ··åˆï¼š" msgid "Point" msgstr "点" @@ -3525,6 +5446,9 @@ msgstr "三角形已ç»å˜åœ¨ã€‚" msgid "Add Triangle" msgstr "æ·»åŠ ä¸‰è§’å½¢" +msgid "Change BlendSpace2D Config" +msgstr "修改 BlendSpace2D é…ç½®" + msgid "Change BlendSpace2D Labels" msgstr "修改 BlendSpace2D æ ‡ç¾" @@ -3541,7 +5465,7 @@ msgid "No triangles exist, so no blending can take place." msgstr "ä¸å˜åœ¨ä»»ä½•ä¸‰è§’å½¢ï¼Œå› æ¤ä¸ä¼šæœ‰ä»»ä½•æ··æ•ˆæžœåˆäº§ç”Ÿã€‚" msgid "Toggle Auto Triangles" -msgstr "打开ï¼å…³é—自动三角形" +msgstr "开关自动三角形" msgid "Create triangles by connecting points." msgstr "通过连接点æ¥åˆ›å»ºä¸‰è§’形。" @@ -3552,14 +5476,11 @@ msgstr "擦除点和三角形。" msgid "Generate blend triangles automatically (instead of manually)" msgstr "自动生æˆæ··åˆä¸‰è§’形(而éžæ‰‹åŠ¨ï¼‰" -msgid "Blend:" -msgstr "æ··åˆï¼š" - msgid "Parameter Changed:" msgstr "修改å‚数:" -msgid "Edit Filters" -msgstr "编辑ç›é€‰å™¨" +msgid "Inspect Filters" +msgstr "查看ç›é€‰å™¨" msgid "Output node can't be added to the blend tree." msgstr "输出节点ä¸èƒ½è¢«æ·»åŠ 到混åˆæ ‘。" @@ -3614,6 +5535,9 @@ msgstr "音频剪辑" msgid "Functions" msgstr "函数" +msgid "Inspect Filtered Tracks:" +msgstr "查看轨é“过滤器:" + msgid "Edit Filtered Tracks:" msgstr "编辑轨é“过滤器:" @@ -3626,23 +5550,172 @@ msgstr "æ·»åŠ èŠ‚ç‚¹..." msgid "Enable Filtering" msgstr "å¯ç”¨ç›é€‰" +msgid "Library Name:" +msgstr "库å称:" + +msgid "Animation name can't be empty." +msgstr "动画å称ä¸èƒ½ä¸ºç©ºã€‚" + +msgid "Animation name contains invalid characters: '/', ':', ',' or '['." +msgstr "动画å称ä¸å˜åœ¨æ— 效å—符:“/â€ã€â€œ:â€ã€â€œ,â€æˆ–“[â€ã€‚" + +msgid "Animation with the same name already exists." +msgstr "å·²å˜åœ¨åŒå动画。" + +msgid "Enter a library name." +msgstr "输入库å称。" + +msgid "Library name contains invalid characters: '/', ':', ',' or '['." +msgstr "库å称包å«æ— 效å—符:“/â€ã€â€œ:â€ã€â€œ,â€æˆ–“[â€ã€‚" + +msgid "Library with the same name already exists." +msgstr "å·²å˜åœ¨åŒå库。" + +msgid "Animation name is valid." +msgstr "动画å称有效。" + +msgid "Global library will be created." +msgstr "全局库将被创建。" + +msgid "Library name is valid." +msgstr "库å称有效。" + +msgid "Add Animation to Library: %s" +msgstr "æ·»åŠ åŠ¨ç”»åˆ°åº“ï¼š%s" + +msgid "Add Animation Library: %s" +msgstr "æ·»åŠ åŠ¨ç”»åº“ï¼š%s" + msgid "Load Animation" msgstr "åŠ è½½åŠ¨ç”»" +msgid "" +"This animation library can't be saved because it does not belong to the " +"edited scene. Make it unique first." +msgstr "æ— æ³•ä¿å˜æ¤åŠ¨ç”»åº“ï¼Œå› ä¸ºå®ƒä¸å±žäºŽç¼–辑的场景。请先唯一化æ¤èµ„æºã€‚" + +msgid "" +"This animation library can't be saved because it was imported from another " +"file. Make it unique first." +msgstr "æ— æ³•ä¿å˜æ¤åŠ¨ç”»åº“ï¼Œå› ä¸ºå®ƒæ˜¯ä»Žå¦ä¸€ä¸ªæ–‡ä»¶å¯¼å…¥çš„。请先唯一化它。" + +msgid "Save Library" +msgstr "ä¿å˜åº“" + +msgid "Make Animation Library Unique: %s" +msgstr "使动画库唯一:%s" + +msgid "" +"This animation can't be saved because it does not belong to the edited " +"scene. Make it unique first." +msgstr "æ— æ³•ä¿å˜æ¤åŠ¨ç”»ï¼Œå› 为它ä¸å±žäºŽå·²ç¼–辑的场景。请先唯一化。" + +msgid "" +"This animation can't be saved because it was imported from another file. " +"Make it unique first." +msgstr "æ— æ³•ä¿å˜æ¤åŠ¨ç”»ï¼Œå› 为它是从å¦ä¸€ä¸ªæ–‡ä»¶å¯¼å…¥çš„。请先唯一化。" + +msgid "Save Animation" +msgstr "ä¿å˜åŠ¨ç”»" + +msgid "Make Animation Unique: %s" +msgstr "使动画唯一:%s" + +msgid "Invalid AnimationLibrary file." +msgstr "æ— æ•ˆçš„ AnimationLibrary 文件。" + +msgid "This library is already added to the player." +msgstr "这个库已ç»è¢«æ·»åŠ 到æ’放器ä¸ã€‚" + +msgid "Invalid Animation file." +msgstr "æ— æ•ˆçš„åŠ¨ç”»æ–‡ä»¶ã€‚" + +msgid "This animation is already added to the library." +msgstr "这个动画已ç»è¢«æ·»åŠ 到库ä¸ã€‚" + +msgid "Load Animation into Library: %s" +msgstr "å°†åŠ¨ç”»åŠ è½½åˆ°åº“ä¸ï¼š%s" + +msgid "Save Animation library to File: %s" +msgstr "ä¿å˜åŠ¨ç”»åº“到文件:%s" + +msgid "Save Animation to File: %s" +msgstr "ä¿å˜åŠ¨ç”»åˆ°æ–‡ä»¶ï¼š%s" + +msgid "Rename Animation Library: %s" +msgstr "é‡å‘½å动画库:%s" + +msgid "[Global]" +msgstr "[全局]" + +msgid "Rename Animation: %s" +msgstr "é‡å‘½å动画:%s" + msgid "Animation Name:" msgstr "动画å称:" +msgid "No animation resource in clipboard!" +msgstr "剪贴æ¿ä¸æ²¡æœ‰åŠ¨ç”»èµ„æºï¼" + msgid "Pasted Animation" msgstr "已粘贴的动画" msgid "Open in Inspector" msgstr "在检查器ä¸æ‰“å¼€" +msgid "Remove Animation Library: %s" +msgstr "移除动画库:%s" + +msgid "Remove Animation from Library: %s" +msgstr "从库ä¸ç§»é™¤åŠ¨ç”»ï¼š%s" + +msgid "[built-in]" +msgstr "[内置]" + +msgid "[foreign]" +msgstr "[外部]" + +msgid "[imported]" +msgstr "[已导入]" + +msgid "Add Animation to Library" +msgstr "æ·»åŠ åŠ¨ç”»åˆ°åº“" + +msgid "Load animation from file and add to library" +msgstr "从文件ä¸åŠ è½½åŠ¨ç”»å¹¶æ·»åŠ åˆ°åº“ä¸" + +msgid "Paste Animation to Library from clipboard" +msgstr "将动画从剪贴æ¿ç²˜è´´åˆ°åº“ä¸" + +msgid "Save animation library to resource on disk" +msgstr "将动画库ä¿å˜ä¸ºç£ç›˜ä¸Šçš„资æº" + +msgid "Remove animation library" +msgstr "移除动画库" + +msgid "Copy animation to clipboard" +msgstr "将动画å¤åˆ¶åˆ°å‰ªè´´æ¿" + +msgid "Save animation to resource on disk" +msgstr "将动画ä¿å˜ä¸ºç£ç›˜ä¸Šçš„资æº" + +msgid "Remove animation from Library" +msgstr "从库ä¸ç§»é™¤åŠ¨ç”»" + +msgid "Edit Animation Libraries" +msgstr "编辑动画库" + +msgid "Add Library" +msgstr "æ·»åŠ åº“" + +msgid "Load Library" +msgstr "åŠ è½½åº“" + msgid "Storage" msgstr "å˜å‚¨" msgid "Toggle Autoplay" -msgstr "打开ï¼å…³é—自动æ’放" +msgstr "开关自动æ’放" msgid "Create New Animation" msgstr "创建新动画" @@ -3656,12 +5729,18 @@ msgstr "é‡å‘½å动画" msgid "Change Animation Name:" msgstr "修改动画å称:" +msgid "Delete Animation '%s'?" +msgstr "是å¦åˆ 除动画“%sâ€ï¼Ÿ" + msgid "Remove Animation" msgstr "移除动画" msgid "Invalid animation name!" msgstr "æ— æ•ˆçš„åŠ¨ç”»å称ï¼" +msgid "Animation '%s' already exists!" +msgstr "动画“%sâ€å·²å˜åœ¨ï¼" + msgid "Duplicate Animation" msgstr "å¤åˆ¶åŠ¨ç”»" @@ -3671,15 +5750,18 @@ msgstr "æ··åˆä¸‹ä¸€æ¥å˜æ›´" msgid "Change Blend Time" msgstr "修改混åˆæ—¶é—´" +msgid "[Global] (create)" +msgstr "[全局](创建)" + +msgid "Duplicated Animation Name:" +msgstr "é‡å¤çš„动画å称:" + msgid "Play selected animation backwards from current pos. (A)" msgstr "从当å‰ä½ç½®å€’放选ä¸åŠ¨ç”»ï¼ˆA)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "从结æŸæ—¶é—´å€’放选ä¸åŠ¨ç”»ï¼ˆShift+A)" -msgid "Stop animation playback. (S)" -msgstr "åœæ¢åŠ¨ç”»æ’放。(S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "从头æ’放选ä¸åŠ¨ç”»ï¼ˆShift+D)" @@ -3698,6 +5780,9 @@ msgstr "动画工具" msgid "Animation" msgstr "动画" +msgid "Manage Animations..." +msgstr "管ç†åŠ¨ç”»..." + msgid "Edit Transitions..." msgstr "编辑过渡方å¼..." @@ -3743,6 +5828,9 @@ msgstr "强制用白色调和" msgid "Include Gizmos (3D)" msgstr "包括å°å·¥å…·ï¼ˆ3D)" +msgid "Onion Skinning temporarily disabled due to rendering bug." +msgstr "洋葱皮由于渲染错误而暂时ç¦ç”¨ã€‚" + msgid "Pin AnimationPlayer" msgstr "固定 AnimationPlayer" @@ -3767,6 +5855,9 @@ msgstr "过渡已å˜åœ¨ï¼" msgid "To" msgstr "终点" +msgid "Add Node and Transition" +msgstr "æ·»åŠ èŠ‚ç‚¹å’Œè¿‡æ¸¡" + msgid "Add Transition" msgstr "æ·»åŠ è¿‡æ¸¡" @@ -3794,6 +5885,17 @@ msgstr "节点已移除" msgid "Transition Removed" msgstr "过渡已移除" +msgid "" +"Select and move nodes.\n" +"RMB: Add node at position clicked.\n" +"Shift+LMB+Drag: Connects the selected node with another node or creates a " +"new node if you select an area without nodes." +msgstr "" +"选择和移动节点。\n" +"å³é”®ï¼šåœ¨ç‚¹å‡»çš„ä½ç½®æ·»åŠ 节点。\n" +"Shift+左键+拖动:将选定节点与å¦ä¸€ä¸ªèŠ‚ç‚¹è¿žæŽ¥ï¼Œå¦‚æžœä½ é€‰æ‹©ä¸€ä¸ªæ²¡æœ‰èŠ‚ç‚¹çš„åŒºåŸŸï¼Œåˆ™" +"创建一个新节点。" + msgid "Create new nodes." msgstr "创建新节点。" @@ -3803,18 +5905,27 @@ msgstr "连接节点。" msgid "Group Selected Node(s)" msgstr "编组所选节点" +msgid "Ungroup Selected Node" +msgstr "å–消选定节点的分组" + msgid "Remove selected node or transition." msgstr "移除选ä¸çš„节点或过渡动画。" msgid "Transition:" msgstr "过渡:" +msgid "New Transitions Should Auto Advance" +msgstr "新的过渡应当自动推进" + msgid "Play Mode:" msgstr "æ’放模å¼ï¼š" msgid "Delete Selected" msgstr "åˆ é™¤é€‰ä¸é¡¹" +msgid "Delete All" +msgstr "å…¨éƒ¨åˆ é™¤" + msgid "Root" msgstr "æ ¹" @@ -3888,7 +5999,10 @@ msgid "Failed SHA-256 hash check" msgstr "SHA-256 å“ˆå¸Œå€¼æ ¡éªŒå¤±è´¥" msgid "Asset Download Error:" -msgstr "ç´ æ下载出错:" +msgstr "资产下载出错:" + +msgid "Ready to install!" +msgstr "准备安装ï¼" msgid "Downloading (%s / %s)..." msgstr "ä¸‹è½½ä¸ (%s / %s)..." @@ -3960,6 +6074,23 @@ msgstr "末页" msgid "All" msgstr "全部" +msgid "No results for \"%s\" for support level(s): %s." +msgstr "没有找到结果“%sâ€åœ¨æ”¯æŒçš„级别ä¸ï¼š%s。" + +msgid "" +"No results compatible with %s %s for support level(s): %s.\n" +"Check the enabled support levels using the 'Support' button in the top-right " +"corner." +msgstr "" +"支æŒçº§åˆ« %s ä¸æ²¡æœ‰ä¸Ž %s %s 兼容的结果。\n" +"请检查å³ä¸Šè§’“支æŒâ€æŒ‰é’®æ‰€å¯ç”¨çš„支æŒçº§åˆ«ã€‚" + +msgid "Search Templates, Projects, and Demos" +msgstr "æœç´¢æ¨¡æ¿ã€é¡¹ç›®å’Œæ¼”示" + +msgid "Search Assets (Excluding Templates, Projects, and Demos)" +msgstr "æœç´¢èµ„产(ä¸åŒ…å«æ¨¡æ¿ã€é¡¹ç›®å’Œæ¼”示)" + msgid "Import..." msgstr "导入..." @@ -3982,11 +6113,17 @@ msgid "Failed to get repository configuration." msgstr "获å–仓库é…置失败。" msgid "Assets ZIP File" -msgstr "ç´ æ ZIP 文件" +msgstr "资产 ZIP 文件" msgid "Audio Preview Play/Pause" msgstr "音频预览æ’放/æš‚åœ" +msgid "Bone Picker:" +msgstr "骨骼拾å–器:" + +msgid "Clear mappings in current group." +msgstr "清除当å‰ç»„ä¸çš„æ˜ å°„ã€‚" + msgid "Preview" msgstr "预览" @@ -3994,10 +6131,10 @@ msgid "Configure Snap" msgstr "设置å¸é™„" msgid "Grid Offset:" -msgstr "ç½‘æ ¼å移:" +msgstr "æ …æ ¼å移:" msgid "Grid Step:" -msgstr "ç½‘æ ¼æ¥é•¿ï¼š" +msgstr "æ …æ ¼æ¥é•¿ï¼š" msgid "Primary Line Every:" msgstr "主线间隔:" @@ -4014,6 +6151,9 @@ msgstr "旋转æ¥é•¿ï¼š" msgid "Scale Step:" msgstr "缩放æ¥é•¿ï¼š" +msgid "Move Node(s) to Position" +msgstr "移动节点到ä½ç½®" + msgid "Move Vertical Guide" msgstr "移动垂直å‚考线" @@ -4074,6 +6214,27 @@ msgstr "已分组" msgid "Add Node Here" msgstr "在æ¤å¤„æ·»åŠ èŠ‚ç‚¹" +msgid "Instantiate Scene Here" +msgstr "在æ¤å¤„实例化场景" + +msgid "Paste Node(s) Here" +msgstr "在æ¤å¤„粘贴节点" + +msgid "Move Node(s) Here" +msgstr "移动节点到æ¤å¤„" + +msgid "px" +msgstr "px" + +msgid "units" +msgstr "å•ä½" + +msgid "Moving:" +msgstr "移动:" + +msgid "Rotating:" +msgstr "旋转:" + msgid "Scaling:" msgstr "缩放:" @@ -4110,6 +6271,9 @@ msgstr "粘贴姿势" msgid "Clear Guides" msgstr "清除å‚考线" +msgid "Create Custom Bone2D(s) from Node(s)" +msgstr "从节点创建自定义 Bone2D" + msgid "Zoom to 3.125%" msgstr "缩放至 3.125%" @@ -4173,12 +6337,19 @@ msgstr "缩放模å¼" msgid "Shift: Scale proportionally." msgstr "Shift:按比例缩放。" +msgid "Show list of selectable nodes at position clicked." +msgstr "在点击的ä½ç½®æ˜¾ç¤ºå¯é€‰æ‹©çš„节点列表。" + msgid "Click to change object's rotation pivot." msgstr "点击更改对象的旋转轴心。" msgid "Pan Mode" msgstr "平移模å¼" +msgid "" +"You can also use Pan View shortcut (Space by default) to pan in any mode." +msgstr "您还å¯ä»¥ä½¿ç”¨å¹³ç§»è§†å›¾å¿«æ·é”®ï¼ˆé»˜è®¤ä¸ºç©ºæ ¼ï¼‰åœ¨ä»»ä½•æ¨¡å¼ä¸‹å¹³ç§»ã€‚" + msgid "Ruler Mode" msgstr "æ ‡å°ºæ¨¡å¼" @@ -4189,10 +6360,10 @@ msgid "Use Smart Snap" msgstr "使用智能å¸é™„" msgid "Toggle grid snapping." -msgstr "å¼€å…³ç½‘æ ¼å¸é™„。" +msgstr "å¼€å…³æ …æ ¼å¸é™„。" msgid "Use Grid Snap" -msgstr "ä½¿ç”¨ç½‘æ ¼å¸é™„" +msgstr "ä½¿ç”¨æ …æ ¼å¸é™„" msgid "Snapping Options" msgstr "å¸é™„选项" @@ -4233,12 +6404,24 @@ msgstr "å¸é™„到其他节点" msgid "Snap to Guides" msgstr "å¸é™„到å‚考线" +msgid "Lock selected node, preventing selection and movement." +msgstr "é”定选定的节点,防æ¢é€‰æ‹©å’Œç§»åŠ¨ã€‚" + msgid "Lock Selected Node(s)" msgstr "é”定所选节点" +msgid "Unlock selected node, allowing selection and movement." +msgstr "解é”选定的节点,å…许选择和移动。" + msgid "Unlock Selected Node(s)" msgstr "解é”所选节点" +msgid "Make selected node's children not selectable." +msgstr "使所选节点的å节点ä¸å¯é€‰æ‹©ã€‚" + +msgid "Make selected node's children selectable." +msgstr "使所选节点的å节点å¯é€‰ã€‚" + msgid "Ungroup Selected Node(s)" msgstr "解组所选节点" @@ -4248,6 +6431,9 @@ msgstr "骨架选项" msgid "Show Bones" msgstr "显示骨骼" +msgid "Make Bone2D Node(s) from Node(s)" +msgstr "从节点创建 Bone2D 节点" + msgid "View" msgstr "视图" @@ -4261,10 +6447,10 @@ msgid "Hide" msgstr "éšè—" msgid "Toggle Grid" -msgstr "切æ¢ç½‘æ ¼" +msgstr "切æ¢æ …æ ¼" msgid "Grid" -msgstr "ç½‘æ ¼" +msgstr "æ …æ ¼" msgid "Show Helpers" msgstr "显示辅助信æ¯" @@ -4284,6 +6470,9 @@ msgstr "显示视å£" msgid "Show Group And Lock Icons" msgstr "显示分组和é”å®šå›¾æ ‡" +msgid "Show Transformation Gizmos" +msgstr "显示å˜æ¢å°å·¥å…·" + msgid "Center Selection" msgstr "å±…ä¸æ˜¾ç¤ºæ‰€é€‰é¡¹" @@ -4331,29 +6520,85 @@ msgid "Clear Pose" msgstr "清除姿势" msgid "Multiply grid step by 2" -msgstr "ç½‘æ ¼æ¥è¿›ä¹˜ä»¥ 2" +msgstr "æ …æ ¼æ¥è¿›ä¹˜ä»¥ 2" msgid "Divide grid step by 2" -msgstr "ç½‘æ ¼æ¥è¿›é™¤ä»¥ 2" +msgstr "æ …æ ¼æ¥è¿›é™¤ä»¥ 2" msgid "Adding %s..." msgstr "æ£åœ¨æ·»åŠ %s..." +msgid "Drag and drop to add as child of current scene's root node." +msgstr "æ‹–æ”¾ä»¥æ·»åŠ ä¸ºå½“å‰åœºæ™¯æ ¹èŠ‚点的å节点。" + +msgid "Hold Ctrl when dropping to add as child of selected node." +msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Ctrl ä»¥æ·»åŠ ä¸ºæ‰€é€‰èŠ‚ç‚¹çš„å节点。" + +msgid "Hold Shift when dropping to add as sibling of selected node." +msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Shift ä»¥æ·»åŠ ä¸ºæ‰€é€‰èŠ‚ç‚¹çš„åŒçº§èŠ‚点。" + +msgid "Hold Alt when dropping to add as a different node type." +msgstr "æ”¾ä¸‹æ—¶æŒ‰ä½ Alt ä»¥æ·»åŠ ä¸ºä¸åŒçš„节点类型。" + msgid "Cannot instantiate multiple nodes without root." msgstr "æ²¡æœ‰æ ¹èŠ‚ç‚¹æ— æ³•å®žä¾‹åŒ–å¤šä¸ªèŠ‚ç‚¹ã€‚" msgid "Create Node" msgstr "创建节点" +msgid "Error instantiating scene from %s" +msgstr "从 %s 实例化场景时出错" + msgid "Change Default Type" msgstr "修改默认类型" +msgid "Set target_position" +msgstr "设置 target_position" + msgid "Set Handle" msgstr "设置处ç†ç¨‹åº" +msgid "This node doesn't have a control parent." +msgstr "这个节点没有父控件。" + +msgid "" +"Use the appropriate layout properties depending on where you are going to " +"put it." +msgstr "æ ¹æ®è¦æ”¾ç½®çš„ä½ç½®ä½¿ç”¨é€‚当的布局属性。" + +msgid "This node is a child of a container." +msgstr "这个节点是容器的å节点。" + +msgid "Use container properties for positioning." +msgstr "使用容器属性进行定ä½ã€‚" + +msgid "This node is a child of a regular control." +msgstr "这个节点是普通控件的å节点。" + +msgid "Use anchors and the rectangle for positioning." +msgstr "使用锚点和矩形进行定ä½ã€‚" + +msgid "Collapse positioning hint." +msgstr "折å 定ä½æ示。" + +msgid "Expand positioning hint." +msgstr "展开定ä½æ示。" + +msgid "Container Default" +msgstr "容器默认" + msgid "Fill" msgstr "å¡«å……" +msgid "Shrink Begin" +msgstr "始端收缩" + +msgid "Shrink Center" +msgstr "å±…ä¸æ”¶ç¼©" + +msgid "Shrink End" +msgstr "末端收缩" + msgid "Custom" msgstr "自定义" @@ -4408,9 +6653,63 @@ msgstr "å³ä¾§å…¨å¹…" msgid "Full Rect" msgstr "整个矩形" +msgid "" +"Enable to also set the Expand flag.\n" +"Disable to only set Shrink/Fill flags." +msgstr "" +"å¯ç”¨ï¼ŒåŒæ—¶è®¾ç½®æ‰©å±•æ ‡å¿—。\n" +"ç¦ç”¨ï¼Œåªè®¾ç½®æ”¶ç¼©/å¡«å……æ ‡å¿—ã€‚" + +msgid "Some parents of the selected nodes do not support the Expand flag." +msgstr "所选节点的æŸäº›çˆ¶èŠ‚点ä¸æ”¯æŒæ‰©å±•æ ‡å¿—。" + +msgid "Align with Expand" +msgstr "对é½å±•å¼€" + +msgid "Change Anchors, Offsets, Grow Direction" +msgstr "更改锚点ã€å移ã€å¢žé•¿æ–¹å‘" + +msgid "Change Anchors, Offsets (Keep Ratio)" +msgstr "改å˜é”šç‚¹ã€å移é‡ï¼ˆä¿æŒæ¯”例)" + +msgid "Change Vertical Size Flags" +msgstr "更改垂直大å°æ ‡å¿—" + +msgid "Change Horizontal Size Flags" +msgstr "更改水平大å°æ ‡å¿—" + +msgid "Presets for the anchor and offset values of a Control node." +msgstr "控制节点的锚点和å移值的预设。" + +msgid "Anchor preset" +msgstr "锚点预设" + +msgid "Set to Current Ratio" +msgstr "设为当å‰æ¯”例" + +msgid "Adjust anchors and offsets to match the current rect size." +msgstr "调整锚点和å移é‡ä»¥åŒ¹é…当å‰çš„矩形尺寸。" + +msgid "" +"When active, moving Control nodes changes their anchors instead of their " +"offsets." +msgstr "激活åŽï¼Œç§»åŠ¨ Control 节点会更改å˜é”šç‚¹ï¼Œè€Œéžè¾¹è·ã€‚" + +msgid "Sizing settings for children of a Container node." +msgstr "Container 节点的å节点的大å°è®¾ç½®ã€‚" + +msgid "Horizontal alignment" +msgstr "水平对é½" + +msgid "Vertical alignment" +msgstr "垂直对é½" + msgid "Load Emission Mask" msgstr "åŠ è½½å‘å°„é®ç½©" +msgid "CPUParticles2D" +msgstr "CPUParticles2D" + msgid "Generated Point Count:" msgstr "生æˆé¡¶ç‚¹è®¡æ•°ï¼š" @@ -4432,6 +6731,9 @@ msgstr "从åƒç´ æ•èŽ·" msgid "Emission Colors" msgstr "å‘射色彩" +msgid "CPUParticles3D" +msgstr "CPUParticles3D" + msgid "Create Emission Points From Node" msgstr "从节点创建å‘射点" @@ -4518,8 +6820,8 @@ msgid "" msgstr "" "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œä¸€é”®éƒ¨ç½²åˆ° Android 时所导出的å¯æ‰§è¡Œæ–‡ä»¶å°†ä¸åŒ…å«é¡¹ç›®æ•°æ®ã€‚\n" "文件系统将由编辑器基于项目通过网络æ供。\n" -"在 Android å¹³å°ï¼Œéƒ¨ç½²å°†é€šè¿‡ USB 线缆进行以æ高性能。如果项目ä¸åŒ…å«è¾ƒå¤§çš„ç´ " -"æ,该选项å¯æ高测试速度。" +"在 Android å¹³å°ï¼Œéƒ¨ç½²å°†é€šè¿‡ USB 线缆进行以æ高性能。如果项目ä¸åŒ…å«è¾ƒå¤§çš„资" +"产,该选项å¯æ高测试速度。" msgid "Visible Collision Shapes" msgstr "显示碰撞区域" @@ -4529,6 +6831,14 @@ msgid "" "3D) will be visible in the running project." msgstr "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œç¢°æ’žåŒºåŸŸå’Œå…‰çº¿æŠ•å°„节点(2D å’Œ 3D)将在项目è¿è¡Œæ—¶å¯è§ã€‚" +msgid "Visible Paths" +msgstr "显示路径" + +msgid "" +"When this option is enabled, curve resources used by path nodes will be " +"visible in the running project." +msgstr "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œè·¯å¾„节点的曲线资æºå°†åœ¨é¡¹ç›®è¿è¡Œæ—¶å¯è§ã€‚" + msgid "Visible Navigation" msgstr "显示导航" @@ -4561,15 +6871,61 @@ msgstr "" "å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œä»»ä½•ä¿å˜çš„脚本都会被æ£åœ¨è¿è¡Œçš„项目é‡æ–°åŠ 载。\n" "当使用于远程设备时,å¯ç”¨ç½‘络文件系统能æ高编辑效率。" +msgid "Keep Debug Server Open" +msgstr "调试æœåŠ¡å™¨ä¿æŒå¼€æ”¾" + +msgid "" +"When this option is enabled, the editor debug server will stay open and " +"listen for new sessions started outside of the editor itself." +msgstr "" +"å¯ç”¨è¯¥é€‰é¡¹æ—¶ï¼Œç¼–辑器的调试æœåŠ¡å™¨å°†ä¿æŒå¼€æ”¾ï¼Œç›‘å¬åœ¨ç¼–辑器本身之外开始的新会" +"è¯ã€‚" + +msgid "Run Multiple Instances" +msgstr "è¿è¡Œå¤šä¸ªå®žä¾‹" + +msgid "Overrides (%d)" +msgstr "覆盖(%d)" + +msgid "Add Locale" +msgstr "æ·»åŠ åŒºåŸŸ" + +msgid "Variation Coordinates (%d)" +msgstr "å˜ä½“åæ ‡ï¼ˆ%d)" + +msgid "No supported features" +msgstr "ä¸æ”¯æŒçš„特性" + +msgid "Features (%d of %d set)" +msgstr "功能(%d / %d)" + +msgid "Add Feature" +msgstr "æ·»åŠ ç‰¹æ€§" + +msgid " - Variation" +msgstr " - å˜ä½“" + +msgid "Unable to preview font" +msgstr "æ— æ³•é¢„è§ˆå—体" + msgid "Convert to CPUParticles2D" msgstr "转æ¢ä¸º CPUParticles2D" +msgid "Generating Visibility Rect (Waiting for Particle Simulation)" +msgstr "æ£åœ¨ç”Ÿæˆå¯è§†çŸ©å½¢ï¼ˆç‰å¾…ç²’å模拟)" + msgid "Generate Visibility Rect" -msgstr "生æˆå¯è§†åŒ–区域" +msgstr "生æˆå¯è§†çŸ©å½¢" + +msgid "Can only set point into a ParticleProcessMaterial process material" +msgstr "åªå¯è®¾ä¸ºæŒ‡å‘ ParticleProcessMaterial 处ç†æè´¨" msgid "Clear Emission Mask" msgstr "清除å‘å°„é®ç½©" +msgid "GPUParticles2D" +msgstr "GPUParticles2D" + msgid "Generation Time (sec):" msgstr "生æˆæ—¶é—´ï¼ˆç§’):" @@ -4579,6 +6935,9 @@ msgstr "å‡ ä½•ï¼ˆé¢ï¼‰ä¸åŒ…å«ä»»ä½•åŒºåŸŸã€‚" msgid "The geometry doesn't contain any faces." msgstr "å‡ ä½•ä½“ä¸åŒ…å«ä»»ä½•é¢ã€‚" +msgid "\"%s\" doesn't inherit from Node3D." +msgstr "“%sâ€æœªç»§æ‰¿ Node3D。" + msgid "\"%s\" doesn't contain geometry." msgstr "“%s†ä¸åŒ…å«å‡ 何体。" @@ -4603,12 +6962,62 @@ msgstr "体积" msgid "Emission Source:" msgstr "å‘å°„æºï¼š" +msgid "A processor material of type 'ParticleProcessMaterial' is required." +msgstr "需è¦â€œParticleProcessMaterialâ€ç±»åž‹çš„处ç†æ质。" + +msgid "Convert to CPUParticles3D" +msgstr "转æ¢ä¸º CPUParticles3D" + +msgid "Generating Visibility AABB (Waiting for Particle Simulation)" +msgstr "æ£åœ¨ç”Ÿæˆå¯è§ AABB(ç‰å¾…ç²’å模拟)" + msgid "Generate Visibility AABB" -msgstr "生æˆå¯è§çš„ AABB" +msgstr "生æˆå¯è§ AABB" + +msgid "GPUParticles3D" +msgstr "GPUParticles3D" + +msgid "Generate AABB" +msgstr "ç”Ÿæˆ AABB" + +msgid "Low" +msgstr "低" + +msgid "Moderate" +msgstr "ä¸" + +msgid "High" +msgstr "高" + +msgid "Subdivisions: %s" +msgstr "细分:%s" + +msgid "Cell size: %s" +msgstr "å•å…ƒæ ¼å¤§å°ï¼š%s" + +msgid "Video RAM size: %s MB (%s)" +msgstr "显å˜å¤§å°ï¼š%s MB(%s)" + +msgid "Bake SDF" +msgstr "烘焙 SDF" + +msgid "" +"No faces detected during GPUParticlesCollisionSDF3D bake.\n" +"Check whether there are visible meshes matching the bake mask within its " +"extents." +msgstr "" +"烘焙 GPUParticlesCollisionSDF3D 时没有检测到é¢ã€‚\n" +"请检查是å¦æœ‰ç¬¦åˆçƒ˜ç„™æŽ©ç çš„å¯è§ç½‘æ ¼åœ¨å…¶èŒƒå›´å†…ã€‚" + +msgid "Select path for SDF Texture" +msgstr "为 SDF 纹ç†é€‰æ‹©è·¯å¾„" msgid "Gradient Edited" msgstr "编辑æ¸å˜" +msgid "Reverse/mirror gradient." +msgstr "å转/é•œåƒæ¸å˜ã€‚" + msgid "Swap GradientTexture2D Fill Points" msgstr "äº¤æ¢ GradientTexture2D 填充点" @@ -4616,7 +7025,10 @@ msgid "Swap Gradient Fill Points" msgstr "äº¤æ¢ Gradient 填充点" msgid "Toggle Grid Snap" -msgstr "切æ¢ç½‘æ ¼å¸é™„" +msgstr "切æ¢æ …æ ¼å¸é™„" + +msgid "Configure" +msgstr "é…ç½®" msgid "Create Occluder Polygon" msgstr "创建é®å…‰å¤šè¾¹å½¢" @@ -4629,9 +7041,21 @@ msgstr "" "请先ä¿å˜åœºæ™¯ï¼ˆå…‰ç…§è´´å›¾å°†è¢«å˜åœ¨åŒä¸€ç›®å½•ä¸‹ï¼‰æˆ–从属性é¢æ¿ä¸æ‰‹åŠ¨ä¿å˜ " "BakedLightmap 属性。" +msgid "" +"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake " +"Light' flag is on." +msgstr "" +"没有å¯çƒ˜ç„™çš„ç½‘æ ¼ã€‚è¯·ç¡®ä¿ç½‘æ ¼åŒ…å« UV2 通é“,并且“Bake Lightâ€é€‰é¡¹å·²å¯ç”¨ã€‚" + msgid "Failed creating lightmap images, make sure path is writable." msgstr "创建光照贴图失败,切确ä¿æ–‡ä»¶æ˜¯å¯å†™çš„。" +msgid "No editor scene root found." +msgstr "æ²¡æœ‰æ‰¾åˆ°ç¼–è¾‘å™¨åœºæ™¯æ ¹èŠ‚ç‚¹ã€‚" + +msgid "Lightmap data is not local to the scene." +msgstr "光照图数æ®æœªè®¾ç½®æœ¬åœ°äºŽåœºæ™¯ã€‚" + msgid "Bake Lightmaps" msgstr "烘焙光照贴图" @@ -4680,18 +7104,52 @@ msgstr "创建多个凸形状" msgid "Create Navigation Mesh" msgstr "åˆ›å»ºå¯¼èˆªç½‘æ ¼" +msgid "Create Debug Tangents" +msgstr "创建调试切线" + msgid "Contained Mesh is not of type ArrayMesh." msgstr "包å«çš„ Mesh ä¸æ˜¯ ArrayMesh 类型。" +msgid "" +"Mesh cannot unwrap UVs because it does not belong to the edited scene. Make " +"it unique first." +msgstr "ç½‘æ ¼æ— æ³•å±•å¼€ UVï¼Œå› ä¸ºå®ƒä¸å±žäºŽè¢«ç¼–辑的场景。请先将其唯一化。" + +msgid "" +"Mesh cannot unwrap UVs because it belongs to another resource which was " +"imported from another file type. Make it unique first." +msgstr "" +"ç½‘æ ¼æ— æ³•å±•å¼€ UVï¼Œå› ä¸ºå®ƒéš¶å±žäºŽä»Žå…¶ä»–æ–‡ä»¶ç±»åž‹å¯¼å…¥çš„å¦ä¸€ä¸ªèµ„æºã€‚请先将其唯一化。" + +msgid "" +"Mesh cannot unwrap UVs because it was imported from another file type. Make " +"it unique first." +msgstr "ç½‘æ ¼æ— æ³•å±•å¼€ UVï¼Œå› ä¸ºå®ƒæ˜¯ä»Žå…¶ä»–æ–‡ä»¶ç±»åž‹å¯¼å…¥çš„ã€‚è¯·å…ˆå°†å…¶å”¯ä¸€åŒ–ã€‚" + msgid "UV Unwrap failed, mesh may not be manifold?" msgstr "UV 展开失败,å¯èƒ½è¯¥ç½‘æ ¼å¹¶éžæµå½¢ï¼Ÿ" +msgid "Unwrap UV2" +msgstr "展开 UV2" + msgid "No mesh to debug." msgstr "没有å¯è°ƒè¯•çš„ç½‘æ ¼ã€‚" msgid "Mesh has no UV in layer %d." msgstr "ç½‘æ ¼åœ¨å±‚ %d 上没有 UV。" +msgid "MeshInstance3D lacks a Mesh." +msgstr "MeshInstance3D ç¼ºå°‘ç½‘æ ¼ã€‚" + +msgid "Mesh has no surface to create outlines from." +msgstr "ç½‘æ ¼æ²¡æœ‰å¯ç”¨æ¥åˆ›å»ºè½®å»“的表é¢ã€‚" + +msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES." +msgstr "ç½‘æ ¼çš„å›¾å…ƒç±»åž‹ä¸æ˜¯ PRIMITIVE_TRIANGLES。" + +msgid "Could not create outline." +msgstr "æ— æ³•åˆ›å»ºè½®å»“ã€‚" + msgid "Create Outline" msgstr "创建轮廓" @@ -4701,6 +7159,14 @@ msgstr "ç½‘æ ¼" msgid "Create Trimesh Static Body" msgstr "åˆ›å»ºä¸‰è§’ç½‘æ ¼é™æ€å®žä½“" +msgid "" +"Creates a StaticBody3D and assigns a polygon-based collision shape to it " +"automatically.\n" +"This is the most accurate (but slowest) option for collision detection." +msgstr "" +"创建 StaticBody3D 并自动为其分é…基于多边形的碰撞形状。\n" +"这是最准确(但是最慢)的碰撞检测手段。" + msgid "Create Trimesh Collision Sibling" msgstr "åˆ›å»ºä¸‰è§’ç½‘æ ¼ç¢°æ’žåŒçº§" @@ -4746,6 +7212,15 @@ msgstr "" msgid "Create Outline Mesh..." msgstr "åˆ›å»ºè½®å»“ç½‘æ ¼..." +msgid "" +"Creates a static outline mesh. The outline mesh will have its normals " +"flipped automatically.\n" +"This can be used instead of the StandardMaterial Grow property when using " +"that property isn't possible." +msgstr "" +"创建一个é™æ€è½®å»“ç½‘æ ¼ã€‚è½®å»“ç½‘æ ¼ä¼šè‡ªåŠ¨ç¿»è½¬æ³•çº¿ã€‚\n" +"å¯ä»¥ç”¨æ¥åœ¨å¿…è¦æ—¶ä»£æ›¿ StandardMaterial çš„ Grow 属性。" + msgid "View UV1" msgstr "查看 UV1" @@ -4807,6 +7282,9 @@ msgstr "æœªæŒ‡å®šç½‘æ ¼æºï¼ˆä¸” MultiMesh ä¸åŒ…å« Mesh)。" msgid "Mesh source is invalid (invalid path)." msgstr "ç½‘æ ¼æºæ— æ•ˆï¼ˆè·¯å¾„æ— æ•ˆï¼‰ã€‚" +msgid "Mesh source is invalid (not a MeshInstance3D)." +msgstr "ç½‘æ ¼æºæ— 效(ä¸æ˜¯ MeshInstance3D)。" + msgid "Mesh source is invalid (contains no Mesh resource)." msgstr "ç½‘æ ¼æºæ— 效(ä¸åŒ…å« Mesh 资æºï¼‰ã€‚" @@ -4888,17 +7366,17 @@ msgstr "修改摄åƒæœºå°ºå¯¸" msgid "Change Sphere Shape Radius" msgstr "修改çƒä½“åŠå¾„" +msgid "Change Box Shape Size" +msgstr "修改立方体大å°" + msgid "Change Notifier AABB" msgstr "修改通知器 AABB" msgid "Change Particles AABB" msgstr "修改粒å AABB" -msgid "Change Box Shape Extents" -msgstr "修改立方体大å°" - -msgid "Change Probe Extents" -msgstr "修改探针范围" +msgid "Change Radius" +msgstr "修改åŠå¾„" msgid "Change Capsule Shape Radius" msgstr "修改胶囊体åŠå¾„" @@ -4912,8 +7390,17 @@ msgstr "修改圆柱体åŠå¾„" msgid "Change Cylinder Shape Height" msgstr "修改圆柱体高度" +msgid "Change Separation Ray Shape Length" +msgstr "修改分离射线形状长度" + +msgid "Start Location" +msgstr "开始ä½ç½®" + +msgid "End Location" +msgstr "结æŸä½ç½®" + msgid "Transform Aborted." -msgstr "已忽略å˜æ¢ã€‚" +msgstr "å˜æ¢ä¸æ¢ã€‚" msgid "Orthogonal" msgstr "æ£äº¤" @@ -4972,12 +7459,51 @@ msgstr "Z è½´å˜æ¢ã€‚" msgid "View Plane Transform." msgstr "视图平é¢å˜æ¢ã€‚" +msgid "YZ-Plane Transform." +msgstr "YZ å¹³é¢å˜æ¢ã€‚" + +msgid "XZ-Plane Transform." +msgstr "XZ å¹³é¢å˜æ¢ã€‚" + +msgid "XY-Plane Transform." +msgstr "XY å¹³é¢å˜æ¢ã€‚" + msgid "Keying is disabled (no key inserted)." msgstr "å·²ç¦ç”¨å…³é”®å¸§æ’入(未æ’入关键帧)。" msgid "Animation Key Inserted." msgstr "æ’入动画键。" +msgid "X: %s\n" +msgstr "X:%s\n" + +msgid "Y: %s\n" +msgstr "Y:%s\n" + +msgid "Z: %s\n" +msgstr "Z:%s\n" + +msgid "Size: %s (%.1fMP)\n" +msgstr "大å°ï¼š%s(%.1fMP)\n" + +msgid "Objects: %d\n" +msgstr "对象数:%d\n" + +msgid "Primitive Indices: %d\n" +msgstr "图元索引:%d\n" + +msgid "Draw Calls: %d" +msgstr "绘制调用:%d" + +msgid "CPU Time: %s ms" +msgstr "CPU 时间:%s ms" + +msgid "GPU Time: %s ms" +msgstr "GPU 时间:%s ms" + +msgid "FPS: %d" +msgstr "FPS:%d" + msgid "Top View." msgstr "顶视图。" @@ -5002,6 +7528,15 @@ msgstr "å°†å˜æ¢ä¸Žè§†å›¾å¯¹é½" msgid "Align Rotation with View" msgstr "将旋转与视图对é½" +msgid "Set Surface %d Override Material" +msgstr "è®¾ç½®è¡¨é¢ %d 覆盖æè´¨" + +msgid "Set Material Override" +msgstr "设置æ质覆盖" + +msgid "Cannot drag and drop into multiple selected nodes." +msgstr "ä¸èƒ½æ‹–放到多个选定的节点。" + msgid "None" msgstr "æ— " @@ -5032,15 +7567,78 @@ msgstr "显示线框" msgid "Display Overdraw" msgstr "显示é‡å¤ç»˜åˆ¶" +msgid "Display Lighting" +msgstr "显示光照" + msgid "Display Unshaded" msgstr "æ˜¾ç¤ºæ— é˜´å½±" +msgid "Directional Shadow Splits" +msgstr "æ–¹å‘阴影拆分" + +msgid "Normal Buffer" +msgstr "法线缓冲" + msgid "Shadow Atlas" msgstr "阴影图集" +msgid "Directional Shadow Map" +msgstr "æ–¹å‘阴影图" + +msgid "Decal Atlas" +msgstr "贴花图集" + +msgid "VoxelGI Lighting" +msgstr "VoxelGI 光照" + +msgid "VoxelGI Albedo" +msgstr "VoxelGI å照率" + +msgid "VoxelGI Emission" +msgstr "VoxelGI 自å‘å…‰" + +msgid "SDFGI Cascades" +msgstr "SDFGI 层å " + +msgid "SDFGI Probes" +msgstr "SDFGI 探针" + +msgid "Scene Luminance" +msgstr "场景亮度" + msgid "SSAO" msgstr "SSAO" +msgid "SSIL" +msgstr "SSIL" + +msgid "VoxelGI/SDFGI Buffer" +msgstr "VoxelGI/SDFGI 缓冲区" + +msgid "Disable Mesh LOD" +msgstr "ç¦ç”¨ç½‘æ ¼ LOD" + +msgid "OmniLight3D Cluster" +msgstr "OmniLight3D 集群" + +msgid "SpotLight3D Cluster" +msgstr "SpotLight3D 集群" + +msgid "Decal Cluster" +msgstr "贴花集群" + +msgid "ReflectionProbe Cluster" +msgstr "å射探针集群" + +msgid "Occlusion Culling Buffer" +msgstr "é®æŒ¡å‰”除缓冲" + +msgid "Motion Vectors" +msgstr "è¿åŠ¨å‘é‡" + +msgid "Display Advanced..." +msgstr "显示高级..." + msgid "View Environment" msgstr "查看环境" @@ -5050,6 +7648,9 @@ msgstr "查看å°å·¥å…·" msgid "View Information" msgstr "查看信æ¯" +msgid "View Frame Time" +msgstr "查看帧时间" + msgid "Half Resolution" msgstr "åŠåˆ†è¾¨çŽ‡" @@ -5062,6 +7663,9 @@ msgstr "å¯ç”¨å¤šæ™®å‹’效应" msgid "Cinematic Preview" msgstr "效果预览" +msgid "Not available when using the OpenGL renderer." +msgstr "使用 OpenGL 渲染器时ä¸å¯ç”¨ã€‚" + msgid "Freelook Left" msgstr "自由观看å‘å·¦" @@ -5086,6 +7690,36 @@ msgstr "è‡ªç”±è§‚çœ‹åŠ é€Ÿè°ƒæ•´" msgid "Freelook Slow Modifier" msgstr "自由观看å‡é€Ÿè°ƒæ•´" +msgid "Lock Transformation to X axis" +msgstr "å°†å˜æ¢é”定至 X è½´" + +msgid "Lock Transformation to Y axis" +msgstr "å°†å˜æ¢é”定至 Y è½´" + +msgid "Lock Transformation to Z axis" +msgstr "å°†å˜æ¢é”定至 Z è½´" + +msgid "Lock Transformation to YZ plane" +msgstr "å°†å˜æ¢é”定至 YZ å¹³é¢" + +msgid "Lock Transformation to XZ plane" +msgstr "å°†å˜æ¢é”定至 XZ å¹³é¢" + +msgid "Lock Transformation to XY plane" +msgstr "å°†å˜æ¢é”定至 XY å¹³é¢" + +msgid "Cancel Transformation" +msgstr "å–消å˜æ¢" + +msgid "Begin Translate Transformation" +msgstr "开始平移å˜æ¢" + +msgid "Begin Rotate Transformation" +msgstr "开始旋转å˜æ¢" + +msgid "Begin Scale Transformation" +msgstr "开始缩放å˜æ¢" + msgid "Toggle Camera Preview" msgstr "开关摄åƒæœºé¢„览" @@ -5096,6 +7730,16 @@ msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" msgstr "修改相机的è£å‰ªå¹³é¢åŽæ‰èƒ½è¿›ä¸€æ¥ç¼©æ”¾ï¼ˆè§†å›¾ -> 设置...)" +msgid "Overriding material..." +msgstr "覆盖æè´¨..." + +msgid "" +"Drag and drop to override the material of any geometry node.\n" +"Hold Ctrl when dropping to override a specific surface." +msgstr "" +"拖放以覆盖任æ„å‡ ä½•ä½“èŠ‚ç‚¹çš„æ质。\n" +"æ”¾ä¸‹æ—¶æŒ‰ä½ Ctrl 键,å¯ä»¥è¦†ç›–一个特定的é¢ã€‚" + msgid "XForm Dialog" msgstr "å˜æ¢å¯¹è¯æ¡†" @@ -5118,12 +7762,58 @@ msgstr "将节点å¸é™„至地é¢" msgid "Couldn't find a solid floor to snap the selection to." msgstr "找ä¸åˆ°å¯å¸é™„çš„åšå®žåœ°æ¿ã€‚" +msgid "Add Preview Sun to Scene" +msgstr "æ·»åŠ é¢„è§ˆå¤ªé˜³è‡³åœºæ™¯" + +msgid "Add Preview Environment to Scene" +msgstr "æ·»åŠ é¢„è§ˆçŽ¯å¢ƒè‡³åœºæ™¯" + +msgid "" +"Scene contains\n" +"DirectionalLight3D.\n" +"Preview disabled." +msgstr "" +"场景包å«\n" +"DirectionalLight3D。\n" +"预览已ç¦ç”¨ã€‚" + +msgid "Preview disabled." +msgstr "预览已ç¦ç”¨ã€‚" + +msgid "" +"Scene contains\n" +"WorldEnvironment.\n" +"Preview disabled." +msgstr "" +"场景包å«\n" +"WorldEnvironment。\n" +"预览已ç¦ç”¨ã€‚" + msgid "Use Local Space" msgstr "使用本地空间" msgid "Use Snap" msgstr "使用å¸é™„" +msgid "" +"Toggle preview sunlight.\n" +"If a DirectionalLight3D node is added to the scene, preview sunlight is " +"disabled." +msgstr "" +"切æ¢é¢„览阳光。\n" +"如果一个 DirectionalLight3D èŠ‚ç‚¹è¢«æ·»åŠ åˆ°åœºæ™¯ä¸ï¼Œé¢„览阳光将被ç¦ç”¨ã€‚" + +msgid "" +"Toggle preview environment.\n" +"If a WorldEnvironment node is added to the scene, preview environment is " +"disabled." +msgstr "" +"切æ¢é¢„览环境。\n" +"如果一个 WorldEnvironment èŠ‚ç‚¹è¢«æ·»åŠ åˆ°åœºæ™¯ä¸ï¼Œé¢„览环境将被ç¦ç”¨ã€‚" + +msgid "Edit Sun and Environment settings." +msgstr "编辑太阳和环境设置。" + msgid "Bottom View" msgstr "底视图" @@ -5215,7 +7905,7 @@ msgid "View Origin" msgstr "显示原点" msgid "View Grid" -msgstr "æ˜¾ç¤ºç½‘æ ¼" +msgstr "æ˜¾ç¤ºæ …æ ¼" msgid "Settings..." msgstr "设置..." @@ -5265,15 +7955,102 @@ msgstr "å‰ç½®" msgid "Post" msgstr "åŽç½®" +msgid "Preview Sun" +msgstr "预览太阳" + +msgid "Sun Direction" +msgstr "太阳方å‘" + +msgid "Angular Altitude" +msgstr "高度角" + +msgid "Azimuth" +msgstr "æ–¹ä½è§’" + msgid "Sun Color" msgstr "太阳颜色" +msgid "Sun Energy" +msgstr "太阳能é‡" + +msgid "Shadow Max Distance" +msgstr "阴影最大è·ç¦»" + +msgid "Add Sun to Scene" +msgstr "å°†å¤ªé˜³æ·»åŠ åˆ°åœºæ™¯" + +msgid "" +"Adds a DirectionalLight3D node matching the preview sun settings to the " +"current scene.\n" +"Hold Shift while clicking to also add the preview environment to the current " +"scene." +msgstr "" +"在当å‰åœºæ™¯ä¸æ·»åŠ 一个匹é…预览太阳设置的 DirectionalLight3D 节点。\n" +"ç‚¹å‡»æ—¶æŒ‰ä½ Shift 键,也å¯ä»¥å°†é¢„è§ˆçŽ¯å¢ƒæ·»åŠ åˆ°å½“å‰åœºæ™¯ä¸ã€‚" + +msgid "Preview Environment" +msgstr "预览环境" + +msgid "Sky Color" +msgstr "天空颜色" + +msgid "Ground Color" +msgstr "地é¢é¢œè‰²" + +msgid "Sky Energy" +msgstr "天空能é‡" + +msgid "AO" +msgstr "环境光é®è”½" + msgid "Glow" msgstr "辉光" msgid "Tonemap" msgstr "è‰²è°ƒæ˜ å°„" +msgid "GI" +msgstr "全局光" + +msgid "Post Process" +msgstr "åŽæœŸå¤„ç†" + +msgid "Add Environment to Scene" +msgstr "å°†çŽ¯å¢ƒæ·»åŠ åˆ°åœºæ™¯" + +msgid "" +"Adds a WorldEnvironment node matching the preview environment settings to " +"the current scene.\n" +"Hold Shift while clicking to also add the preview sun to the current scene." +msgstr "" +"在当å‰åœºæ™¯ä¸æ·»åŠ 一个匹é…预览环境设置的 WorldEnvironment 节点。\n" +"点击时按ä½Shift键,也å¯ä»¥å°†é¢„è§ˆå¤ªé˜³æ·»åŠ åˆ°å½“å‰åœºæ™¯ä¸ã€‚" + +msgid "" +"Can't determine a save path for the occluder.\n" +"Save your scene and try again." +msgstr "" +"æ— æ³•ç¡®å®šé®æŒ¡å™¨çš„ä¿å˜è·¯å¾„。\n" +"请ä¿å˜åœºæ™¯ï¼Œç„¶åŽé‡è¯•ã€‚" + +msgid "" +"No meshes to bake.\n" +"Make sure there is at least one MeshInstance3D node in the scene whose " +"visual layers are part of the OccluderInstance3D's Bake Mask property." +msgstr "" +"没有è¦çƒ˜ç„™çš„ç½‘æ ¼ã€‚\n" +"ç¡®ä¿åœºæ™¯ä¸è‡³å°‘有一个 MeshInstance3D 节点,其å¯è§†å±‚是 OccluderInstance3D 的烘" +"焙掩ç 属性的一部分。" + +msgid "Could not save the new occluder at the specified path:" +msgstr "æ— æ³•åœ¨æŒ‡å®šè·¯å¾„ä¸Šä¿å˜è¯¥æ–°é®æŒ¡å™¨ï¼š" + +msgid "Bake Occluders" +msgstr "烘焙é®æŒ¡å™¨" + +msgid "Select occluder bake file:" +msgstr "选择é®æŒ¡å™¨çƒ˜ç„™æ–‡ä»¶ï¼š" + msgid "Remove Point from Curve" msgstr "从曲线ä¸ç§»é™¤é¡¶ç‚¹" @@ -5476,7 +8253,7 @@ msgid "Clear UV" msgstr "清除 UV" msgid "Grid Settings" -msgstr "ç½‘æ ¼è®¾ç½®" +msgstr "æ …æ ¼è®¾ç½®" msgid "Snap" msgstr "å¸é™„" @@ -5485,22 +8262,22 @@ msgid "Enable Snap" msgstr "å¯ç”¨å¸é™„" msgid "Show Grid" -msgstr "æ˜¾ç¤ºç½‘æ ¼" +msgstr "æ˜¾ç¤ºæ …æ ¼" msgid "Configure Grid:" -msgstr "é…ç½®ç½‘æ ¼ï¼š" +msgstr "é…ç½®æ …æ ¼ï¼š" msgid "Grid Offset X:" -msgstr "ç½‘æ ¼ X å移:" +msgstr "æ …æ ¼ X å移:" msgid "Grid Offset Y:" -msgstr "ç½‘æ ¼ Y å移:" +msgstr "æ …æ ¼ Y å移:" msgid "Grid Step X:" -msgstr "ç½‘æ ¼ X æ¥è¿›ï¼š" +msgstr "æ …æ ¼ X æ¥è¿›ï¼š" msgid "Grid Step Y:" -msgstr "ç½‘æ ¼ Y æ¥è¿›ï¼š" +msgstr "æ …æ ¼ Y æ¥è¿›ï¼š" msgid "Sync Bones to Polygon" msgstr "åŒæ¥éª¨éª¼åˆ°å¤šè¾¹å½¢" @@ -5583,6 +8360,12 @@ msgstr "æ— æ³•åœ¨ä»¥ä¸‹ä½ç½®åŠ 载文件:" msgid "Save File As..." msgstr "å¦å˜ä¸º..." +msgid "Can't obtain the script for reloading." +msgstr "æ— æ³•èŽ·å–用于é‡æ–°åŠ 载的脚本。" + +msgid "Reload only takes effect on tool scripts." +msgstr "é‡æ–°åŠ è½½åªå¯¹å·¥å…·è„šæœ¬ç”Ÿæ•ˆã€‚" + msgid "Can't obtain the script for running." msgstr "æ— æ³•èŽ·å–è¦æ‰§è¡Œçš„脚本。" @@ -5608,6 +8391,9 @@ msgstr "ä¿å˜å‡ºé”™" msgid "Save Theme As..." msgstr "主题å¦å˜ä¸º..." +msgid "Unsaved file." +msgstr "未ä¿å˜çš„文件。" + msgid "%s Class Reference" msgstr "%s ç±»å‚考" @@ -5617,6 +8403,9 @@ msgstr "查找下一个" msgid "Find Previous" msgstr "查找上一个" +msgid "Filter Scripts" +msgstr "ç›é€‰è„šæœ¬" + msgid "Toggle alphabetical sorting of the method list." msgstr "切æ¢æŒ‰å—æ¯é¡ºåºæŽ’列方法。" @@ -5641,6 +8430,9 @@ msgstr "é‡æ–°æ‰“开关é—的脚本" msgid "Save All" msgstr "全部ä¿å˜" +msgid "Soft Reload Tool Script" +msgstr "软é‡è½½å·¥å…·è„šæœ¬" + msgid "Copy Script Path" msgstr "å¤åˆ¶è„šæœ¬è·¯å¾„" @@ -5708,12 +8500,21 @@ msgstr "清除最近的脚本" msgid "Standard" msgstr "æ ‡å‡†" +msgid "Plain Text" +msgstr "纯文本" + msgid "Connections to method:" msgstr "与方法的连接:" +msgid "Source" +msgstr "æ¥æº" + msgid "Target" msgstr "ç›®æ ‡" +msgid "Error at (%d, %d):" +msgstr "(%d, %d) 处的错误:" + msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." msgstr "未找到方法 “%sâ€ï¼ˆè¿žæŽ¥äºŽä¿¡å·â€œ%sâ€ã€æ¥è‡ªèŠ‚点“%sâ€ã€ç›®æ ‡èŠ‚点“%sâ€ï¼‰ã€‚" @@ -5730,6 +8531,9 @@ msgstr "转到函数" msgid "Only resources from filesystem can be dropped." msgstr "åªå¯æ‹–放æ¥è‡ªæ–‡ä»¶ç³»ç»Ÿä¸çš„资æºã€‚" +msgid "Can't drop nodes without an open scene." +msgstr "æ²¡æœ‰æ‰“å¼€çš„åœºæ™¯æ— æ³•æ”¾ç½®èŠ‚ç‚¹ã€‚" + msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "æ— æ³•æ”¾ç½®è¯¥èŠ‚ç‚¹ï¼Œå› ä¸ºè„šæœ¬ “%s†未在该场景ä¸ä½¿ç”¨ã€‚" @@ -5739,6 +8543,12 @@ msgstr "查找符å·" msgid "Pick Color" msgstr "拾å–颜色" +msgid "Folding" +msgstr "折å " + +msgid "Indentation" +msgstr "缩进" + msgid "Uppercase" msgstr "大写" @@ -5763,11 +8573,14 @@ msgstr "转到" msgid "Delete Line" msgstr "åˆ é™¤è¡Œ" +msgid "Unindent" +msgstr "å–消缩进" + msgid "Toggle Comment" msgstr "切æ¢æ³¨é‡Š" msgid "Fold/Unfold Line" -msgstr "折å ï¼å±•å¼€è¡Œ" +msgstr "折å /展开行" msgid "Fold All Lines" msgstr "折å 所有行" @@ -5818,7 +8631,7 @@ msgid "Go to Line..." msgstr "转到行..." msgid "Toggle Breakpoint" -msgstr "设置ï¼ç§»é™¤æ–点" +msgstr "设置/移除æ–点" msgid "Remove All Breakpoints" msgstr "移除所有æ–点" @@ -5829,6 +8642,46 @@ msgstr "转到下一个æ–点" msgid "Go to Previous Breakpoint" msgstr "转到上一个æ–点" +msgid "New Shader Include" +msgstr "新建ç€è‰²å™¨å¤´æ–‡ä»¶" + +msgid "Load Shader File" +msgstr "åŠ è½½ç€è‰²å™¨æ–‡ä»¶" + +msgid "Load Shader Include File" +msgstr "åŠ è½½ç€è‰²å™¨å¤´æ–‡ä»¶" + +msgid "Save File" +msgstr "ä¿å˜" + +msgid "Save File As" +msgstr "å¦å˜ä¸º" + +msgid "Open File in Inspector" +msgstr "在检查器ä¸æ‰“å¼€" + +msgid "Close File" +msgstr "å…³é—" + +msgid "Shader Editor" +msgstr "ç€è‰²å™¨ç¼–辑器" + +msgid "No valid shader stages found." +msgstr "没有找到有效的ç€è‰²å™¨é˜¶æ®µã€‚" + +msgid "Shader stage compiled without errors." +msgstr "ç€è‰²å™¨é˜¶æ®µå·²å®Œæˆç¼–译,没有出错。" + +msgid "" +"File structure for '%s' contains unrecoverable errors:\n" +"\n" +msgstr "" +"“%sâ€çš„文件结构包å«æ— 法æ¢å¤çš„错误:\n" +"\n" + +msgid "ShaderFile" +msgstr "ç€è‰²å™¨æ–‡ä»¶" + msgid "This skeleton has no bones, create some children Bone2D nodes." msgstr "该骨架没有骨骼,请创建一些 Bone2D å节点。" @@ -5847,12 +8700,76 @@ msgstr "é‡ç½®ä¸ºæ”¾æ¾å§¿åŠ¿" msgid "Overwrite Rest Pose" msgstr "覆盖放æ¾å§¿åŠ¿" +msgid "Set Bone Transform" +msgstr "设置骨骼å˜æ¢" + +msgid "Set Bone Rest" +msgstr "设置骨骼放æ¾" + +msgid "Cannot create a physical skeleton for a Skeleton3D node with no bones." +msgstr "æ— æ³•ä¸ºæ²¡æœ‰éª¨éª¼çš„ Skeleton3D 节点创建物ç†éª¨æž¶ã€‚" + msgid "Create physical bones" msgstr "创建物ç†éª¨éª¼" +msgid "Cannot export a SkeletonProfile for a Skeleton3D node with no bones." +msgstr "æ— æ³•ä¸ºæ²¡æœ‰éª¨éª¼çš„ Skeleton3D 节点导出 SkeletonProfile。" + +msgid "Export Skeleton Profile As..." +msgstr "将骨架é…置文件导出为..." + +msgid "Set Bone Parentage" +msgstr "设置骨骼父å关系" + +msgid "Skeleton3D" +msgstr "Skeleton3D" + +msgid "Reset All Bone Poses" +msgstr "é‡ç½®æ‰€æœ‰éª¨éª¼å§¿åŠ¿" + +msgid "Reset Selected Poses" +msgstr "é‡ç½®æ‰€é€‰å§¿åŠ¿" + +msgid "Apply All Poses to Rests" +msgstr "将所有姿势应用于放æ¾" + +msgid "Apply Selected Poses to Rests" +msgstr "将所选姿势应用于放æ¾" + +msgid "Create Physical Skeleton" +msgstr "创建物ç†éª¨æž¶" + +msgid "Export Skeleton Profile" +msgstr "导出骨架é…置文件" + +msgid "" +"Edit Mode\n" +"Show buttons on joints." +msgstr "" +"编辑模å¼\n" +"在关节处显示按钮。" + +msgid "Insert key of bone poses already exist track." +msgstr "æ’入已å˜åœ¨è½¨é“的骨骼姿势关键帧。" + +msgid "Insert key of all bone poses." +msgstr "æ’入所有骨骼姿势关键帧。" + +msgid "Insert Key (All Bones)" +msgstr "æ’入关键帧(所有骨骼)" + +msgid "Bone Transform" +msgstr "骨骼å˜æ¢" + msgid "Play IK" msgstr "æ’放 IK" +msgid "Create MeshInstance2D" +msgstr "创建 MeshInstance2D" + +msgid "MeshInstance2D Preview" +msgstr "MeshInstance2D 预览" + msgid "Create Polygon2D" msgstr "创建 Polygon2D" @@ -5871,6 +8788,12 @@ msgstr "创建 LightOccluder2D" msgid "LightOccluder2D Preview" msgstr "LightOccluder2D 预览" +msgid "Can't convert a Sprite2D from a foreign scene." +msgstr "æ— æ³•ä»Žå¤–éƒ¨åœºæ™¯è½¬æ¢ Sprite2D。" + +msgid "Sprite2D is empty!" +msgstr "Sprite2D 为空ï¼" + msgid "Can't convert a sprite using animation frames to mesh." msgstr "æ— æ³•å°†ä½¿ç”¨åŠ¨ç”»å¸§çš„ç²¾çµè½¬æ¢ä¸ºç½‘æ ¼ã€‚" @@ -5898,6 +8821,9 @@ msgstr "æ— æ•ˆçš„å‡ ä½•ä½“ï¼Œæ— æ³•åˆ›å»ºé®å…‰ä½“。" msgid "Create LightOccluder2D Sibling" msgstr "创建 LightOccluder2D 兄弟节点" +msgid "Sprite2D" +msgstr "Sprite2D" + msgid "Simplification:" msgstr "简化:" @@ -5946,24 +8872,54 @@ msgstr "是å¦åˆ 除动画?" msgid "Change Animation FPS" msgstr "修改动画 FPS" +msgid "Set Frame Duration" +msgstr "设置帧时长" + msgid "(empty)" msgstr "(空)" msgid "Animations:" msgstr "动画:" -msgid "Speed:" -msgstr "速度:" +msgid "Filter Animations" +msgstr "ç›é€‰åŠ¨ç”»" -msgid "Loop" -msgstr "循环" +msgid "Delete Animation" +msgstr "åˆ é™¤åŠ¨ç”»" msgid "Animation Frames:" msgstr "动画帧:" +msgid "Frame Duration:" +msgstr "帧æŒç»æ—¶é—´ï¼š" + msgid "Zoom Reset" msgstr "é‡ç½®ç¼©æ”¾" +msgid "Add frame from file" +msgstr "从文件ä¸æ·»åŠ 帧" + +msgid "Add frames from sprite sheet" +msgstr "从精çµè¡¨ä¸æ·»åŠ 帧" + +msgid "Delete Frame" +msgstr "åˆ é™¤å¸§" + +msgid "Copy Frame" +msgstr "å¤åˆ¶å¸§" + +msgid "Insert Empty (Before Selected)" +msgstr "æ’入空白帧(在所选之å‰ï¼‰" + +msgid "Insert Empty (After Selected)" +msgstr "æ’入空白帧(在所选之åŽï¼‰" + +msgid "Move Frame Left" +msgstr "å‘左移动帧" + +msgid "Move Frame Right" +msgstr "å‘å³ç§»åŠ¨å¸§" + msgid "Select Frames" msgstr "选择帧" @@ -5985,6 +8941,25 @@ msgstr "从精çµè¡¨ä¸åˆ›å»ºå¸§" msgid "SpriteFrames" msgstr "动画帧" +msgid "Warnings should be fixed to prevent errors." +msgstr "应修å¤è¦å‘Šä»¥é˜²æ¢å‡ºé”™ã€‚" + +msgid "" +"This shader has been modified on disk.\n" +"What action should be taken?" +msgstr "" +"这个ç€è‰²å™¨å·²åœ¨ç¡¬ç›˜ä¸Šä¿®æ”¹ã€‚\n" +"应该采å–什么行动?" + +msgid "%s Mipmaps" +msgstr "%s Mipmaps" + +msgid "Memory: %s" +msgstr "内å˜ï¼š%s" + +msgid "No Mipmaps" +msgstr "æ— Mipmaps" + msgid "Set Region Rect" msgstr "设置纹ç†åŒºåŸŸ" @@ -5998,7 +8973,7 @@ msgid "Pixel Snap" msgstr "åƒç´ å¸é™„" msgid "Grid Snap" -msgstr "ç½‘æ ¼å¸é™„" +msgstr "æ …æ ¼å¸é™„" msgid "Auto Slice" msgstr "自动è£å‰ª" @@ -6006,24 +8981,61 @@ msgstr "自动è£å‰ª" msgid "Step:" msgstr "æ¥é•¿ï¼š" +msgid "Region Editor" +msgstr "区域编辑器" + +msgid "Edit Region" +msgstr "编辑区域" + msgid "Styleboxes" msgstr "æ ·å¼ç›’" +msgid "1 color" +msgid_plural "{num} colors" +msgstr[0] "{num} 个颜色" + msgid "No colors found." msgstr "没有颜色。" +msgid "1 constant" +msgid_plural "{num} constants" +msgstr[0] "{num} 个常é‡" + msgid "No constants found." msgstr "没有常é‡ã€‚" +msgid "1 font" +msgid_plural "{num} fonts" +msgstr[0] "{num} 个å—体" + msgid "No fonts found." msgstr "没有å—体。" +msgid "1 font size" +msgid_plural "{num} font sizes" +msgstr[0] "{num} 个å—体大å°" + +msgid "No font sizes found." +msgstr "未找到å—体大å°ã€‚" + +msgid "1 icon" +msgid_plural "{num} icons" +msgstr[0] "{num} ä¸ªå›¾æ ‡" + msgid "No icons found." msgstr "æ²¡æœ‰å›¾æ ‡ã€‚" +msgid "1 stylebox" +msgid_plural "{num} styleboxes" +msgstr[0] "{num} ä¸ªæ ·å¼ç›’" + msgid "No styleboxes found." msgstr "æ²¡æœ‰æ ·å¼ç›’。" +msgid "{num} currently selected" +msgid_plural "{num} currently selected" +msgstr[0] "当å‰é€‰ä¸ {num} 个" + msgid "Nothing was selected for the import." msgstr "没有选ä¸å¯¼å…¥ä»»ä½•ä¸œè¥¿ã€‚" @@ -6039,6 +9051,12 @@ msgstr "æ£åœ¨æ›´æ–°ç¼–辑器" msgid "Finalizing" msgstr "æ£åœ¨æ”¶å°¾" +msgid "Import Theme Items" +msgstr "导入主题项目" + +msgid "Filter Items" +msgstr "ç›é€‰é¡¹ç›®" + msgid "With Data" msgstr "å«æ•°æ®" @@ -6072,6 +9090,18 @@ msgstr "选择所有å¯è§çš„å—体项目和它们的数æ®ã€‚" msgid "Deselect all visible font items." msgstr "å–消选择所有å¯è§çš„å—体项目。" +msgid "Font sizes" +msgstr "å—体大å°" + +msgid "Select all visible font size items." +msgstr "选择所有å¯è§çš„å—体大å°é¡¹ç›®ã€‚" + +msgid "Select all visible font size items and their data." +msgstr "选择所有å¯è§çš„å—体大å°é¡¹ç›®å’Œå®ƒä»¬çš„æ•°æ®ã€‚" + +msgid "Deselect all visible font size items." +msgstr "å–消选择所有å¯è§çš„å—体大å°é¡¹ç›®ã€‚" + msgid "Select all visible icon items." msgstr "选择所有å¯è§çš„å›¾æ ‡é¡¹ç›®ã€‚" @@ -6149,6 +9179,9 @@ msgstr "移除所有常é‡é¡¹ç›®" msgid "Remove All Font Items" msgstr "移除所有å—体项目" +msgid "Remove All Font Size Items" +msgstr "移除所有å—体大å°é¡¹ç›®" + msgid "Remove All Icon Items" msgstr "ç§»é™¤æ‰€æœ‰å›¾æ ‡é¡¹ç›®" @@ -6162,12 +9195,30 @@ msgstr "" "该主题类型为空。\n" "è¯·æ‰‹åŠ¨æ·»åŠ æˆ–è€…ä»Žå…¶ä»–ä¸»é¢˜å¯¼å…¥æ›´å¤šé¡¹ç›®ã€‚" +msgid "Remove Theme Item" +msgstr "移除主题类型" + msgid "Add Theme Type" msgstr "æ·»åŠ ä¸»é¢˜ç±»åž‹" +msgid "Create Theme Item" +msgstr "创建主题项目" + msgid "Remove Theme Type" msgstr "移除主题类型" +msgid "Remove Data Type Items From Theme" +msgstr "从主题ä¸ç§»é™¤æ•°æ®ç±»åž‹é¡¹ç›®" + +msgid "Remove Class Items From Theme" +msgstr "从主题ä¸ç§»é™¤ç±»é¡¹ç›®" + +msgid "Remove Custom Items From Theme" +msgstr "从主题ä¸ç§»é™¤è‡ªå®šä¹‰é¡¹ç›®" + +msgid "Remove All Items From Theme" +msgstr "从主题ä¸ç§»é™¤æ‰€æœ‰é¡¹ç›®" + msgid "Add Color Item" msgstr "æ·»åŠ é¢œè‰²é¡¹ç›®" @@ -6177,6 +9228,9 @@ msgstr "æ·»åŠ å¸¸é‡é¡¹ç›®" msgid "Add Font Item" msgstr "æ·»åŠ å—体项目" +msgid "Add Font Size Item" +msgstr "æ·»åŠ å—体大å°é¡¹ç›®" + msgid "Add Icon Item" msgstr "æ·»åŠ å›¾æ ‡é¡¹ç›®" @@ -6192,12 +9246,18 @@ msgstr "é‡å‘½å常é‡é¡¹ç›®" msgid "Rename Font Item" msgstr "é‡å‘½åå—体项目" +msgid "Rename Font Size Item" +msgstr "é‡å‘½åå—体大å°é¡¹ç›®" + msgid "Rename Icon Item" msgstr "é‡å‘½åå›¾æ ‡é¡¹ç›®" msgid "Rename Stylebox Item" msgstr "é‡å‘½åæ ·å¼ç›’项目" +msgid "Rename Theme Item" +msgstr "é‡å‘½å主题项目" + msgid "Invalid file, not a Theme resource." msgstr "æ— æ•ˆæ–‡ä»¶ï¼Œä¸æ˜¯ Theme 资æºã€‚" @@ -6294,12 +9354,48 @@ msgstr "æ·»åŠ é¡¹ç›®ç±»åž‹" msgid "Add Type" msgstr "æ·»åŠ ç±»åž‹" +msgid "Override All Default Theme Items" +msgstr "覆盖所有默认主题项" + +msgid "Override Theme Item" +msgstr "覆盖主题项" + +msgid "Set Color Item in Theme" +msgstr "设置主题ä¸çš„颜色项" + +msgid "Set Constant Item in Theme" +msgstr "设置主题ä¸çš„常é‡é¡¹" + +msgid "Set Font Size Item in Theme" +msgstr "设置主题ä¸çš„å—体尺寸项" + +msgid "Set Font Item in Theme" +msgstr "设置主题ä¸çš„å—体项" + +msgid "Set Icon Item in Theme" +msgstr "设置主题ä¸çš„å›¾æ ‡é¡¹" + +msgid "Set Stylebox Item in Theme" +msgstr "设置主题ä¸çš„æ ·å¼ç›’项" + +msgid "Pin Stylebox" +msgstr "å›ºå®šæ ·å¼ç›’" + +msgid "Unpin Stylebox" +msgstr "è§£é™¤å›ºå®šæ ·å¼ç›’" + +msgid "Set Theme Type Variation" +msgstr "设置主题类型å˜ç§" + msgid "Set Variation Base Type" msgstr "设置å˜ç§åŸºç¡€ç±»åž‹" msgid "Set Base Type" msgstr "设置基础类型" +msgid "Add a type from a list of available types or create a new one." +msgstr "从å¯ç”¨ç±»åž‹åˆ—表ä¸æ·»åŠ 类型或创建新类型。" + msgid "Show Default" msgstr "显示默认" @@ -6350,13 +9446,13 @@ msgid "Toggle Button" msgstr "切æ¢æŒ‰é’®" msgid "Disabled Button" -msgstr "ä¸å¯ç”¨çš„按钮" +msgstr "ç¦ç”¨çš„按钮" msgid "Item" msgstr "项目" msgid "Disabled Item" -msgstr "ä¸å¯ç”¨çš„项目" +msgstr "ç¦ç”¨çš„项目" msgid "Check Item" msgstr "检查项目" @@ -6421,6 +9517,90 @@ msgstr "æ— æ•ˆæ–‡ä»¶ï¼Œä¸æ˜¯ PackedScene 资æºã€‚" msgid "Reload the scene to reflect its most actual state." msgstr "é‡æ–°åŠ 载场景,åæ˜ æœ€æ–°çŠ¶æ€ã€‚" +msgid "Merge TileSetAtlasSource" +msgstr "åˆå¹¶ TileSetAtlasSource" + +msgid "%s (ID: %d)" +msgstr "%s(ID:%d)" + +msgid "Atlas Merging" +msgstr "图集åˆå¹¶" + +msgid "Merge (Keep original Atlases)" +msgstr "åˆå¹¶ï¼ˆä¿ç•™åŽŸæœ‰å›¾é›†ï¼‰" + +msgid "Merge" +msgstr "åˆå¹¶" + +msgid "Next Line After Column" +msgstr "列åŽçš„下一行" + +msgid "Please select two atlases or more." +msgstr "请至少选择两个图集。" + +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: 0" +msgstr "" +"æºï¼š%d\n" +"图集åæ ‡ï¼š%s\n" +"备选:0" + +msgid "" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"æºï¼š%d\n" +"图集åæ ‡ï¼š%s\n" +"备选:%d" + +msgid "Center View" +msgstr "å±…ä¸è§†å›¾" + +msgid "No atlas source with a valid texture selected." +msgstr "未选择有效纹ç†çš„图集æºã€‚" + +msgid "Base Tiles" +msgstr "基础图å—" + +msgid "Alternative Tiles" +msgstr "备选图å—" + +msgid "Reset Polygons" +msgstr "é‡ç½®å¤šè¾¹å½¢" + +msgid "Clear Polygons" +msgstr "清空多边形" + +msgid "Rotate Polygons Right" +msgstr "å‘å³æ—‹è½¬å¤šè¾¹å½¢" + +msgid "Rotate Polygons Left" +msgstr "å‘左旋转多边形" + +msgid "Flip Polygons Horizontally" +msgstr "水平翻转多边形" + +msgid "Flip Polygons Vertically" +msgstr "垂直翻转多边形" + +msgid "Edit Polygons" +msgstr "编辑多边形" + +msgid "Add polygon tool" +msgstr "å¤šè¾¹å½¢æ·»åŠ å·¥å…·" + +msgid "Edit points tool" +msgstr "点编辑工具" + +msgid "Delete points tool" +msgstr "ç‚¹åˆ é™¤å·¥å…·" + +msgid "Reset to default tile shape" +msgstr "é‡ç½®ä¸ºé»˜è®¤å›¾å—形状" + msgid "Rotate Right" msgstr "å‘å³æ—‹è½¬" @@ -6433,18 +9613,373 @@ msgstr "水平翻转" msgid "Flip Vertically" msgstr "垂直翻转" +msgid "Snap to half-pixel" +msgstr "å¸é™„至åŠåƒç´ " + +msgid "Painting Tiles Property" +msgstr "绘制图å—属性" + +msgid "Painting:" +msgstr "绘制:" + +msgid "No terrains" +msgstr "没有地形" + +msgid "No terrain" +msgstr "没有地形" + +msgid "Painting Terrain Set" +msgstr "绘制地形集" + +msgid "Painting Terrain" +msgstr "绘制地形" + +msgid "No Texture Atlas Source (ID: %d)" +msgstr "没有纹ç†å›¾é›†æºï¼ˆID:%d)" + +msgid "Scene Collection Source (ID: %d)" +msgstr "场景åˆé›†æºï¼ˆID:%d)" + +msgid "Unknown Type Source (ID: %d)" +msgstr "未知类型æºï¼ˆID:%d)" + +msgid "Add TileSet pattern" +msgstr "æ·»åŠ TileSet 模å¼" + +msgid "Remove TileSet patterns" +msgstr "移除 TileSet 模å¼" + +msgid "Tile with Invalid Scene" +msgstr "包å«æ— 效场景的图å—" + +msgid "Delete tiles" +msgstr "åˆ é™¤å›¾å—" + +msgid "Change selection" +msgstr "修改选ä¸é¡¹" + +msgid "Move tiles" +msgstr "移动图å—" + +msgid "Paint tiles" +msgstr "绘制图å—" + +msgid "Paste tiles" +msgstr "粘贴图å—" + +msgid "Shift: Draw line." +msgstr "Shift:画直线。" + +msgid "Shift+Ctrl: Draw rectangle." +msgstr "Shift+Ctrl:画矩形。" + +msgid "Alternatively hold Ctrl with other tools to pick tile." +msgstr "也å¯ä»¥åœ¨ä½¿ç”¨å…¶ä»–å·¥å…·æ—¶æŒ‰ä½ Ctrl é”®æ¥æŒ‘选图å—。" + +msgid "Alternatively use RMB to erase tiles." +msgstr "也å¯ä»¥ç”¨é¼ æ ‡å³é”®æ“¦é™¤å›¾å—。" + +msgid "Contiguous" +msgstr "è¿žç»" + +msgid "Place Random Tile" +msgstr "放置éšæœºå›¾å—" + +msgid "" +"Defines the probability of painting nothing instead of a randomly selected " +"tile." +msgstr "定义ä¸ç»˜åˆ¶ä»»ä½•å†…容而ä¸æ˜¯ç»˜åˆ¶éšæœºé€‰æ‹©çš„图å—的概率。" + +msgid "Scattering:" +msgstr "散布:" + msgid "Tiles" -msgstr "ç£è´´" +msgstr "图å—" + +msgid "" +"This TileMap's TileSet has no source configured. Edit the TileSet resource " +"to add one." +msgstr "æ¤ TileMap çš„ TileSet 没有é…ç½®æºã€‚请编辑 TileSet 资æºä»¥æ·»åŠ 一个。" + +msgid "Sort sources" +msgstr "æºæŽ’åº" + +msgid "Sort by ID (Ascending)" +msgstr "按 ID 排åºï¼ˆå‡åºï¼‰" + +msgid "Sort by ID (Descending)" +msgstr "按 ID 排åºï¼ˆé™åºï¼‰" + +msgid "Invalid source selected." +msgstr "所选æºæ— 效。" + +msgid "Patterns" +msgstr "模å¼" + +msgid "Drag and drop or paste a TileMap selection here to store a pattern." +msgstr "è¦å˜å‚¨ä¸€ä¸ªæ¨¡å¼ï¼Œè¯·å°† TileMap 选ä¸é¡¹æ‹–放或粘贴至æ¤ã€‚" + +msgid "Paint terrain" +msgstr "绘制地形" + +msgid "Matches Corners and Sides" +msgstr "匹é…角è½å’Œä¾§è¾¹" + +msgid "Matches Corners Only" +msgstr "仅匹é…角è½" + +msgid "Matches Sides Only" +msgstr "仅匹é…侧边" + +msgid "" +"Connect mode: paints a terrain, then connects it with the surrounding tiles " +"with the same terrain." +msgstr "连接模å¼ï¼šç»˜åˆ¶ä¸€ä¸ªåœ°å½¢ï¼Œç„¶åŽå°†å…¶ä¸Žå‘¨å›´å…·æœ‰ç›¸åŒåœ°å½¢çš„图å—连接起æ¥ã€‚" + +msgid "" +"Path mode: paints a terrain, thens connects it to the previous tile painted " +"within the same stroke." +msgstr "路径模å¼ï¼šç»˜åˆ¶ä¸€ä¸ªåœ°å½¢ï¼Œå¹¶åœ¨åŒä¸€ç¬”画内将其与å‰ä¸€ä¸ªå›¾å—连接起æ¥ã€‚" + +msgid "Replace Tiles with Proxies" +msgstr "用代ç†æ›¿æ¢å›¾å—" + +msgid "No Layers" +msgstr "没有层" + +msgid "Select Next Tile Map Layer" +msgstr "选择下一个图å—地图层" + +msgid "Select Previous Tile Map Layer" +msgstr "选择上一个图å—地图层" + +msgid "TileMap Layers" +msgstr "TileMap 层" + +msgid "Highlight Selected TileMap Layer" +msgstr "高亮所选 TileMap 图层" + +msgid "Toggle grid visibility." +msgstr "切æ¢æ …æ ¼å¯è§æ€§ã€‚" + +msgid "Automatically Replace Tiles with Proxies" +msgstr "自动将图å—替æ¢ä¸ºä»£ç†" + +msgid "The edited TileMap node has no TileSet resource." +msgstr "编辑的 TileMap 节点没有 TileSet 资æºã€‚" + +msgid "Remove Tile Proxies" +msgstr "移除图å—代ç†" + +msgid "Create Alternative-level Tile Proxy" +msgstr "创建替代级别的图å—代ç†" + +msgid "Create Coords-level Tile Proxy" +msgstr "创建åæ ‡çº§åˆ«çš„å›¾å—代ç†" + +msgid "Create source-level Tile Proxy" +msgstr "创建æºçº§åˆ«çš„图å—代ç†" + +msgid "Delete All Invalid Tile Proxies" +msgstr "åˆ é™¤æ‰€æœ‰æ— æ•ˆçš„å›¾å—代ç†" + +msgid "Delete All Tile Proxies" +msgstr "åˆ é™¤æ‰€æœ‰å›¾å—代ç†" + +msgid "Tile Proxies Management" +msgstr "图å—代ç†ç®¡ç†" + +msgid "Source-level proxies" +msgstr "æºçº§åˆ«ä»£ç†" + +msgid "Coords-level proxies" +msgstr "åæ ‡çº§åˆ«ä»£ç†" + +msgid "Alternative-level proxies" +msgstr "替代级别代ç†" + +msgid "Add a new tile proxy:" +msgstr "æ·»åŠ ä¸€ä¸ªæ–°çš„å›¾å—代ç†ï¼š" + +msgid "From Source" +msgstr "从æº" + +msgid "From Coords" +msgstr "从åæ ‡" + +msgid "From Alternative" +msgstr "从替代" + +msgid "To Source" +msgstr "到æº" + +msgid "To Coords" +msgstr "到åæ ‡" + +msgid "To Alternative" +msgstr "到替代" + +msgid "Global actions:" +msgstr "全局动作:" + +msgid "Clear Invalid" +msgstr "æ¸…é™¤æ— æ•ˆ" msgid "Atlas" msgstr "图集" +msgid "Base Tile" +msgstr "基础图å—" + +msgid "Alternative Tile" +msgstr "备选图å—" + +msgid "" +"Selected tile:\n" +"Source: %d\n" +"Atlas coordinates: %s\n" +"Alternative: %d" +msgstr "" +"选ä¸å›¾å—:\n" +"æºï¼š%d\n" +"图集åæ ‡ï¼š%s\n" +"备选:%d" + +msgid "Select a property editor" +msgstr "请选择属性编辑器" + +msgid "Create tiles" +msgstr "创建多个图å—" + +msgid "Create a tile" +msgstr "创建å•ä¸ªå›¾å—" + +msgid "Remove tiles" +msgstr "移除图å—" + +msgid "Move a tile" +msgstr "移动图å—" + +msgid "Select tiles" +msgstr "选择图å—" + +msgid "Resize a tile" +msgstr "调整图å—大å°" + +msgid "Remove tile" +msgstr "移除图å—" + +msgid "Create tile alternatives" +msgstr "创建备选图å—" + +msgid "Create tiles in non-transparent texture regions" +msgstr "在ä¸é€æ˜Žçº¹ç†åŒºåŸŸä¸åˆ›å»ºå›¾å—" + +msgid "Remove tiles in fully transparent texture regions" +msgstr "从全é€æ˜Žçº¹ç†åŒºåŸŸä¸ç§»é™¤å›¾å—" + +msgid "Setup" +msgstr "设置" + +msgid "" +"Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, " +"control for rectangle editing)." +msgstr "图集设置。图å—æ·»åŠ /移除工具(Shift 键创建大图å—ã€Ctrl 键编辑矩形)。" + +msgid "Select tiles." +msgstr "选择图å—。" + +msgid "Paint" +msgstr "绘制" + +msgid "Paint properties." +msgstr "绘制属性。" + +msgid "No tiles selected." +msgstr "未选择图å—。" + +msgid "Paint Properties:" +msgstr "绘制属性:" + +msgid "Create Tiles in Non-Transparent Texture Regions" +msgstr "在ä¸é€æ˜Žçº¹ç†åŒºåŸŸåˆ›å»ºå›¾å—" + +msgid "Remove Tiles in Fully Transparent Texture Regions" +msgstr "在全é€æ˜Žçº¹ç†åŒºåŸŸç§»é™¤å›¾å—" + +msgid "Create an Alternative Tile" +msgstr "创建备选图å—" + +msgid "Create a Tile" +msgstr "创建图å—" + +msgid "Auto Create Tiles in Non-Transparent Texture Regions?" +msgstr "是å¦è‡ªåŠ¨åœ¨ä¸é€æ˜Žçº¹ç†åŒºåŸŸåˆ›å»ºå›¾å—?" + +msgid "" +"The atlas's texture was modified.\n" +"Would you like to automatically create tiles in the atlas?" +msgstr "" +"该图集的纹ç†å‘生改å˜ã€‚\n" +"是å¦æƒ³è¦è‡ªåŠ¨åœ¨è¯¥å›¾é›†ä¸åˆ›å»ºå›¾å—?" + msgid "Yes" msgstr "是" +msgid "No" +msgstr "å¦" + +msgid "Add a new atlas source" +msgstr "新建图集æº" + +msgid "Remove source" +msgstr "移除æº" + +msgid "Add atlas source" +msgstr "æ·»åŠ å›¾é›†æº" + +msgid "Sort Sources" +msgstr "æºæŽ’åº" + +msgid "Scenes Collection" +msgstr "场景åˆé›†" + +msgid "Open Atlas Merging Tool" +msgstr "打开图集åˆå¹¶å·¥å…·" + +msgid "Manage Tile Proxies" +msgstr "管ç†å›¾å—代ç†" + +msgid "No TileSet source selected. Select or create a TileSet source." +msgstr "未选择 TileSet æºã€‚请选择或创建 TileSet æºã€‚" + +msgid "Add new patterns in the TileMap editing mode." +msgstr "请在 TileMap 编辑模å¼ä¸æ·»åŠ 新的模å¼ã€‚" + +msgid "Add a Scene Tile" +msgstr "æ·»åŠ åœºæ™¯å›¾å—" + +msgid "Remove a Scene Tile" +msgstr "移除场景图å—" + +msgid "Scenes collection properties:" +msgstr "场景åˆé›†å±žæ€§ï¼š" + +msgid "Tile properties:" +msgstr "图å—属性:" + msgid "TileSet" msgstr "图å—集" +msgid "TileMap" +msgstr "TileMap" + +msgid "" +"No VCS plugins are available in the project. Install a VCS plugin to use VCS " +"integration features." +msgstr "" +"该项目ä¸æ²¡æœ‰å¯ç”¨çš„ VCS æ’件。è¦ä½¿ç”¨ VCS 集æˆåŠŸèƒ½ï¼Œè¯·å®‰è£…一个 VCS æ’件。" + msgid "Error" msgstr "错误" @@ -6455,6 +9990,12 @@ msgstr "远程仓库设置为空。使用网络的 VCS 特性å¯èƒ½æ— 法工作ã msgid "Commit" msgstr "æ交" +msgid "Open in editor" +msgstr "在编辑器ä¸æ‰“å¼€" + +msgid "Discard changes" +msgstr "丢弃修改" + msgid "Staged Changes" msgstr "æš‚å˜ä¿®æ”¹" @@ -6476,9 +10017,24 @@ msgstr "是å¦è¦ç§»é™¤ %s 分支?" msgid "Do you want to remove the %s remote?" msgstr "是å¦è¦ç§»é™¤ %s 远程仓库?" +msgid "Create VCS metadata files for:" +msgstr "创建 VCS 元数æ®æ–‡ä»¶ï¼š" + +msgid "Existing VCS metadata files will be overwritten." +msgstr "现有的 VCS 元数æ®æ–‡ä»¶å°†è¢«è¦†ç›–。" + +msgid "Local Settings" +msgstr "本地设置" + msgid "Apply" msgstr "应用" +msgid "VCS Provider" +msgstr "VCS æ供商" + +msgid "Connect to VCS" +msgstr "连接到 VCS" + msgid "Remote Login" msgstr "远程仓库登录" @@ -6509,6 +10065,12 @@ msgstr "检测新å˜åŒ–" msgid "Discard all changes" msgstr "丢弃所有修改" +msgid "This operation is IRREVERSIBLE. Your changes will be deleted FOREVER." +msgstr "æ¤æ“作是ä¸å¯é€†çš„ã€‚æ‚¨çš„æ›´æ”¹å°†è¢«æ°¸ä¹…åˆ é™¤ã€‚" + +msgid "Permanentally delete my changes" +msgstr "æ°¸ä¹…åˆ é™¤æˆ‘çš„æ›´æ”¹" + msgid "Stage all changes" msgstr "æš‚å˜æ‰€æœ‰ä¿®æ”¹" @@ -6581,6 +10143,9 @@ msgstr "类型更改" msgid "Unmerged" msgstr "未åˆå¹¶" +msgid "View file diffs before committing them to the latest version" +msgstr "在æ交到最新版本之å‰æŸ¥çœ‹æ–‡ä»¶å·®å¼‚" + msgid "View:" msgstr "查看:" @@ -6620,11 +10185,32 @@ msgstr "æ·»åŠ è¾“å…¥" msgid "Add Output" msgstr "æ·»åŠ è¾“å‡º" +msgid "Float" +msgstr "Float" + +msgid "Int" +msgstr "Int" + +msgid "UInt" +msgstr "UInt" + +msgid "Vector2" +msgstr "Vector2" + +msgid "Vector3" +msgstr "Vector3" + +msgid "Vector4" +msgstr "Vector4" + msgid "Boolean" msgstr "布尔值" msgid "Sampler" -msgstr "é‡‡æ · Sampler" +msgstr "é‡‡æ ·å™¨" + +msgid "[default]" +msgstr "[默认]" msgid "Add Input Port" msgstr "æ·»åŠ è¾“å…¥ç«¯å£" @@ -6632,24 +10218,123 @@ msgstr "æ·»åŠ è¾“å…¥ç«¯å£" msgid "Add Output Port" msgstr "å¢žåŠ è¾“å‡ºç«¯å£" +msgid "Change Input Port Type" +msgstr "修改输入端å£ç±»åž‹" + +msgid "Change Output Port Type" +msgstr "修改输出端å£ç±»åž‹" + +msgid "Change Input Port Name" +msgstr "修改输入端å£å称" + +msgid "Change Output Port Name" +msgstr "修改输出端å£å称" + +msgid "Expand Output Port" +msgstr "å¢žåŠ è¾“å‡ºç«¯å£" + +msgid "Shrink Output Port" +msgstr "å‡å°‘输出端å£" + msgid "Remove Input Port" msgstr "移除输入端å£" msgid "Remove Output Port" msgstr "移除输出端å£" +msgid "Set VisualShader Expression" +msgstr "设置 VisualShader 表达å¼" + +msgid "Resize VisualShader Node" +msgstr "调整 VisualShader 节点大å°" + +msgid "Hide Port Preview" +msgstr "éšè—端å£é¢„览" + +msgid "Show Port Preview" +msgstr "显示端å£é¢„览" + +msgid "Set Comment Node Title" +msgstr "è®¾ç½®æ³¨é‡ŠèŠ‚ç‚¹æ ‡é¢˜" + +msgid "Set Comment Node Description" +msgstr "设置注释节点æè¿°" + +msgid "Set Parameter Name" +msgstr "设置å‚æ•°å称" + msgid "Set Input Default Port" msgstr "设置输入默认端å£" msgid "Add Node to Visual Shader" msgstr "å°†èŠ‚ç‚¹æ·»åŠ åˆ°å¯è§†ç€è‰²å™¨" +msgid "Add Varying to Visual Shader: %s" +msgstr "å°† Varying æ·»åŠ åˆ°å¯è§†ç€è‰²å™¨ï¼š%s" + +msgid "Remove Varying from Visual Shader: %s" +msgstr "å°† Varying 从å¯è§†ç€è‰²å™¨ç§»é™¤ï¼š%s" + msgid "Node(s) Moved" msgstr "节点已移动" +msgid "Convert Constant Node(s) To Parameter(s)" +msgstr "将常é‡èŠ‚点转æ¢ä¸ºå‚æ•°" + +msgid "Convert Parameter Node(s) To Constant(s)" +msgstr "å°†å‚数节点转æ¢ä¸ºå¸¸é‡" + +msgid "Delete VisualShader Node" +msgstr "åˆ é™¤ VisualShader 节点" + +msgid "Delete VisualShader Node(s)" +msgstr "åˆ é™¤ VisualShader 节点" + +msgid "Float Constants" +msgstr "浮点常é‡" + +msgid "Convert Constant(s) to Parameter(s)" +msgstr "将常é‡è½¬ä¸ºå‚æ•°" + +msgid "Convert Parameter(s) to Constant(s)" +msgstr "å°†å‚数转æ¢ä¸ºå¸¸é‡" + +msgid "Set Comment Title" +msgstr "è®¾ç½®æ³¨é‡Šæ ‡é¢˜" + +msgid "Set Comment Description" +msgstr "设置注释æè¿°" + +msgid "Duplicate VisualShader Node(s)" +msgstr "å¤åˆ¶ VisualScript 节点" + +msgid "Paste VisualShader Node(s)" +msgstr "粘贴 VisualScript 节点" + +msgid "Cut VisualShader Node(s)" +msgstr "剪切 VisualShader 节点" + msgid "Visual Shader Input Type Changed" msgstr "å¯è§†ç€è‰²å™¨è¾“入类型已更改" +msgid "ParameterRef Name Changed" +msgstr "ParameterRef å称已更改" + +msgid "Varying Name Changed" +msgstr "Varying å称已更改" + +msgid "Set Constant: %s" +msgstr "设置常é‡ï¼š%s" + +msgid "Invalid name for varying." +msgstr "Varying åç§°æ— æ•ˆã€‚" + +msgid "Varying with that name is already exist." +msgstr "å为“%sâ€çš„ Varying å·²å˜åœ¨ã€‚" + +msgid "Add Node(s) to Visual Shader" +msgstr "å°†èŠ‚ç‚¹æ·»åŠ åˆ°å¯è§†ç€è‰²å™¨" + msgid "Vertex" msgstr "顶点" @@ -6662,18 +10347,48 @@ msgstr "ç¯å…‰" msgid "Process" msgstr "处ç†" +msgid "Collide" +msgstr "碰撞" + msgid "Sky" msgstr "天空" msgid "Fog" msgstr "雾" +msgid "Manage Varyings" +msgstr "ç®¡ç† Varying" + +msgid "Add Varying" +msgstr "æ·»åŠ Varying" + +msgid "Remove Varying" +msgstr "移除 Varying" + +msgid "Show generated shader code." +msgstr "显示生æˆçš„ç€è‰²å™¨ä»£ç 。" + +msgid "Generated Shader Code" +msgstr "生æˆçš„ç€è‰²å™¨ä»£ç " + msgid "Add Node" msgstr "æ·»åŠ èŠ‚ç‚¹" +msgid "Clear Copy Buffer" +msgstr "清除å¤åˆ¶ç¼“冲区" + +msgid "High-end node" +msgstr "高端节点" + msgid "Create Shader Node" msgstr "创建ç€è‰²å™¨èŠ‚点" +msgid "Create Shader Varying" +msgstr "创建ç€è‰²å™¨ Varying" + +msgid "Delete Shader Varying" +msgstr "åˆ é™¤ç€è‰²å™¨ Varying" + msgid "Color function." msgstr "颜色函数。" @@ -6722,6 +10437,12 @@ msgstr "柔光è¿ç®—符。" msgid "Color constant." msgstr "颜色常é‡ã€‚" +msgid "Color parameter." +msgstr "颜色å‚数。" + +msgid "(Fragment/Light mode only) Derivative function." +msgstr "(仅é™ç‰‡æ®µ/ç¯å…‰æ¨¡å¼ï¼‰å¯¼æ•°å‡½æ•°ã€‚" + msgid "Returns the boolean result of the %s comparison between two parameters." msgstr "返回两个å‚数之间 %s 比较的布尔结果。" @@ -6758,6 +10479,40 @@ msgstr "å°äºŽç‰äºŽï¼ˆ<=)" msgid "Not Equal (!=)" msgstr "ä¸ç‰äºŽï¼ˆ!=)" +msgid "" +"Returns an associated 3D vector if the provided boolean value is true or " +"false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„ 3D å‘é‡ã€‚" + +msgid "" +"Returns an associated 2D vector if the provided boolean value is true or " +"false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„ 2D å‘é‡ã€‚" + +msgid "" +"Returns an associated boolean if the provided boolean value is true or false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”的布尔值。" + +msgid "" +"Returns an associated floating-point scalar if the provided boolean value is " +"true or false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„æµ®ç‚¹æ•°æ ‡é‡ã€‚" + +msgid "" +"Returns an associated integer scalar if the provided boolean value is true " +"or false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„æ•´æ•°æ ‡é‡ã€‚" + +msgid "" +"Returns an associated transform if the provided boolean value is true or " +"false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„å˜æ¢ã€‚" + +msgid "" +"Returns an associated unsigned integer scalar if the provided boolean value " +"is true or false." +msgstr "如果æ供的布尔值是 true 或 false,则返回关è”çš„æ— ç¬¦å·æ•´æ•°æ ‡é‡ã€‚" + msgid "Returns the boolean result of the comparison between two parameters." msgstr "返回两个å‚数之间比较的布尔结果。" @@ -6769,6 +10524,12 @@ msgstr "返回 INF(或 NaNï¼‰å’Œæ ‡é‡å‚数之间比较的布尔结果。" msgid "Boolean constant." msgstr "布尔常é‡ã€‚" +msgid "Boolean parameter." +msgstr "布尔å‚数。" + +msgid "Translated to '%s' in Godot Shading Language." +msgstr "在 Godot ç€è‰²è¯è¨€ä¸ç¿»è¯‘为“%sâ€ã€‚" + msgid "'%s' input parameter for all shader modes." msgstr "所有ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。" @@ -6784,12 +10545,55 @@ msgstr "片段和ç¯å…‰ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。" msgid "'%s' input parameter for fragment shader mode." msgstr "片段ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。" +msgid "'%s' input parameter for sky shader mode." +msgstr "天空ç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + +msgid "'%s' input parameter for fog shader mode." +msgstr "雾ç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + msgid "'%s' input parameter for light shader mode." msgstr "ç¯å…‰ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。" msgid "'%s' input parameter for vertex shader mode." msgstr "顶点ç€è‰²å™¨æ¨¡å¼çš„ “%s†输入å‚数。" +msgid "'%s' input parameter for start shader mode." +msgstr "用于å¯åŠ¨ç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + +msgid "'%s' input parameter for process shader mode." +msgstr "处ç†ç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + +msgid "'%s' input parameter for start and process shader modes." +msgstr "å¯åŠ¨å’Œå¤„ç†ç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + +msgid "'%s' input parameter for process and collide shader modes." +msgstr "处ç†å’Œç¢°æ’žç€è‰²å™¨æ¨¡å¼çš„“%sâ€è¾“å…¥å‚数。" + +msgid "" +"A node for help to multiply a position input vector by rotation using " +"specific axis. Intended to work with emitters." +msgstr "" +"一个节点,用于帮助通过使用特定轴的旋转æ¥ä¹˜ä»¥ä½ç½®è¾“å…¥å‘é‡ã€‚旨在与å‘射器一起使" +"用。" + +msgid "Float function." +msgstr "浮点函数。" + +msgid "Float operator." +msgstr "浮点è¿ç®—符。" + +msgid "Integer function." +msgstr "整数函数。" + +msgid "Integer operator." +msgstr "æ•´æ•°è¿ç®—符。" + +msgid "Unsigned integer function." +msgstr "æ— ç¬¦å·æ•´æ•°å‡½æ•°ã€‚" + +msgid "Unsigned integer operator." +msgstr "æ— ç¬¦å·æ•´æ•°è¿ç®—符。" + msgid "Returns the absolute value of the parameter." msgstr "返回å‚æ•°çš„ç»å¯¹å€¼ã€‚" @@ -6814,6 +10618,13 @@ msgstr "返回å‚æ•°çš„åæ£åˆ‡å€¼ã€‚" msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "返回å‚æ•°çš„ååŒæ›²æ£åˆ‡å€¼ã€‚" +msgid "Returns the result of bitwise NOT (~a) operation on the integer." +msgstr "返回对整数进行按ä½éžï¼ˆ~a)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise NOT (~a) operation on the unsigned integer." +msgstr "è¿”å›žå¯¹æ— ç¬¦å·æ•´æ•°è¿›è¡ŒæŒ‰ä½éžï¼ˆ~a)è¿ç®—的结果。" + msgid "" "Finds the nearest integer that is greater than or equal to the parameter." msgstr "查找最接近的大于或ç‰äºŽå‚数的整数。" @@ -6870,6 +10681,9 @@ msgstr "返回两个值ä¸è¾ƒå°çš„一个。" msgid "Linear interpolation between two scalars." msgstr "ä¸¤ä¸ªæ ‡é‡ä¹‹é—´çš„线性æ’值。" +msgid "Performs a fused multiply-add operation (a * b + c) on scalars." +msgstr "å¯¹æ ‡é‡æ‰§è¡Œèžåˆçš„ä¹˜åŠ è¿ç®—(a * b + c)。" + msgid "Returns the opposite value of the parameter." msgstr "返回å‚数的相å值。" @@ -6942,11 +10756,178 @@ msgstr "返回å‚æ•°çš„åŒæ›²æ£åˆ‡å€¼ã€‚" msgid "Finds the truncated value of the parameter." msgstr "查找å‚数的截æ–值。" +msgid "Sums two floating-point scalars." +msgstr "å¯¹ä¸¤ä¸ªæµ®ç‚¹æ ‡é‡æ±‚和。" + +msgid "Sums two integer scalars." +msgstr "å¯¹ä¸¤ä¸ªæ•´æ•°æ ‡é‡æ±‚和。" + +msgid "Sums two unsigned integer scalars." +msgstr "å¯¹ä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°æ ‡é‡æ±‚和。" + +msgid "Returns the result of bitwise AND (a & b) operation for two integers." +msgstr "返回两个整数的按ä½ä¸Žï¼ˆa & b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise AND (a & b) operation for two unsigned " +"integers." +msgstr "è¿”å›žä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°çš„按ä½ä¸Žï¼ˆa & b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise left shift (a << b) operation on the integer." +msgstr "返回整数按ä½å·¦ç§»ï¼ˆa << b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise left shift (a << b) operation on the unsigned " +"integer." +msgstr "è¿”å›žæ— ç¬¦å·æ•´æ•°æŒ‰ä½å·¦ç§»ï¼ˆa << b)è¿ç®—的结果。" + +msgid "Returns the result of bitwise OR (a | b) operation for two integers." +msgstr "返回两个整数的按ä½æˆ–(a | b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise OR (a | b) operation for two unsigned integers." +msgstr "è¿”å›žä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°çš„按ä½æˆ–(a | b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise right shift (a >> b) operation on the integer." +msgstr "返回整数按ä½å³ç§»ï¼ˆa >> b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise right shift (a >> b) operation on the unsigned " +"integer." +msgstr "è¿”å›žæ— ç¬¦å·æ•´æ•°æŒ‰ä½å³ç§»ï¼ˆa >> b)è¿ç®—的结果。" + +msgid "Returns the result of bitwise XOR (a ^ b) operation on the integer." +msgstr "返回对整数进行按ä½å¼‚或(a ^ b)è¿ç®—的结果。" + +msgid "" +"Returns the result of bitwise XOR (a ^ b) operation on the unsigned integer." +msgstr "è¿”å›žæ— ç¬¦å·æ•´æ•°æŒ‰ä½å¼‚或(a ^ b)è¿ç®—的结果。" + +msgid "Divides two floating-point scalars." +msgstr "å°†ä¸¤ä¸ªæµ®ç‚¹æ ‡é‡ç›¸é™¤ã€‚" + +msgid "Divides two integer scalars." +msgstr "å°†ä¸¤ä¸ªæ•´æ•°æ ‡é‡ç›¸é™¤ã€‚" + +msgid "Divides two unsigned integer scalars." +msgstr "å°†ä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°æ ‡é‡ç›¸é™¤ã€‚" + +msgid "Multiplies two floating-point scalars." +msgstr "å°†ä¸¤ä¸ªæµ®ç‚¹æ ‡é‡ç›¸ä¹˜ã€‚" + +msgid "Multiplies two integer scalars." +msgstr "å°†ä¸¤ä¸ªæ•´æ•°æ ‡é‡ç›¸ä¹˜ã€‚" + +msgid "Multiplies two unsigned integer scalars." +msgstr "å°†ä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°æ ‡é‡ç›¸ä¹˜ã€‚" + +msgid "Returns the remainder of the two floating-point scalars." +msgstr "è¿”å›žä¸¤ä¸ªæµ®ç‚¹æ ‡é‡çš„余数。" + +msgid "Returns the remainder of the two integer scalars." +msgstr "è¿”å›žä¸¤ä¸ªæ•´æ•°æ ‡é‡çš„余数。" + +msgid "Returns the remainder of the two unsigned integer scalars." +msgstr "è¿”å›žä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°æ ‡é‡çš„余数。" + +msgid "Subtracts two floating-point scalars." +msgstr "å°†ä¸¤ä¸ªæµ®ç‚¹æ ‡é‡ç›¸å‡ã€‚" + +msgid "Subtracts two integer scalars." +msgstr "å°†ä¸¤ä¸ªæ•´æ•°æ ‡é‡ç›¸å‡ã€‚" + +msgid "Subtracts two unsigned integer scalars." +msgstr "å°†ä¸¤ä¸ªæ— ç¬¦å·æ•´æ•°æ ‡é‡ç›¸å‡ã€‚" + +msgid "Scalar floating-point constant." +msgstr "æ ‡é‡æµ®ç‚¹å¸¸é‡ã€‚" + +msgid "Scalar integer constant." +msgstr "æ ‡é‡æ•´æ•°å¸¸é‡ã€‚" + +msgid "Scalar unsigned integer constant." +msgstr "æ ‡é‡æ— 符å·æ•´æ•°å¸¸é‡ã€‚" + +msgid "Scalar floating-point parameter." +msgstr "æ ‡é‡æµ®ç‚¹å‚数。" + +msgid "Scalar integer parameter." +msgstr "æ ‡é‡æ•´æ•°å‚数。" + +msgid "Scalar unsigned integer parameter." +msgstr "æ ‡é‡æ— 符å·æ•´æ•°å‚数。" + +msgid "Converts screen UV to a SDF." +msgstr "å°†å±å¹• UV 转æ¢ä¸º SDF。" + +msgid "Casts a ray against the screen SDF and returns the distance travelled." +msgstr "å‘å±å¹•ä¸Šçš„SDF投射射线,并返回行进的è·ç¦»ã€‚" + +msgid "Converts a SDF to screen UV." +msgstr "将一个 SDF 转æ¢ä¸ºå±å¹• UV。" + +msgid "Performs a SDF texture lookup." +msgstr "执行 SDF 纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Performs a SDF normal texture lookup." +msgstr "执行 SDF 法线纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Function to be applied on texture coordinates." +msgstr "应用于纹ç†åæ ‡çš„å‡½æ•°ã€‚" + +msgid "Polar coordinates conversion applied on texture coordinates." +msgstr "应用于纹ç†åæ ‡çš„æžåæ ‡è½¬æ¢ã€‚" + msgid "Perform the cubic texture lookup." msgstr "执行立方体纹ç†æŸ¥æ‰¾ã€‚" +msgid "Perform the curve texture lookup." +msgstr "执行曲线纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Perform the three components curve texture lookup." +msgstr "执行三分é‡æ›²çº¿çº¹ç†æŸ¥æ‰¾ã€‚" + +msgid "" +"Returns the depth value obtained from the depth prepass in a linear space." +msgstr "返回在线性空间ä¸ä»Žæ·±åº¦é¢„处ç†å¾—到的深度值。" + +msgid "Perform the 2D texture lookup." +msgstr "执行 2D 纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Perform the 2D-array texture lookup." +msgstr "执行 2D 阵列纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Perform the 3D texture lookup." +msgstr "执行 3D 纹ç†æŸ¥æ‰¾ã€‚" + +msgid "Apply panning function on texture coordinates." +msgstr "在纹ç†åæ ‡ä¸Šåº”ç”¨å¹³ç§»å‡½æ•°ã€‚" + +msgid "Apply scaling function on texture coordinates." +msgstr "在纹ç†åæ ‡ä¸Šåº”ç”¨ç¼©æ”¾å‡½æ•°ã€‚" + +msgid "Cubic texture parameter lookup." +msgstr "立方体纹ç†å‚数查找。" + +msgid "2D texture parameter lookup." +msgstr "2D 纹ç†å‚数查找。" + +msgid "2D texture parameter lookup with triplanar." +msgstr "使用三平é¢è¿›è¡Œ 2D 纹ç†å‚数查找。" + +msgid "2D array of textures parameter lookup." +msgstr "2D 阵列纹ç†å‚数查找。" + +msgid "3D texture parameter lookup." +msgstr "3D 纹ç†å‚数查找。" + msgid "Transform function." -msgstr "转æ¢å‡½æ•°ã€‚" +msgstr "å˜æ¢å‡½æ•°ã€‚" + +msgid "Transform operator." +msgstr "å˜æ¢è¿ç®—。" msgid "" "Calculate the outer product of a pair of vectors.\n" @@ -6972,23 +10953,86 @@ msgstr "å°†å˜æ¢åˆ†è§£ä¸ºå››ä¸ªå‘é‡ã€‚" msgid "Calculates the determinant of a transform." msgstr "计算å˜æ¢çš„行列å¼ã€‚" +msgid "" +"Calculates how the object should face the camera to be applied on Model View " +"Matrix output port for 3D objects." +msgstr "计算物体应如何é¢å¯¹æ‘„影机,以应用于 3D 物体的模型视图矩阵输出端å£ã€‚" + msgid "Calculates the inverse of a transform." -msgstr "计算å˜æ¢çš„倒数。" +msgstr "计算å˜æ¢çš„逆。" msgid "Calculates the transpose of a transform." msgstr "计算å˜æ¢çš„转置。" +msgid "Sums two transforms." +msgstr "对两个å˜æ¢æ±‚和。" + +msgid "Divides two transforms." +msgstr "将两个å˜æ¢ç›¸é™¤ã€‚" + +msgid "Multiplies two transforms." +msgstr "将两个å˜æ¢ç›¸ä¹˜ã€‚" + +msgid "Performs per-component multiplication of two transforms." +msgstr "执行两个å˜æ¢çš„分组件的相乘。" + +msgid "Subtracts two transforms." +msgstr "将两个å˜æ¢ç›¸å‡ã€‚" + msgid "Multiplies vector by transform." msgstr "用å˜æ¢ä¹˜ä»¥å‘é‡ã€‚" msgid "Transform constant." msgstr "å˜æ¢å¸¸æ•°ã€‚" +msgid "Transform parameter." +msgstr "å˜æ¢å‚数。" + +msgid "" +"The distance fade effect fades out each pixel based on its distance to " +"another object." +msgstr "è·ç¦»æ·¡åŒ–æ•ˆæžœæ˜¯æ ¹æ®æ¯ä¸ªåƒç´ 与å¦ä¸€ä¸ªç‰©ä½“çš„è·ç¦»æ¥æ·¡åŒ–æ¯ä¸ªåƒç´ 的。" + +msgid "" +"The proximity fade effect fades out each pixel based on its distance to " +"another object." +msgstr "é‚»è¿‘æ·¡åŒ–æ•ˆæžœæ˜¯æ ¹æ®æ¯ä¸ªåƒç´ 与å¦ä¸€ä¸ªç‰©ä½“çš„è·ç¦»æ¥æ·¡å‡ºæ¯ä¸ªåƒç´ 的。" + +msgid "Returns a random value between the minimum and maximum input values." +msgstr "返回一个介于最å°å’Œæœ€å¤§è¾“入值之间的éšæœºå€¼ã€‚" + +msgid "Remaps a given input from the input range to the output range." +msgstr "将一个给定的输入从输入范围é‡æ–°æ˜ 射到输出范围。" + msgid "Vector function." msgstr "å‘é‡å‡½æ•°ã€‚" msgid "Vector operator." -msgstr "å‘é‡è¿ç®—符。" +msgstr "å‘é‡è¿ç®—。" + +msgid "Composes vector from scalars." +msgstr "ç”±æ ‡é‡ç»„æˆå‘é‡ã€‚" + +msgid "Decomposes vector to scalars." +msgstr "å°†å‘é‡åˆ†è§£ä¸ºæ ‡é‡ã€‚" + +msgid "Composes 2D vector from two scalars." +msgstr "ä»Žä¸¤ä¸ªæ ‡é‡ç»„æˆ 2D å‘é‡ã€‚" + +msgid "Decomposes 2D vector to two scalars." +msgstr "å°† 2D å‘é‡åˆ†è§£ä¸ºä¸¤ä¸ªæ ‡é‡ã€‚" + +msgid "Composes 3D vector from three scalars." +msgstr "ä»Žä¸‰ä¸ªæ ‡é‡ç»„æˆ 3D å‘é‡ã€‚" + +msgid "Decomposes 3D vector to three scalars." +msgstr "å°† 3D å‘é‡åˆ†è§£ä¸ºä¸‰ä¸ªæ ‡é‡ã€‚" + +msgid "Composes 4D vector from four scalars." +msgstr "ä»Žå››ä¸ªæ ‡é‡ç»„æˆ 4D å‘é‡ã€‚" + +msgid "Decomposes 4D vector to four scalars." +msgstr "å°† 4D å‘é‡åˆ†è§£ä¸ºå››ä¸ªæ ‡é‡ã€‚" msgid "Calculates the cross product of two vectors." msgstr "计算两个å‘é‡çš„å‰ç§¯ã€‚" @@ -7032,6 +11076,9 @@ msgstr "两个å‘é‡ä¹‹é—´çš„线性æ’值。" msgid "Linear interpolation between two vectors using scalar." msgstr "ä½¿ç”¨æ ‡é‡åœ¨ä¸¤ä¸ªå‘é‡ä¹‹é—´è¿›è¡Œçº¿æ€§æ’值。" +msgid "Performs a fused multiply-add operation (a * b + c) on vectors." +msgstr "执行å‘é‡çš„ä¹˜åŠ èžåˆè¿ç®—(a * b + c)。" + msgid "Calculates the normalize product of vector." msgstr "计算å‘é‡çš„æ ‡å‡†åŒ–ç§¯ã€‚" @@ -7096,6 +11143,73 @@ msgid "" "'y'." msgstr "(仅é™ç‰‡æ®µ/光照模å¼ï¼‰ï¼ˆå‘é‡ï¼‰â€œx†和 “y†ä¸çš„ç»å¯¹å¯¼æ•°ä¹‹å’Œã€‚" +msgid "Adds 2D vector to 2D vector." +msgstr "把 2D å‘é‡ä¸Ž 2D å‘é‡ç›¸åŠ 。" + +msgid "Adds 3D vector to 3D vector." +msgstr "把 3D å‘é‡ä¸Ž 3D å‘é‡ç›¸åŠ 。" + +msgid "Adds 4D vector to 4D vector." +msgstr "把 4D å‘é‡ä¸Ž 4D å‘é‡ç›¸åŠ 。" + +msgid "Divides 2D vector by 2D vector." +msgstr "把 2D å‘é‡é™¤ä»¥ 2D å‘é‡ã€‚" + +msgid "Divides 3D vector by 3D vector." +msgstr "把 3D å‘é‡é™¤ä»¥ 3D å‘é‡ã€‚" + +msgid "Divides 4D vector by 4D vector." +msgstr "把 4D å‘é‡é™¤ä»¥ 4D å‘é‡ã€‚" + +msgid "Multiplies 2D vector by 2D vector." +msgstr "把 2D å‘é‡ä¸Ž 2D å‘é‡ç›¸ä¹˜ã€‚" + +msgid "Multiplies 3D vector by 3D vector." +msgstr "把 3D å‘é‡ä¸Ž 3D å‘é‡ç›¸ä¹˜ã€‚" + +msgid "Multiplies 4D vector by 4D vector." +msgstr "把 4D å‘é‡ä¸Ž 4D å‘é‡ç›¸ä¹˜ã€‚" + +msgid "Returns the remainder of the two 2D vectors." +msgstr "返回两个 2D å‘é‡çš„余数。" + +msgid "Returns the remainder of the two 3D vectors." +msgstr "返回两个 3D å‘é‡çš„余数。" + +msgid "Returns the remainder of the two 4D vectors." +msgstr "返回两个 4D å‘é‡çš„余数。" + +msgid "Subtracts 2D vector from 2D vector." +msgstr "从 2D å‘é‡ä¸å‡åŽ» 2D å‘é‡ã€‚" + +msgid "Subtracts 3D vector from 3D vector." +msgstr "从 3D å‘é‡ä¸å‡åŽ» 3D å‘é‡ã€‚" + +msgid "Subtracts 4D vector from 4D vector." +msgstr "从 4D å‘é‡ä¸å‡åŽ» 4D å‘é‡ã€‚" + +msgid "2D vector constant." +msgstr "2D å‘é‡å¸¸é‡ã€‚" + +msgid "2D vector parameter." +msgstr "2D å‘é‡å‚数。" + +msgid "3D vector constant." +msgstr "3D å‘é‡å¸¸é‡ã€‚" + +msgid "3D vector parameter." +msgstr "3D å‘é‡å‚数。" + +msgid "4D vector constant." +msgstr "4D å‘é‡å¸¸é‡ã€‚" + +msgid "4D vector parameter." +msgstr "4D å‘é‡å‚数。" + +msgid "" +"A rectangular area with a description string for better graph organization." +msgstr "一个带有æè¿°å—符串的矩形区域,以便更好地组织图形。" + msgid "" "Custom Godot Shader Language expression, with custom amount of input and " "output ports. This is a direct injection of code into the vertex/fragment/" @@ -7104,12 +11218,45 @@ msgstr "" "自定义 Godot ç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œå¯ä»¥æœ‰ä»»æ„æ•°é‡çš„输入和输出端å£ã€‚它会往顶点/片" "段/ç¯å…‰å‡½æ•°ä¸ç›´æŽ¥æ³¨å…¥ä»£ç ,请勿在其ä¸å£°æ˜Žå‡½æ•°ã€‚" +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"resulted shader. You can place various function definitions inside and call " +"it later in the Expressions. You can also declare varyings, parameters and " +"constants." +msgstr "" +"自定义的 Godot ç€è‰²å™¨è¯è¨€è¡¨è¾¾å¼ï¼Œä¼šè¢«æ”¾åˆ°æœ€ç»ˆçš„ç€è‰²å™¨å¼€å¤´ã€‚您å¯ä»¥åœ¨å…¶ä¸æ”¾ç½®å„" +"ç§å‡½æ•°å®šä¹‰ï¼Œç„¶åŽåœ¨è¡¨è¾¾å¼ä¸è°ƒç”¨ã€‚您还å¯ä»¥å£°æ˜Ž varyingã€å‚数和常é‡ã€‚" + +msgid "A reference to an existing parameter." +msgstr "对现有å‚数的引用。" + +msgid "Get varying parameter." +msgstr "èŽ·å– varying å‚数。" + +msgid "Set varying parameter." +msgstr "设置 varying å‚数。" + msgid "Edit Visual Property:" msgstr "编辑å¯è§†å±žæ€§ï¼š" msgid "Visual Shader Mode Changed" msgstr "å¯è§†ç€è‰²å™¨æ¨¡å¼å·²æ›´æ”¹" +msgid "Voxel GI data is not local to the scene." +msgstr "ä½“ç´ GI æ•°æ®ä¸æ˜¯åœºæ™¯çš„局部数æ®ã€‚" + +msgid "Voxel GI data is part of an imported resource." +msgstr "ä½“ç´ GI æ•°æ®æ˜¯å¯¼å…¥èµ„æºçš„一部分。" + +msgid "Voxel GI data is an imported resource." +msgstr "ä½“ç´ GI æ•°æ®æ˜¯ä¸€ç§å¯¼å…¥èµ„æºã€‚" + +msgid "Bake VoxelGI" +msgstr "烘焙 VoxelGI" + +msgid "Select path for VoxelGI Data File" +msgstr "选择 VoxelGI æ•°æ®æ–‡ä»¶è·¯å¾„" + msgid "The path specified doesn't exist." msgstr "指定的路径ä¸å˜åœ¨ã€‚" @@ -7129,6 +11276,11 @@ msgstr "请选择 “project.godot†或 “.zip†文件。" msgid "This directory already contains a Godot project." msgstr "该目录已ç»åŒ…å« Godot 项目。" +msgid "" +"The selected path is not empty. Choosing an empty folder is highly " +"recommended." +msgstr "所选路径ä¸ä¸ºç©ºã€‚强烈建议选择一个空文件夹。" + msgid "New Game Project" msgstr "新建游æˆé¡¹ç›®" @@ -7147,6 +11299,48 @@ msgstr "该路径ä¸å·²å˜åœ¨åŒå文件夹。" msgid "It would be a good idea to name your project." msgstr "最好为项目起个åå—。" +msgid "Supports desktop platforms only." +msgstr "仅支æŒæ¡Œé¢å¹³å°ã€‚" + +msgid "Advanced 3D graphics available." +msgstr "有先进的 3D 图形。" + +msgid "Can scale to large complex scenes." +msgstr "å¯ä»¥æ‰©å±•åˆ°å¤§åž‹å¤æ‚场景。" + +msgid "Uses RenderingDevice backend." +msgstr "使用 RenderingDevice åŽç«¯ã€‚" + +msgid "Slower rendering of simple scenes." +msgstr "简å•åœºæ™¯çš„渲染速度较慢。" + +msgid "Supports desktop + mobile platforms." +msgstr "支æŒæ¡Œé¢ + 移动平å°ã€‚" + +msgid "Less advanced 3D graphics." +msgstr "ä¸å¤ªå…ˆè¿›çš„ 3D 图形。" + +msgid "Less scalable for complex scenes." +msgstr "对å¤æ‚场景的å¯æ‰©å±•æ€§è¾ƒå·®ã€‚" + +msgid "Fast rendering of simple scenes." +msgstr "简å•åœºæ™¯çš„渲染速度较快。" + +msgid "Supports desktop, mobile + web platforms." +msgstr "支æŒæ¡Œé¢ã€ç§»åŠ¨ + 网络平å°ã€‚" + +msgid "Least advanced 3D graphics (currently work-in-progress)." +msgstr "最ä¸å…ˆè¿›çš„ 3D 图形(目å‰æ£åœ¨è¿›è¡Œçš„工作)。" + +msgid "Intended for low-end/older devices." +msgstr "针对低端/较è€çš„设备。" + +msgid "Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2)." +msgstr "使用 OpenGL 3 åŽç«¯ï¼ˆOpenGL 3.3/ES 3.0/WebGL2)。" + +msgid "Fastest rendering of simple scenes." +msgstr "简å•åœºæ™¯çš„渲染速度最快。" + msgid "Invalid project path (changed anything?)." msgstr "é¡¹ç›®è·¯å¾„æ— æ•ˆï¼ˆè¢«å¤–éƒ¨ä¿®æ”¹ï¼Ÿï¼‰ã€‚" @@ -7157,9 +11351,26 @@ msgstr "æ— æ³•åŠ è½½ä½äºŽâ€œ%sâ€çš„项目(错误 %d)。项目å¯èƒ½ç¼ºå¤±æ msgid "Couldn't save project at '%s' (error %d)." msgstr "æ— æ³•ä¿å˜ä½äºŽâ€œ%sâ€çš„项目(错误 %d)。" +msgid "Warning: This folder is not empty" +msgstr "è¦å‘Šï¼šè¯¥æ–‡ä»¶å¤¹éžç©º" + +msgid "" +"You are about to create a Godot project in a non-empty folder.\n" +"The entire contents of this folder will be imported as project resources!\n" +"\n" +"Are you sure you wish to continue?" +msgstr "" +"ä½ å°†åœ¨éžç©ºçš„文件夹ä¸åˆ›å»º Godot 项目。\n" +"这个文件夹ä¸çš„所有内容都将作为项目资æºå¯¼å…¥!\n" +"\n" +"ä½ ç¡®å®šè¦ç»§ç»å—?" + msgid "Couldn't create project.godot in project path." msgstr "æ— æ³•åœ¨é¡¹ç›®è·¯å¾„ä¸‹åˆ›å»º project.godot 文件。" +msgid "Couldn't create icon.svg in project path." +msgstr "æ— æ³•åœ¨é¡¹ç›®è·¯å¾„ä¸‹åˆ›å»º icon.svg 文件。" + msgid "Error opening package file, not in ZIP format." msgstr "æ‰“å¼€åŒ…æ–‡ä»¶æ—¶å‡ºé”™ï¼Œéž ZIP æ ¼å¼ã€‚" @@ -7202,6 +11413,12 @@ msgstr "项目安装路径:" msgid "Renderer:" msgstr "渲染器:" +msgid "The renderer can be changed later, but scenes may need to be adjusted." +msgstr "渲染器å¯ä»¥ç¨åŽæ›´æ”¹ï¼Œä½†å¯èƒ½éœ€è¦è°ƒæ•´åœºæ™¯ã€‚" + +msgid "Version Control Metadata:" +msgstr "版本控制元数æ®ï¼š" + msgid "Missing Project" msgstr "缺失项目" @@ -7215,12 +11432,150 @@ msgid "Local Projects" msgstr "本地项目" msgid "Asset Library Projects" -msgstr "ç´ æ库项目" +msgstr "资产库项目" msgid "Can't open project at '%s'." msgstr "æ— æ³•æ‰“å¼€ä½äºŽâ€œ%sâ€çš„项目。" msgid "" +"You requested to open %d projects in parallel. Do you confirm?\n" +"Note that usual checks for engine version compatibility will be bypassed." +msgstr "" +"ä½ è¯·æ±‚åŒæ—¶æ‰“å¼€ %d 个项目。是å¦ç¡®è®¤ï¼Ÿ\n" +"注æ„,将跳过对引擎版本兼容性的常规检查。" + +msgid "" +"The selected project \"%s\" does not specify its supported Godot version in " +"its configuration file (\"project.godot\").\n" +"\n" +"Project path: %s\n" +"\n" +"If you proceed with opening it, it will be converted to Godot's current " +"configuration file format.\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"所选项目“%sâ€æ²¡æœ‰åœ¨é…置文件(“project.godotâ€ï¼‰ä¸æŒ‡å®šå…¶æ”¯æŒçš„ Godot 版本。\n" +"\n" +"项目路径:%s\n" +"\n" +"如果继ç»æ‰“开,该项目会转æ¢ä¸º Godot 当å‰çš„é…ç½®æ–‡ä»¶æ ¼å¼ã€‚\n" +"\n" +"è¦å‘Šï¼šå°†æ— 法å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„引擎打开该项目。" + +msgid "" +"The selected project \"%s\" was generated by Godot 3.x, and needs to be " +"converted for Godot 4.x.\n" +"\n" +"Project path: %s\n" +"\n" +"You have three options:\n" +"- Convert only the configuration file (\"project.godot\"). Use this to open " +"the project without attempting to convert its scenes, resources and " +"scripts.\n" +"- Convert the entire project including its scenes, resources and scripts " +"(recommended if you are upgrading).\n" +"- Do nothing and go back.\n" +"\n" +"Warning: If you select a conversion option, you won't be able to open the " +"project with previous versions of the engine anymore." +msgstr "" +"所选项目“%sâ€æ˜¯ç”± Godot 3.x 生æˆçš„,需è¦è½¬æ¢è‡³ Godot 4.x。\n" +"\n" +"项目路径:%s\n" +"\n" +"ä½ æœ‰ä¸‰ä¸ªé€‰æ‹©ï¼š\n" +"- 仅转æ¢é…置文件(“project.godotâ€ï¼‰ã€‚æ¤é€‰é¡¹å¯ä»¥æ‰“开项目,但ä¸å°è¯•è½¬æ¢å…¶ä¸çš„场" +"景ã€èµ„æºã€è„šæœ¬ã€‚\n" +"- 转æ¢æ•´ä¸ªé¡¹ç›®ï¼ŒåŒ…括其ä¸çš„场景ã€èµ„æºã€è„šæœ¬ï¼ˆå‡çº§æ—¶æŽ¨è)。\n" +"- 什么都ä¸åšï¼Œè¿”回。\n" +"\n" +"è¦å‘Šï¼šé€‰æ‹©è½¬æ¢é€‰é¡¹åŽï¼Œå°†æ— 法å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„引擎打开该项目。" + +msgid "Convert project.godot Only" +msgstr "ä»…è½¬æ¢ project.godot" + +msgid "" +"The selected project \"%s\" was generated by an older engine version, and " +"needs to be converted for this version.\n" +"\n" +"Project path: %s\n" +"\n" +"Do you want to convert it?\n" +"\n" +"Warning: You won't be able to open the project with previous versions of the " +"engine anymore." +msgstr "" +"所选项目“%sâ€æ˜¯ç”±è¾ƒæ—§ç‰ˆæœ¬çš„引擎生æˆï¼Œéœ€è¦ä¸ºæ¤ç‰ˆæœ¬è¿›è¡Œè½¬æ¢ï¼š\n" +"\n" +"项目路径:%s\n" +"\n" +"是å¦è¦è½¬æ¢ï¼Ÿ\n" +"\n" +"è¦å‘Šï¼š å°†æ— æ³•å†ä½¿ç”¨ä»¥å‰ç‰ˆæœ¬çš„引擎打开该项目。" + +msgid "Convert project.godot" +msgstr "è½¬æ¢ project.godot" + +msgid "" +"Can't open project \"%s\" at the following path:\n" +"\n" +"%s\n" +"\n" +"The project settings were created by a newer engine version, whose settings " +"are not compatible with this version." +msgstr "" +"æ— æ³•æ‰“å¼€ä½äºŽè¯¥è·¯å¾„的项目“%sâ€ï¼š\n" +"\n" +"%s\n" +"\n" +"项目设置是由较新版本的引擎创建的,其设置与æ¤ç‰ˆæœ¬ä¸å…¼å®¹ã€‚" + +msgid "" +"Warning: This project uses double precision floats, but this version of\n" +"Godot uses single precision floats. Opening this project may cause data " +"loss.\n" +"\n" +msgstr "" +"è¦å‘Šï¼šè¿™ä¸ªé¡¹ç›®ä½¿ç”¨åŒç²¾åº¦æµ®ç‚¹æ•°ï¼Œä½†è¿™ä¸ªç‰ˆæœ¬çš„\n" +"Godot 使用å•ç²¾åº¦æµ®ç‚¹æ•°ã€‚打开这个项目å¯èƒ½ä¼šå¯¼è‡´æ•°æ®ä¸¢å¤±ã€‚\n" +"\n" + +msgid "" +"Warning: This project uses C#, but this build of Godot does not have\n" +"the Mono module. If you proceed you will not be able to use any C# scripts.\n" +"\n" +msgstr "" +"è¦å‘Šï¼šè¯¥é¡¹ç›®ä½¿ç”¨ C#,但 Godot 的这个版本没有\n" +"Mono 模å—。如果继ç»ï¼Œä½ å°†æ— æ³•ä½¿ç”¨ä»»ä½• C# 脚本。\n" +"\n" + +msgid "" +"Warning: This project was built in Godot %s.\n" +"Opening will upgrade or downgrade the project to Godot %s.\n" +"\n" +msgstr "" +"è¦å‘Šï¼šè¿™ä¸ªé¡¹ç›®æ˜¯åœ¨ Godot %s ä¸æž„建的。\n" +"打开åŽå°†å‡çº§æˆ–é™çº§è¯¥é¡¹ç›®åˆ° Godot %s。\n" +"\n" + +msgid "" +"Warning: This project uses the following features not supported by this " +"build of Godot:\n" +"\n" +"%s\n" +"\n" +msgstr "" +"è¦å‘Šï¼šè¿™ä¸ªé¡¹ç›®ä½¿ç”¨äº†å¦‚下该 Godot 构建ä¸æ”¯æŒçš„功能:\n" +"\n" +"%s\n" +"\n" + +msgid "Open anyway? Project will be modified." +msgstr "æ— è®ºå¦‚ä½•ä¹Ÿè¦æ‰“开?项目将被修改。" + +msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." @@ -7232,7 +11587,7 @@ msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" -"æ— æ³•è¿è¡Œé¡¹ç›®ï¼š 需è¦å¯¼å…¥ç´ æ。\n" +"æ— æ³•è¿è¡Œé¡¹ç›®ï¼š 需è¦å¯¼å…¥èµ„产。\n" "请编辑项目æ¥è§¦å‘首次导入。" msgid "Are you sure to run %d projects at once?" @@ -7269,6 +11624,9 @@ msgctxt "Application" msgid "Project Manager" msgstr "项目管ç†å™¨" +msgid "Filter Projects" +msgstr "ç›é€‰é¡¹ç›®" + msgid "" "This field filters projects by name and last path component.\n" "To filter projects by name and full path, the query must contain at least " @@ -7280,6 +11638,9 @@ msgstr "" msgid "Loading, please wait..." msgstr "æ£åœ¨åŠ 载,请ç¨å€™â€¦â€¦" +msgid "Last Edited" +msgstr "最近编辑" + msgid "New Project" msgstr "新建项目" @@ -7316,6 +11677,26 @@ msgstr "移除全部" msgid "Also delete project contents (no undo!)" msgstr "åŒæ—¶åˆ é™¤é¡¹ç›®å†…å®¹ï¼ˆæ— æ³•æ’¤é”€ï¼ï¼‰" +msgid "" +"This option will perform full project conversion, updating scenes, resources " +"and scripts from Godot 3.x to work in Godot 4.0.\n" +"\n" +"Note that this is a best-effort conversion, i.e. it makes upgrading the " +"project easier, but it will not open out-of-the-box and will still require " +"manual adjustments.\n" +"\n" +"IMPORTANT: Make sure to backup your project before converting, as this " +"operation makes it impossible to open it in older versions of Godot." +msgstr "" +"该选项将执行完整的项目转æ¢ï¼Œæ›´æ–° Godot 3.x 的场景ã€èµ„æºå’Œè„šæœ¬ï¼Œä»¥ä¾¿åœ¨ Godot " +"4.0 ä¸è¿è¡Œã€‚\n" +"\n" +"注æ„,转æ¢æ˜¯å°½åŠ›è€Œä¸ºçš„,也就是说,它å¯ä»¥è®©é¡¹ç›®çš„å‡çº§æ›´å®¹æ˜“ï¼Œä½†æ— æ³•åšåˆ°å¼€ç®±å³" +"用,ä»ç„¶éœ€è¦æ‰‹åŠ¨è°ƒæ•´ã€‚\n" +"\n" +"é‡è¦ï¼šè½¬æ¢å‰è¯·ä¸€å®šè¦å¤‡ä»½ä½ çš„é¡¹ç›®ï¼Œå› ä¸ºè¿™ä¸ªæ“ä½œä¼šä½¿å®ƒæ— æ³•åœ¨æ—§ç‰ˆæœ¬çš„ Godot ä¸æ‰“" +"开。" + msgid "Can't run project" msgstr "æ— æ³•è¿è¡Œé¡¹ç›®" @@ -7324,35 +11705,56 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" "ç›®å‰æ²¡æœ‰ä»»ä½•é¡¹ç›®ã€‚\n" -"是å¦æŸ¥çœ‹ç´ æ库ä¸çš„官方示例项目?" +"是å¦æŸ¥çœ‹èµ„产库ä¸çš„官方示例项目?" + +msgid "Add Project Setting" +msgstr "æ·»åŠ é¡¹ç›®è®¾ç½®" msgid "Delete Item" msgstr "åˆ é™¤æ¡ç›®" +msgid "(All)" +msgstr "(全部)" + msgid "Add Input Action" msgstr "æ·»åŠ è¾“å…¥åŠ¨ä½œ" msgid "Change Action deadzone" msgstr "修改动作æ»åŒº" -msgid "Add Input Action Event" -msgstr "æ·»åŠ è¾“å…¥åŠ¨ä½œäº‹ä»¶" - msgid "Erase Input Action" msgstr "擦除输入动作" msgid "Rename Input Action Event" -msgstr "é‡å‘½å输入事件" +msgstr "é‡å‘½å输入动作事件" + +msgid "Update Input Action Order" +msgstr "更新输入动作顺åº" msgid "Project Settings (project.godot)" msgstr "项目设置(project.godot)" +msgid "Advanced Settings" +msgstr "高级设置" + +msgid "Select a Setting or Type its Name" +msgstr "选择一个设置或输入其å称" + +msgid "Changed settings will be applied to the editor after restarting." +msgstr "更改åŽçš„设置将在é‡æ–°å¯åŠ¨åŽåº”用于编辑器。" + msgid "Input Map" -msgstr "é”®ä½æ˜ å°„" +msgstr "è¾“å…¥æ˜ å°„" msgid "Localization" msgstr "本地化" +msgid "Autoload" +msgstr "è‡ªåŠ¨åŠ è½½" + +msgid "Shader Globals" +msgstr "ç€è‰²å™¨å…¨å±€é‡" + msgid "Plugins" msgstr "æ’件" @@ -7365,9 +11767,6 @@ msgstr "选择属性" msgid "Select Virtual Method" msgstr "选择虚方法" -msgid "Select Method" -msgstr "选择方法" - msgid "Batch Rename" msgstr "批é‡é‡å‘½å" @@ -7386,6 +11785,21 @@ msgstr "高级选项" msgid "Substitute" msgstr "替æ¢" +msgid "Node name." +msgstr "节点å称。" + +msgid "Node's parent name, if available." +msgstr "父节点的å称,如果有的è¯ã€‚" + +msgid "Node type." +msgstr "节点类型。" + +msgid "Current scene name." +msgstr "当å‰åœºæ™¯å称。" + +msgid "Root node name." +msgstr "æ ¹èŠ‚ç‚¹å称。" + msgid "" "Sequential integer counter.\n" "Compare counter options." @@ -7399,9 +11813,15 @@ msgstr "å„级å•ç‹¬è®¡æ•°" msgid "If set, the counter restarts for each group of child nodes." msgstr "如果å¯ç”¨ï¼Œè®¡æ•°å™¨å°†ä¸ºæ¯ç»„å节点é‡ç½®ã€‚" +msgid "Initial value for the counter." +msgstr "计数器的åˆå§‹å€¼ã€‚" + msgid "Step" msgstr "æ¥é•¿" +msgid "Amount by which counter is incremented for each node." +msgstr "æ¯ä¸ªèŠ‚点的计数器的递增é‡ã€‚" + msgid "Padding" msgstr "å¡«å……" @@ -7445,12 +11865,39 @@ msgstr "ä½äºŽå—符 %s" msgid "Reparent Node" msgstr "é‡è®¾çˆ¶èŠ‚点" +msgid "Select new parent:" +msgstr "选择新父级:" + msgid "Keep Global Transform" msgstr "ä¿æŒå…¨å±€å˜æ¢" msgid "Reparent" msgstr "é‡è®¾çˆ¶èŠ‚点" +msgid "Pick Root Node Type" +msgstr "选å–æ ¹èŠ‚ç‚¹ç±»åž‹" + +msgid "Pick" +msgstr "选å–" + +msgid "Scene name is valid." +msgstr "场景å称有效。" + +msgid "Scene name is empty." +msgstr "场景å称为空。" + +msgid "File name invalid." +msgstr "文件åæ— æ•ˆã€‚" + +msgid "File already exists." +msgstr "文件已ç»å˜åœ¨ã€‚" + +msgid "Invalid root node name." +msgstr "æ ¹èŠ‚ç‚¹åç§°æ— æ•ˆã€‚" + +msgid "Root Type:" +msgstr "æ ¹ç±»åž‹ï¼š" + msgid "2D Scene" msgstr "2D 场景" @@ -7460,12 +11907,41 @@ msgstr "3D 场景" msgid "User Interface" msgstr "用户界é¢" +msgid "Scene Name:" +msgstr "场景å称:" + +msgid "Root Name:" +msgstr "æ ¹å称:" + +msgid "Leave empty to use scene name" +msgstr "留空以使用场景å称" + +msgid "Create New Scene" +msgstr "新建场景" + +msgid "No parent to instantiate a child at." +msgstr "没有父节点å¯ç”¨äºŽå®žä¾‹åŒ–一个å场景。" + +msgid "No parent to instantiate the scenes at." +msgstr "没有父节点å¯ç”¨äºŽå®žä¾‹åŒ–场景。" + msgid "Error loading scene from %s" msgstr "从 %s åŠ è½½åœºæ™¯å‡ºé”™" +msgid "" +"Cannot instantiate the scene '%s' because the current scene exists within " +"one of its nodes." +msgstr "æ— æ³•å®žä¾‹åŒ–è¯¥åœºæ™¯â€œ%sâ€ï¼Œå› 为当å‰åœºæ™¯ä½äºŽè¯¥åœºæ™¯èŠ‚点ä¸ã€‚" + +msgid "Instantiate Scene(s)" +msgstr "实例化场景" + msgid "Replace with Branch Scene" msgstr "替æ¢ä¸ºåˆ†æ”¯åœºæ™¯" +msgid "Instantiate Child Scene" +msgstr "实例化å场景" + msgid "Detach Script" msgstr "分离脚本" @@ -7518,6 +11994,25 @@ msgid "" msgstr "将分支ä¿å˜ä¸ºåœºæ™¯éœ€è¦ä»…é€‰æ‹©ä¸€ä¸ªèŠ‚ç‚¹ï¼Œä½†ä½ é€‰äº† %d 个。" msgid "" +"Can't save the root node branch as an instantiated scene.\n" +"To create an editable copy of the current scene, duplicate it using the " +"FileSystem dock context menu\n" +"or create an inherited scene using Scene > New Inherited Scene... instead." +msgstr "" +"æ— æ³•å°†æ ¹èŠ‚ç‚¹ä¿å˜ä¸ºä¸€ä¸ªå®žä¾‹åŒ–场景。\n" +"如果è¦åˆ›å»ºå½“å‰åœºæ™¯çš„å¯ç¼–辑副本,请使用文件系统åœé é¢æ¿çš„上下文èœå•å¤åˆ¶å®ƒ\n" +"或者改用场景 > 新建继承场景... 创建一个继承场景。" + +msgid "" +"Can't save the branch of an already instantiated scene.\n" +"To create a variation of a scene, you can make an inherited scene based on " +"the instantiated scene using Scene > New Inherited Scene... instead." +msgstr "" +"æ— æ³•ä¿å˜å·²å®žä¾‹åŒ–的场景的分支。\n" +"如果è¦åˆ›å»ºåœºæ™¯çš„å˜ç§ï¼Œè¯·æ”¹ç”¨åœºæ™¯ > 新建继承场景... 创建基于该实例化场景的继承" +"场景。" + +msgid "" "Can't save a branch which is a child of an already instantiated scene.\n" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." @@ -7568,18 +12063,30 @@ msgstr "æ–°å»ºåœºæ™¯æ ¹" msgid "Create Root Node:" msgstr "åˆ›å»ºæ ¹èŠ‚ç‚¹ï¼š" +msgid "Switch to Favorite Nodes" +msgstr "切æ¢åˆ°æ”¶è—节点" + msgid "Other Node" msgstr "其他节点" +msgid "Paste From Clipboard" +msgstr "从剪贴æ¿ç²˜è´´" + msgid "Can't operate on nodes from a foreign scene!" msgstr "æ— æ³•æ“作外部场景的节点ï¼" msgid "Can't operate on nodes the current scene inherits from!" msgstr "æ— æ³•æ“作æ¤èŠ‚ç‚¹ï¼Œå› ä¸ºå½“å‰åœºæ™¯ç»§æ‰¿è‡ªè¯¥èŠ‚点ï¼" +msgid "This operation can't be done on instantiated scenes." +msgstr "æ¤æ“作ä¸èƒ½åº”用于实例化的场景。" + msgid "Attach Script" msgstr "æ·»åŠ è„šæœ¬" +msgid "Set Shader" +msgstr "设置ç€è‰²å™¨" + msgid "Cut Node(s)" msgstr "剪切节点" @@ -7603,9 +12110,18 @@ msgstr "ä¿å˜åœºæ™¯å‡ºé”™ã€‚" msgid "Error duplicating scene to save it." msgstr "å¤åˆ¶åœºæ™¯å‡ºé”™ã€‚" +msgid "Instantiate Script" +msgstr "实例化脚本" + msgid "Sub-Resources" msgstr "å资æº" +msgid "Revoke Unique Name" +msgstr "撤销唯一å称" + +msgid "Access as Unique Name" +msgstr "作为唯一å称访问" + msgid "Clear Inheritance" msgstr "清除继承" @@ -7615,9 +12131,28 @@ msgstr "å节点å¯ç¼–辑" msgid "Load As Placeholder" msgstr "åŠ è½½ä¸ºå ä½ç¬¦" +msgid "Auto Expand to Selected" +msgstr "自动展开至选定项" + msgid "Filters" msgstr "过滤" +msgid "Filter by Type" +msgstr "按类型过滤" + +msgid "Filter by Group" +msgstr "按组过滤" + +msgid "Selects all Nodes of the given type." +msgstr "选择给定类型的所有节点。" + +msgid "" +"Selects all Nodes belonging to the given group.\n" +"If empty, selects any Node belonging to any group." +msgstr "" +"选择属于给定组的所有节点。\n" +"如果为空,则选择属于任何组的任何节点。" + msgid "" "Cannot attach a script: there are no languages registered.\n" "This is probably because this editor was built with all language modules " @@ -7635,8 +12170,11 @@ msgstr "粘贴节点" msgid "Add Child Node" msgstr "æ·»åŠ å节点" +msgid "Expand/Collapse Branch" +msgstr "展开/折å 分支" + msgid "Change Type" -msgstr "修改类型" +msgstr "更改类型" msgid "Reparent to New Node" msgstr "é‡è®¾çˆ¶èŠ‚点为新节点" @@ -7644,18 +12182,29 @@ msgstr "é‡è®¾çˆ¶èŠ‚点为新节点" msgid "Make Scene Root" msgstr "è®¾ä¸ºåœºæ™¯æ ¹èŠ‚ç‚¹" +msgid "Toggle Access as Unique Name" +msgstr "切æ¢ä½œä¸ºå”¯ä¸€å称访问" + msgid "Delete (No Confirm)" msgstr "åˆ é™¤ï¼ˆæ— ç¡®è®¤ï¼‰" msgid "Add/Create a New Node." msgstr "æ·»åŠ /创建新节点。" +msgid "" +"Instantiate a scene file as a Node. Creates an inherited scene if no root " +"node exists." +msgstr "å°†åœºæ™¯æ–‡ä»¶å®žä¾‹åŒ–ä¸ºèŠ‚ç‚¹ã€‚å¦‚æžœæ²¡æœ‰æ ¹èŠ‚ç‚¹åˆ™åˆ›å»ºç»§æ‰¿åœºæ™¯ã€‚" + msgid "Attach a new or existing script to the selected node." msgstr "为选ä¸èŠ‚点创建或设置脚本。" msgid "Detach the script from the selected node." msgstr "从选ä¸èŠ‚点分离脚本。" +msgid "Extra scene options." +msgstr "更多场景选项。" + msgid "Remote" msgstr "远程" @@ -7696,6 +12245,23 @@ msgstr "" "这个节点å¯ä»¥åœ¨åœºæ™¯ä¸çš„ä»»æ„ä½ç½®é€šè¿‡åœ¨èŠ‚点路径ä¸ä¸ºå…¶åŠ 上“%sâ€å‰ç¼€æ¥è®¿é—®ã€‚\n" "点击ç¦ç”¨ã€‚" +msgid "Node has one connection." +msgid_plural "Node has {num} connections." +msgstr[0] "节点有 {num} 个连接。" + +msgid "Node is in this group:" +msgid_plural "Node is in the following groups:" +msgstr[0] "节点属于分组:" + +msgid "Click to show signals dock." +msgstr "点击显示信å·é¢æ¿ã€‚" + +msgid "This script is currently running in the editor." +msgstr "这个脚本æ£åœ¨ç¼–辑器ä¸è¿è¡Œã€‚" + +msgid "This script is a custom type." +msgstr "这个脚本是自定义类型。" + msgid "Open Script:" msgstr "打开脚本:" @@ -7707,12 +12273,22 @@ msgstr "" "点击å¯è§£é”。" msgid "" +"Children are not selectable.\n" +"Click to make them selectable." +msgstr "" +"åèŠ‚ç‚¹æ— æ³•é€‰æ‹©ã€‚\n" +"å•å‡»ä½¿å…¶å¯é€‰ã€‚" + +msgid "" "AnimationPlayer is pinned.\n" "Click to unpin." msgstr "" "动画æ’放器被固定。\n" "点击å–消固定。" +msgid "\"%s\" is not a known filter." +msgstr "“%sâ€ä¸æ˜¯å·²çŸ¥ç›é€‰å™¨ã€‚" + msgid "Invalid node name, the following characters are not allowed:" msgstr "节点åç§°æ— æ•ˆï¼Œä¸å…许包å«ä»¥ä¸‹å—符:" @@ -7737,9 +12313,15 @@ msgstr "路径为空。" msgid "Filename is empty." msgstr "文件å为空。" +msgid "Filename is invalid." +msgstr "文件åæ— æ•ˆã€‚" + msgid "Path is not local." msgstr "路径ä¸æ˜¯æœ¬åœ°çš„。" +msgid "Base path is invalid." +msgstr "åŸºæœ¬è·¯å¾„æ— æ•ˆã€‚" + msgid "A directory with the same name exists." msgstr "å˜åœ¨åŒå目录。" @@ -7749,6 +12331,9 @@ msgstr "文件ä¸å˜åœ¨ã€‚" msgid "Invalid extension." msgstr "扩展åæ— æ•ˆã€‚" +msgid "Extension doesn't match chosen language." +msgstr "扩展å与所选è¯è¨€ä¸åŒ¹é…。" + msgid "Template:" msgstr "模æ¿ï¼š" @@ -7764,6 +12349,12 @@ msgstr "打开脚本/选择ä½ç½®" msgid "Open Script" msgstr "打开脚本" +msgid "Inherit %s" +msgstr "继承 %s" + +msgid "Inherit" +msgstr "继承" + msgid "File exists, it will be reused." msgstr "文件å˜åœ¨ï¼Œå°†è¢«é‡ç”¨ã€‚" @@ -7791,12 +12382,21 @@ msgstr "内置脚本(到场景文件ä¸ï¼‰ã€‚" msgid "Will create a new script file." msgstr "将创建新脚本文件。" +msgid "Using existing script file." +msgstr "使用现有脚本文件。" + msgid "Will load an existing script file." msgstr "å°†åŠ è½½çŽ°æœ‰çš„è„šæœ¬æ–‡ä»¶ã€‚" msgid "Script file already exists." msgstr "脚本文件已å˜åœ¨ã€‚" +msgid "No suitable template." +msgstr "没有åˆé€‚的模æ¿ã€‚" + +msgid "Empty" +msgstr "空" + msgid "" "Note: Built-in scripts have some limitations and can't be edited using an " "external editor." @@ -7816,12 +12416,66 @@ msgstr "内置脚本:" msgid "Attach Node Script" msgstr "设置节点的脚本" +msgid "Error - Could not create shader include in filesystem." +msgstr "错误 - æ— æ³•åœ¨æ–‡ä»¶ç³»ç»Ÿä¸åˆ›å»ºç€è‰²å™¨å¤´æ–‡ä»¶ã€‚" + +msgid "Error - Could not create shader in filesystem." +msgstr "错误 - æ— æ³•åœ¨æ–‡ä»¶ç³»ç»Ÿä¸åˆ›å»ºç€è‰²å™¨ã€‚" + +msgid "Error loading shader from %s" +msgstr "从 %s åŠ è½½ç€è‰²å™¨æ—¶å‡ºé”™" + +msgid "Open Shader / Choose Location" +msgstr "打开ç€è‰²å™¨ / 选择ä½ç½®" + msgid "Invalid base path." msgstr "æ— æ•ˆçš„åŸºæœ¬è·¯å¾„ã€‚" msgid "Wrong extension chosen." msgstr "选择了错误的扩展å。" +msgid "Shader path/name is valid." +msgstr "ç€è‰²å™¨è·¯å¾„/å称有效。" + +msgid "Built-in shader (into scene file)." +msgstr "内置ç€è‰²å™¨ï¼ˆåˆ°åœºæ™¯æ–‡ä»¶ä¸ï¼‰ã€‚" + +msgid "Will create a new shader file." +msgstr "将新建ç€è‰²å™¨æ–‡ä»¶ã€‚" + +msgid "Will load an existing shader file." +msgstr "å°†åŠ è½½çŽ°æœ‰çš„ç€è‰²å™¨æ–‡ä»¶ã€‚" + +msgid "Shader file already exists." +msgstr "ç€è‰²å™¨æ–‡ä»¶å·²å˜åœ¨ã€‚" + +msgid "Note: Built-in shaders can't be edited using an external editor." +msgstr "注æ„:内置ç€è‰²å™¨ä¸èƒ½ä½¿ç”¨å¤–部编辑器编辑。" + +msgid "Mode:" +msgstr "模å¼ï¼š" + +msgid "Built-in Shader:" +msgstr "内置ç€è‰²å™¨ï¼š" + +msgid "Create Shader" +msgstr "创建ç€è‰²å™¨" + +msgid "Set Shader Global Variable" +msgstr "设置ç€è‰²å™¨å…¨å±€å˜é‡" + +msgid "Please specify a valid shader uniform identifier name." +msgstr "请指定有效的ç€è‰²å™¨ Uniform æ ‡è¯†ç¬¦å称。" + +msgid "Global shader parameter '%s' already exists'" +msgstr "全局ç€è‰²å™¨å‚数“%sâ€å·²å˜åœ¨" + +msgid "Name '%s' is a reserved shader language keyword." +msgstr "å称“%sâ€æ˜¯ä¸ºç€è‰²å™¨è¯è¨€ä¿ç•™çš„关键å—。" + +msgid "Add Shader Global Parameter" +msgstr "æ·»åŠ ç€è‰²å™¨å…¨å±€å‚æ•°" + msgid "Change Cylinder Radius" msgstr "修改圆柱体åŠå¾„" @@ -7861,6 +12515,60 @@ msgstr "实例å—å…¸æ ¼å¼ä¸æ£ç¡®ï¼ˆ@path çš„è„šæœ¬æ— æ•ˆï¼‰" msgid "Invalid instance dictionary (invalid subclasses)" msgstr "实例å—å…¸æ— æ•ˆï¼ˆæ´¾ç”Ÿç±»æ— æ•ˆï¼‰" +msgid "Value of type '%s' can't provide a length." +msgstr "类型为“%sâ€çš„å€¼æ— æ³•æ供长度。" + +msgid "Export Scene to glTF 2.0 File" +msgstr "将场景导出为 glTF 2.0 文件" + +msgid "glTF 2.0 Scene..." +msgstr "glTF 2.0 场景..." + +msgid "Path does not contain a Blender installation." +msgstr "è·¯å¾„æœªåŒ…å« Blender 安装。" + +msgid "Can't execute Blender binary." +msgstr "æ— æ³•æ‰§è¡Œ Blender å¯æ‰§è¡Œæ–‡ä»¶ã€‚" + +msgid "Unexpected --version output from Blender binary at: %s" +msgstr "从 Blender å¯æ‰§è¡Œæ–‡ä»¶èŽ·å¾—了æ„外的 --version 输出:%s" + +msgid "Path supplied lacks a Blender binary." +msgstr "æ供的路径缺少 Blender å¯æ‰§è¡Œæ–‡ä»¶ã€‚" + +msgid "This Blender installation is too old for this importer (not 3.0+)." +msgstr "安装的 Blender 对这个导入器æ¥è¯´å¤ªæ—§äº†ï¼ˆä¸æ˜¯ 3.0+)。" + +msgid "This Blender installation is too new for this importer (not 3.x)." +msgstr "安装的 Blender 对这个导入器æ¥è¯´å¤ªæ–°äº†ï¼ˆä¸æ˜¯ 3.x)。" + +msgid "Path to Blender installation is valid (Autodetected)." +msgstr "Blender 安装路径有效(自动检测)。" + +msgid "Path to Blender installation is valid." +msgstr "Blender 安装路径有效。" + +msgid "Configure Blender Importer" +msgstr "é…ç½® Blender 导入器" + +msgid "" +"Blender 3.0+ is required to import '.blend' files.\n" +"Please provide a valid path to a Blender installation:" +msgstr "" +"è¦å¯¼å…¥â€œ.blendâ€æ–‡ä»¶ï¼Œéœ€è¦ Blender 3.0 以上版本。\n" +"请æ供一个有效的 Blender 安装路径:" + +msgid "Disable '.blend' Import" +msgstr "ç¦ç”¨â€œ.blendâ€å¯¼å…¥" + +msgid "" +"Disables Blender '.blend' files import for this project. Can be re-enabled " +"in Project Settings." +msgstr "ç¦ç”¨æ¤é¡¹ç›®çš„ Blender“.blendâ€æ–‡ä»¶å¯¼å…¥ã€‚å¯ä»¥åœ¨é¡¹ç›®è®¾ç½®ä¸é‡æ–°å¯ç”¨ã€‚" + +msgid "Disabling '.blend' file import requires restarting the editor." +msgstr "ç¦ç”¨â€œ.blendâ€æ–‡ä»¶å¯¼å…¥éœ€è¦é‡å¯ç¼–辑器。" + msgid "Next Plane" msgstr "下一平é¢" @@ -7895,7 +12603,7 @@ msgid "GridMap Selection" msgstr "GridMap 选择" msgid "Grid Map" -msgstr "ç½‘æ ¼åœ°å›¾" +msgstr "æ …æ ¼åœ°å›¾" msgid "Edit X Axis" msgstr "编辑 X è½´" @@ -7945,12 +12653,54 @@ msgstr "GridMap 设置" msgid "Pick Distance:" msgstr "拾å–è·ç¦»ï¼š" +msgid "Filter Meshes" +msgstr "ç›é€‰ç½‘æ ¼" + msgid "Give a MeshLibrary resource to this GridMap to use its meshes." msgstr "å‘æ¤ GridMap æä¾› MeshLibrary 资æºä»¥ä½¿ç”¨å…¶ç½‘æ ¼ã€‚" +msgid "Determining optimal atlas size" +msgstr "é‡åœ¨ç¡®å®šæœ€ä½³å›¾é›†å°ºå¯¸" + +msgid "Blitting albedo and emission" +msgstr "æ£åœ¨å¤åˆ¶å照率和å‘å…‰" + +msgid "Plotting mesh into acceleration structure %d/%d" +msgstr "æ£åœ¨åŠ 速结构ä¸æž„é€ ç½‘æ ¼ %d/%d" + +msgid "Optimizing acceleration structure" +msgstr "æ£åœ¨ä¼˜åŒ–åŠ é€Ÿç»“æž„" + msgid "Begin Bake" msgstr "开始烘焙" +msgid "Preparing shaders" +msgstr "æ£åœ¨å‡†å¤‡ç€è‰²å™¨" + +msgid "Un-occluding geometry" +msgstr "æ£åœ¨å‰¥ç¦»é®æŒ¡å‡ 何体" + +msgid "Plot direct lighting" +msgstr "构建直接光照" + +msgid "Integrate indirect lighting" +msgstr "集æˆé—´æŽ¥å…‰ç…§" + +msgid "Bounce %d/%d: Integrate indirect lighting %d%%" +msgstr "åå¼¹ %d/%d:集æˆé—´æŽ¥ç…§æ˜Ž %d%%" + +msgid "Baking lightprobes" +msgstr "æ£åœ¨çƒ˜ç„™å…‰ç…§æŽ¢é’ˆ" + +msgid "Integrating light probes %d%%" +msgstr "æ£åœ¨é›†æˆå…‰ç…§æŽ¢é’ˆ %d%%" + +msgid "Denoising" +msgstr "æ£åœ¨é™å™ª" + +msgid "Retrieving textures" +msgstr "æ£åœ¨èŽ·å–纹ç†" + msgid "Class name can't be a reserved keyword" msgstr "ç±»åä¸èƒ½æ˜¯ä¿ç•™å…³é”®å—" @@ -7960,6 +12710,9 @@ msgstr "构建解决方案" msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "解ç å—节数ä¸å¤Ÿï¼Œæˆ–æ ¼å¼æ— 效。" +msgid "%d (%s)" +msgstr "%d(%s)" + msgid "%s/s" msgstr "%s/秒" @@ -7969,6 +12722,9 @@ msgstr "ä¼ å…¥ RPC" msgid "Outgoing RPC" msgstr "ä¼ å‡º RPC" +msgid "Synchronizer" +msgstr "åŒæ¥å™¨" + msgid "Config" msgstr "é…ç½®" @@ -7981,9 +12737,90 @@ msgstr "大å°" msgid "Network Profiler" msgstr "网络分æžå™¨" +msgid "Replication" +msgstr "å¤åˆ¶" + +msgid "Select a replicator node in order to pick a property to add to it." +msgstr "请选择一个å¤åˆ¶å™¨èŠ‚点,以便选å–å±žæ€§è¿›è¡Œæ·»åŠ ã€‚" + +msgid "Not possible to add a new property to synchronize without a root." +msgstr "ä¸å¯èƒ½åœ¨æ²¡æœ‰æ ¹çš„æƒ…å†µä¸‹æ·»åŠ ä¸€ä¸ªæ–°çš„å±žæ€§æ¥è¿›è¡ŒåŒæ¥ã€‚" + +msgid "Property is already being synchronized." +msgstr "属性已被åŒæ¥ã€‚" + +msgid "Add property to synchronizer" +msgstr "å°†å±žæ€§æ·»åŠ è‡³åŒæ¥å™¨" + +msgid "Pick a node to synchronize:" +msgstr "选择一个节点进行åŒæ¥ï¼š" + +msgid "Add property to sync..." +msgstr "æ·»åŠ åŒæ¥å±žæ€§..." + +msgid "Add from path" +msgstr "ä»Žè·¯å¾„æ·»åŠ " + +msgid "Spawn" +msgstr "出生" + +msgid "" +"Add properties using the buttons above or\n" +"drag them them from the inspector and drop them here." +msgstr "" +"请使用上é¢çš„æŒ‰é’®æ·»åŠ å±žæ€§æˆ–\n" +"将属性从检查器ä¸æ‹–放到这里。" + +msgid "Please select a MultiplayerSynchronizer first." +msgstr "请先选择一个 MultiplayerSynchronizer。" + +msgid "The MultiplayerSynchronizer needs a root path." +msgstr "该 MultiplayerSynchronizer 需è¦æ ¹è·¯å¾„。" + +msgid "Set spawn property" +msgstr "设置出生属性" + +msgid "Set sync property" +msgstr "设置åŒæ¥å±žæ€§" + +msgid "Delete Property?" +msgstr "åˆ é™¤å±žæ€§ï¼Ÿ" + +msgid "Remove Property" +msgstr "移除属性" + +msgid "" +"A valid NodePath must be set in the \"Spawn Path\" property in order for " +"MultiplayerSpawner to be able to spawn Nodes." +msgstr "" +"è¦è®© MultiplayerSpawner 能够生出节点,必须在“Spawn Pathâ€å±žæ€§ä¸è®¾ç½®æœ‰æ•ˆçš„ " +"NodePath。" + +msgid "" +"A valid NodePath must be set in the \"Root Path\" property in order for " +"MultiplayerSynchronizer to be able to synchronize properties." +msgstr "" +"è¦è®© MultiplayerSynchronizer 能够åŒæ¥å±žæ€§ï¼Œå¿…须在“Root Pathâ€å±žæ€§ä¸è®¾ç½®æœ‰æ•ˆçš„ " +"NodePath。" + msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "æ¤èŠ‚点需è¦è®¾ç½® NavigationMesh 资æºæ‰èƒ½æ£å¸¸å·¥ä½œã€‚" +msgid "" +"Cannot generate navigation mesh because it does not belong to the edited " +"scene. Make it unique first." +msgstr "æ— æ³•ç”Ÿæˆå¯¼èˆªç½‘æ ¼ï¼Œå› ä¸ºå®ƒä¸å±žäºŽå·²ç¼–辑的场景。请先将其唯一化。" + +msgid "" +"Cannot generate navigation mesh because it belongs to a resource which was " +"imported." +msgstr "æ— æ³•ç”Ÿæˆå¯¼èˆªç½‘æ ¼ï¼Œå› ä¸ºå®ƒå±žäºŽä¸€ä¸ªå¯¼å…¥çš„èµ„æºã€‚" + +msgid "" +"Cannot generate navigation mesh because the resource was imported from " +"another type." +msgstr "æ— æ³•ç”Ÿæˆå¯¼èˆªç½‘æ ¼ï¼Œå› ä¸ºè¯¥èµ„æºæ˜¯ä»Žå…¶ä»–类型导入的。" + msgid "Bake NavMesh" msgstr "çƒ˜ç„™å¯¼èˆªç½‘æ ¼" @@ -7994,7 +12831,7 @@ msgid "Setting up Configuration..." msgstr "æ£åœ¨è®¾ç½®é…ç½®..." msgid "Calculating grid size..." -msgstr "æ£åœ¨è®¡ç®—ç½‘æ ¼å¤§å°..." +msgstr "æ£åœ¨è®¡ç®—æ …æ ¼å¤§å°..." msgid "Creating heightfield..." msgstr "æ£åœ¨åˆ›å»ºé«˜åº¦å›¾..." @@ -8029,9 +12866,105 @@ msgstr "解æžå¤šè¾¹å½¢ä¸..." msgid "Done!" msgstr "完æˆï¼" +msgid "Toggles whether the noise preview is computed in 3D space." +msgstr "切æ¢æ˜¯å¦åœ¨ 3D 空间ä¸è®¡ç®—噪声预览。" + +msgid "Rename Action" +msgstr "é‡å‘½å动作" + +msgid "Rename Actions Localized name" +msgstr "é‡å‘½å动作本地化å称" + +msgid "Change Action Type" +msgstr "修改动作类型" + +msgid "Remove action" +msgstr "移除动作" + +msgid "Add action set" +msgstr "æ·»åŠ åŠ¨ä½œé›†" + +msgid "Remove action set" +msgstr "移除动作集" + +msgid "Add interaction profile" +msgstr "æ·»åŠ äº¤äº’é…置文件" + +msgid "Error saving file %s: %s" +msgstr "ä¿å˜æ–‡ä»¶ %s 时出错:%s" + +msgid "Error loading %s: %s." +msgstr "åŠ è½½ %s 时出错:%s。" + +msgid "OpenXR Action map:" +msgstr "OpenXR åŠ¨ä½œæ˜ å°„ï¼š" + +msgid "Remove interaction profile" +msgstr "移除交互é…置文件" + +msgid "Action Map" +msgstr "åŠ¨ä½œæ˜ å°„" + +msgid "Add Action Set" +msgstr "æ·»åŠ åŠ¨ä½œé›†" + +msgid "Add an action set." +msgstr "æ·»åŠ ä¸€ä¸ªåŠ¨ä½œé›†ã€‚" + +msgid "Add profile" +msgstr "æ·»åŠ é…置文件" + +msgid "Add an interaction profile." +msgstr "æ·»åŠ ä¸€ä¸ªäº¤äº’é…置文件。" + +msgid "Save this OpenXR action map." +msgstr "ä¿å˜è¿™ä¸ª OpenXR åŠ¨ä½œæ˜ å°„ã€‚" + +msgid "Reset to default OpenXR action map." +msgstr "é‡ç½®ä¸ºé»˜è®¤çš„ OpenXR åŠ¨ä½œæ˜ å°„ã€‚" + +msgid "Action Sets" +msgstr "动作集" + +msgid "Rename Action Set" +msgstr "é‡å‘½å动作集" + +msgid "Rename Action Sets Localized name" +msgstr "é‡å‘½å动作集本地化å称" + +msgid "Change Action Sets priority" +msgstr "更改动作集优先级" + +msgid "Add action" +msgstr "æ·»åŠ åŠ¨ä½œ" + +msgid "Delete action" +msgstr "åˆ é™¤åŠ¨ä½œ" + +msgid "OpenXR Action Map" +msgstr "OpenXR åŠ¨ä½œæ˜ å°„" + +msgid "Remove action from interaction profile" +msgstr "从交互é…ç½®ä¸ç§»é™¤åŠ¨ä½œ" + +msgid "Add binding" +msgstr "æ·»åŠ ç»‘å®š" + +msgid "Remove binding" +msgstr "移除绑定" + msgid "Pose" msgstr "姿势" +msgid "Haptic" +msgstr "触摸" + +msgid "Unknown" +msgstr "未知" + +msgid "Select an action" +msgstr "选择一个动作" + msgid "Package name is missing." msgstr "包å缺失。" @@ -8050,6 +12983,11 @@ msgstr "包段ä¸çš„第一个å—符ä¸èƒ½æ˜¯ “%sâ€ã€‚" msgid "The package must have at least one '.' separator." msgstr "包必须至少有一个 “.†分隔符。" +msgid "" +"The project name does not meet the requirement for the package name format. " +"Please explicitly specify the package name." +msgstr "项目å称ä¸ç¬¦åˆåŒ…åæ ¼å¼çš„è¦æ±‚。请显å¼æŒ‡å®šåŒ…å。" + msgid "Select device from the list" msgstr "从列表ä¸é€‰æ‹©è®¾å¤‡" @@ -8122,19 +13060,12 @@ msgstr "APK æ‰©å±•çš„å…¬é’¥æ— æ•ˆã€‚" msgid "Invalid package name:" msgstr "æ— æ•ˆçš„åŒ…å称:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "å¿…é¡»å¯ç”¨ “使用自定义构建†æ‰èƒ½ä½¿ç”¨æ’件。" +msgid "\"Hand Tracking\" is only valid when \"XR Mode\" is \"OpenXR\"." +msgstr "“手部跟踪â€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "“穿é€â€åªæœ‰åœ¨å½““XR Modeâ€æ˜¯â€œOpenXRâ€æ—¶æ‰æœ‰æ•ˆã€‚" -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "“Export AABâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚" - -msgid "" -"\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "ä¿®æ”¹â€œæœ€å° SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚" - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "â€œæœ€å° SDKâ€åº”å½“ä¸ºæœ‰æ•ˆçš„æ•´æ•°ï¼Œä½†èŽ·å¾—äº†æ— æ•ˆçš„â€œ%sâ€ã€‚" @@ -8144,10 +13075,6 @@ msgid "" msgstr "â€œæœ€å° SDKâ€ä¸èƒ½ä½ŽäºŽ %d,这是 Godot 库所需è¦çš„版本。" msgid "" -"\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." -msgstr "ä¿®æ”¹â€œç›®æ ‡ SDKâ€åªæœ‰åœ¨å½“å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„建â€æ—¶æ‰æœ‰æ•ˆã€‚" - -msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "â€œç›®æ ‡ SDKâ€åº”å½“ä¸ºæœ‰æ•ˆçš„æ•´æ•°ï¼Œä½†èŽ·å¾—äº†æ— æ•ˆçš„â€œ%sâ€ã€‚" @@ -8165,6 +13092,14 @@ msgid "Code Signing" msgstr "代ç ç¾å" msgid "" +"All 'apksigner' tools located in Android SDK 'build-tools' directory failed " +"to execute. Please check that you have the correct version installed for " +"your target sdk version. The resulting %s is unsigned." +msgstr "" +"ä½äºŽ Android SDK“build-toolsâ€ç›®å½•ä¸‹çš„所有“apksignerâ€å·¥å…·éƒ½æœªèƒ½æˆåŠŸæ‰§è¡Œã€‚请检" +"æŸ¥ä½ æ˜¯å¦ä¸ºç›®æ ‡ SDK 版本安装了æ£ç¡®çš„版本。生æˆçš„ %s 未ç¾å。" + +msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" @@ -8186,6 +13121,13 @@ msgstr "æ— æ³•å¯åŠ¨ apksigner å¯æ‰§è¡Œæ–‡ä»¶ã€‚" msgid "'apksigner' returned with error #%d" msgstr "“apksignerâ€è¿”回错误 #%d" +msgid "" +"output: \n" +"%s" +msgstr "" +"输出:\n" +"%s" + msgid "Verifying %s..." msgstr "æ£åœ¨æ ¡éªŒ %s……" @@ -8208,12 +13150,6 @@ msgid "Unsupported export format!" msgstr "ä¸æ”¯æŒçš„å¯¼å‡ºæ ¼å¼ï¼" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"å°è¯•ä»Žè‡ªå®šä¹‰æž„建的模æ¿æž„建,但是ä¸å˜åœ¨å…¶ç‰ˆæœ¬ä¿¡æ¯ã€‚请从“项目â€èœå•ä¸é‡æ–°å®‰è£…。" - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" @@ -8286,6 +13222,23 @@ msgstr "准备模æ¿" msgid "Export template not found." msgstr "找ä¸åˆ°å¯¼å‡ºæ¨¡æ¿ã€‚" +msgid "Code signing failed, see editor log for details." +msgstr "代ç ç¾å失败,详è§ç¼–辑器日志。" + +msgid "Xcode Build" +msgstr "Xcode 构建" + +msgid "Xcode project build failed, see editor log for details." +msgstr "Xcode 项目构建失败,详è§ç¼–辑器日志。" + +msgid ".ipa export failed, see editor log for details." +msgstr ".ipa 导出失败,详è§ç¼–辑器日志。" + +msgid "" +".ipa can only be built on macOS. Leaving Xcode project without building the " +"package." +msgstr ".ipa åªèƒ½åœ¨ macOS 上构建。æ£åœ¨ç¦»å¼€ Xcode 项目,未构建包。" + msgid "App Store Team ID not specified - cannot configure the project." msgstr "未指定 App Store Team ID - æ— æ³•é…置项目。" @@ -8298,6 +13251,15 @@ msgstr "ç¼ºå°‘æ ‡è¯†ç¬¦ã€‚" msgid "The character '%s' is not allowed in Identifier." msgstr "æ ‡è¯†ç¬¦ä¸ä¸å…许使用å—符“%sâ€ã€‚" +msgid "Debug Script Export" +msgstr "调试脚本导出" + +msgid "Could not open file \"%s\"." +msgstr "æ— æ³•æ‰“å¼€æ–‡ä»¶â€œ%sâ€ã€‚" + +msgid "Could not create console script." +msgstr "æ— æ³•åˆ›å»ºå‘½ä»¤è¡Œè„šæœ¬ã€‚" + msgid "Failed to open executable file \"%s\"." msgstr "打开å¯æ‰§è¡Œæ–‡ä»¶â€œ%sâ€å¤±è´¥ã€‚" @@ -8310,6 +13272,39 @@ msgstr "32 ä½å¯æ‰§è¡Œæ–‡ä»¶æ— 法内嵌 >= 4 GiB çš„æ•°æ®ã€‚" msgid "Executable \"pck\" section not found." msgstr "å¯æ‰§è¡Œæ–‡ä»¶â€œpckâ€åŒºæœªæ‰¾åˆ°ã€‚" +msgid "Stop and uninstall" +msgstr "åœæ¢å¹¶å¸è½½" + +msgid "Run on remote Linux/BSD system" +msgstr "在远程 Linux/BSD 系统上è¿è¡Œ" + +msgid "Stop and uninstall running project from the remote system" +msgstr "åœæ¢å¹¶å¸è½½æ£åœ¨è¿œç¨‹ç³»ç»Ÿä¸Šè¿è¡Œçš„项目" + +msgid "Run exported project on remote Linux/BSD system" +msgstr "在远程 Linux/BSD 系统上è¿è¡Œå¯¼å‡ºçš„项目" + +msgid "Running..." +msgstr "æ£åœ¨è¿è¡Œ..." + +msgid "Could not create temp directory:" +msgstr "æ— æ³•åˆ›å»ºä¸´æ—¶ç›®å½•ï¼š" + +msgid "Exporting project..." +msgstr "æ£åœ¨å¯¼å‡ºé¡¹ç›®..." + +msgid "Creating temporary directory..." +msgstr "æ£åœ¨åˆ›å»ºä¸´æ—¶ç›®å½•..." + +msgid "Uploading archive..." +msgstr "æ£åœ¨ä¸Šä¼ å½’æ¡£..." + +msgid "Uploading scripts..." +msgstr "æ£åœ¨ä¸Šä¼ 脚本..." + +msgid "Starting project..." +msgstr "æ£åœ¨å¯åŠ¨é¡¹ç›®..." + msgid "Can't get filesystem access." msgstr "æ— æ³•è®¿é—®æ–‡ä»¶ç³»ç»Ÿã€‚" @@ -8329,7 +13324,7 @@ msgid "Failed to create \"%s\" subfolder." msgstr "创建“%sâ€å文件夹失败。" msgid "Failed to extract thin binary." -msgstr "æå–瘦二进制文件失败。" +msgstr "æå–精简二进制文件失败。" msgid "Invalid binary format." msgstr "äºŒè¿›åˆ¶æ ¼å¼æ— 效。" @@ -8373,9 +13368,31 @@ msgstr "æ— æ³•æ‰“å¼€å›¾æ ‡æ–‡ä»¶â€œ%sâ€ã€‚" msgid "Notarization" msgstr "å…¬è¯" +msgid "" +"rcodesign path is not set. Configure rcodesign path in the Editor Settings " +"(Export > macOS > rcodesign)." +msgstr "" +"未设置 rcodesign 路径。请在编辑器设置ä¸é…ç½® rcodesign 路径(导出 > macOS > " +"rcodesign)。" + +msgid "App Store Connect issuer ID name not specified." +msgstr "未指定 App Store Connect å‘行者 ID å称。" + +msgid "App Store Connect API key ID not specified." +msgstr "未指定 App Store Connect API 密钥 ID。" + +msgid "Could not start rcodesign executable." +msgstr "æ— æ³•å¯åŠ¨ rcodesign å¯æ‰§è¡Œæ–‡ä»¶ã€‚" + +msgid "Notarization failed, see editor log for details." +msgstr "å…¬è¯å¤±è´¥ï¼Œè¯¦è§ç¼–辑器日志。" + msgid "Notarization request UUID: \"%s\"" msgstr "å…¬è¯è¯·æ±‚ UUID:“%sâ€" +msgid "The notarization process generally takes less than an hour." +msgstr "å…¬è¯è¿‡ç¨‹é€šå¸¸ä¸åˆ°ä¸€ä¸ªå°æ—¶ã€‚" + msgid "" "You can check progress manually by opening a Terminal and running the " "following command:" @@ -8386,6 +13403,23 @@ msgid "" "application (optional):" msgstr "è¿è¡Œä»¥ä¸‹å‘½ä»¤å°†å…¬è¯ç¥¨è¯è£…订到导出的应用ä¸ï¼ˆå¯é€‰ï¼‰ï¼š" +msgid "Xcode command line tools are not installed." +msgstr "未安装 Xcode 命令行工具。" + +msgid "" +"Neither Apple ID name nor App Store Connect issuer ID name not specified." +msgstr "Apple ID å称和 App Store Connect å‘行者 ID å称å‡æœªæŒ‡å®šã€‚" + +msgid "" +"Both Apple ID name and App Store Connect issuer ID name are specified, only " +"one should be set at the same time." +msgstr "" +"åŒæ—¶æŒ‡å®šäº† Apple ID å称和 App Store Connect å‘行商 ID å称,åªåº”åŒæ—¶è®¾ç½®ä¸€" +"个。" + +msgid "Apple ID password not specified." +msgstr "未指定 Apple ID 密ç 。" + msgid "Could not start xcrun executable." msgstr "æ— æ³•å¯åŠ¨ xcrun å¯æ‰§è¡Œæ–‡ä»¶ã€‚" @@ -8401,6 +13435,13 @@ msgid "Built-in CodeSign require regex module." msgstr "内置 CodeSign éœ€è¦ regex 模å—。" msgid "" +"Xrcodesign path is not set. Configure rcodesign path in the Editor Settings " +"(Export > macOS > rcodesign)." +msgstr "" +"未设置 Xrcodesign 路径。请在编辑器设置ä¸é…ç½® rcodesign 路径(导出 > macOS > " +"rcodesign)。" + +msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "æ— æ³•å¯åŠ¨ codesign å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·ç¡®ä¿å·²å®‰è£… Xcode 命令行工具。" @@ -8432,11 +13473,23 @@ msgstr "æ— æ³•æ‰¾åˆ°å¯¼å‡ºçš„æ¨¡æ¿åº”用:“%sâ€ã€‚" msgid "Invalid export format." msgstr "å¯¼å‡ºæ ¼å¼æ— 效。" +msgid "Could not create directory: \"%s\"." +msgstr "æ— æ³•åˆ›å»ºç›®å½•ï¼šâ€œ%sâ€ã€‚" + +msgid "Could not create directory \"%s\"." +msgstr "æ— æ³•åˆ›å»ºç›®å½•â€œ%sâ€ã€‚" + msgid "" "Relative symlinks are not supported on this OS, the exported project might " "be broken!" msgstr "该æ“作系统上ä¸æ”¯æŒç›¸å¯¹ç¬¦å·é“¾æŽ¥ï¼Œå¯¼å‡ºçš„项目å¯èƒ½æŸåï¼" +msgid "Could not created symlink \"%s\" -> \"%s\"." +msgstr "æ— æ³•åˆ›å»ºç¬¦å·é“¾æŽ¥ “%s†-> “%sâ€ã€‚" + +msgid "Could not open \"%s\"." +msgstr "æ— æ³•æ‰“å¼€â€œ%sâ€ã€‚" + msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." @@ -8445,11 +13498,20 @@ msgstr "未找到请求的模æ¿äºŒè¿›åˆ¶æ–‡ä»¶â€œ%sâ€ã€‚ä½ çš„æ¨¡æ¿å½’æ¡£ä¸å msgid "Making PKG" msgstr "æ£åœ¨åˆ¶ä½œ PKG" +msgid "Entitlements Modified" +msgstr "授æƒå·²ä¿®æ”¹" + msgid "" "Ad-hoc signed applications require the 'Disable Library Validation' " "entitlement to load dynamic libraries." msgstr "Ad-hoc ç¾å的应用需è¦â€œDisable Library Validationâ€æŽˆæƒæ‰èƒ½åŠ 载动æ€åº“。" +msgid "Could not create entitlements file." +msgstr "æ— æ³•åˆ›å»ºæŽˆæƒæ–‡ä»¶ã€‚" + +msgid "Could not create helper entitlements file." +msgstr "æ— æ³•åˆ›å»ºå¸®åŠ©ç¨‹åºæŽˆæƒæ–‡ä»¶ã€‚" + msgid "Code signing bundle" msgstr "æ£åœ¨å¯¹æ†ç»‘包进行代ç ç¾å" @@ -8479,9 +13541,40 @@ msgstr "å…¬è¯ï¼šä¸æ”¯æŒä½¿ç”¨ Ad-hoc ç¾å进行公è¯ã€‚" msgid "Notarization: Code signing is required for notarization." msgstr "å…¬è¯ï¼šå…¬è¯éœ€è¦ä»£ç ç¾å。" +msgid "Notarization: Xcode command line tools are not installed." +msgstr "å…¬è¯ï¼šæœªå®‰è£… Xcode 命令行工具。" + +msgid "" +"Notarization: Neither Apple ID name nor App Store Connect issuer ID name not " +"specified." +msgstr "å…¬è¯ï¼šApple ID å称和 App Store Connect å‘行者 ID å称å‡æœªæŒ‡å®šã€‚" + +msgid "" +"Notarization: Both Apple ID name and App Store Connect issuer ID name are " +"specified, only one should be set at the same time." +msgstr "" +"å…¬è¯ï¼šåŒæ—¶æŒ‡å®šäº† Apple ID å称和 App Store Connect å‘行商 ID å称,åªåº”åŒæ—¶è®¾" +"置一个。" + msgid "Notarization: Apple ID password not specified." msgstr "å…¬è¯ï¼šæœªæŒ‡å®š Apple ID 密ç 。" +msgid "Notarization: App Store Connect API key ID not specified." +msgstr "å…¬è¯ï¼šæœªæŒ‡å®š App Store Connect API 密钥 ID。" + +msgid "Notarization: Apple Team ID not specified." +msgstr "å…¬è¯ï¼šæœªæŒ‡å®š Apple Team ID。" + +msgid "Notarization: App Store Connect issuer ID name not specified." +msgstr "å…¬è¯ï¼šæœªæŒ‡å®š App Store Connect å‘行者 ID å称。" + +msgid "" +"Notarization: rcodesign path is not set. Configure rcodesign path in the " +"Editor Settings (Export > macOS > rcodesign)." +msgstr "" +"å…¬è¯ï¼šæ²¡æœ‰è®¾ç½® rcodesign 路径。请在编辑器设置ä¸é…ç½® rcodesign 路径(导出 > " +"macOS > rcodesign)。" + msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." @@ -8497,6 +13590,21 @@ msgstr "" "Silicon çš„ Mac 上è¿è¡Œã€‚" msgid "" +"Code signing: Using ad-hoc signature. The exported project will be blocked " +"by Gatekeeper" +msgstr "代ç ç¾å:使用临时ç¾å。导出的项目将被 Gatekeeper 阻æ¢" + +msgid "Code signing: Xcode command line tools are not installed." +msgstr "代ç ç¾å:未安装 Xcode 命令行工具。" + +msgid "" +"Code signing: rcodesign path is not set. Configure rcodesign path in the " +"Editor Settings (Export > macOS > rcodesign)." +msgstr "" +"代ç ç¾å:没有设置 rcodesign 路径。请在编辑器设置ä¸é…ç½® rcodesign 路径(导出 " +"> macOS > rcodesign)。" + +msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "éšç§ï¼šå·²å¯ç”¨éº¦å…‹é£Žè®¿é—®ï¼Œä½†æœªæŒ‡å®šç”¨é€”æ述。" @@ -8524,6 +13632,12 @@ msgid "" "specified." msgstr "éšç§ï¼šå·²å¯ç”¨ç…§ç‰‡åº“访问,但未指定用途æ述。" +msgid "Run on remote macOS system" +msgstr "在远程 MacOS 系统上è¿è¡Œ" + +msgid "Run exported project on remote macOS system" +msgstr "在远程 MacOS 系统上è¿è¡Œå¯¼å‡ºçš„项目" + msgid "Invalid package short name." msgstr "æ— æ•ˆçš„åŒ…çŸå称。" @@ -8599,6 +13713,9 @@ msgstr "使用默认æµè§ˆå™¨æ‰“开导出的 HTML 文件。" msgid "Resources Modification" msgstr "资æºä¿®æ”¹" +msgid "Icon size \"%d\" is missing." +msgstr "ç¼ºå°‘å›¾æ ‡å°ºå¯¸â€œ%dâ€ã€‚" + msgid "Failed to rename temporary file \"%s\"." msgstr "é‡å‘½å临时文件“%sâ€å¤±è´¥ã€‚" @@ -8608,6 +13725,17 @@ msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° rcedit å¯æ‰§è¡Œæ–‡ä»¶ã€‚" msgid "Could not find wine executable at \"%s\"." msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° wine å¯æ‰§è¡Œæ–‡ä»¶ã€‚" +msgid "Invalid icon file \"%s\"." +msgstr "æ— æ•ˆçš„å›¾æ ‡æ–‡ä»¶â€œ%sâ€ã€‚" + +msgid "" +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." +msgstr "" +"æ— æ³•å¯åŠ¨ rcedit å¯æ‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " +"> Rcedit),或在导出预设ä¸ç¦ç”¨â€œåº”用 > 修改资æºâ€ã€‚" + msgid "rcedit failed to modify executable: %s." msgstr "rcedit 修改å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" @@ -8626,12 +13754,35 @@ msgstr "èº«ä»½ç±»åž‹æ— æ•ˆã€‚" msgid "Invalid timestamp server." msgstr "时间戳æœåŠ¡å™¨æ— 效。" +msgid "" +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > signtool), or disable \"Codesign\" in the " +"export preset." +msgstr "" +"æ— æ³•å¯åŠ¨ signtool å¯æ‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® signtool 路径(导出 > " +"Windows > Signtool),或在导出预设ä¸ç¦ç”¨â€œä»£ç ç¾åâ€ã€‚" + +msgid "" +"Could not start osslsigncode executable. Configure signtool path in the " +"Editor Settings (Export > Windows > osslsigncode), or disable \"Codesign\" " +"in the export preset." +msgstr "" +"æ— æ³•å¯åŠ¨ osslsigncode å¯æ‰§è¡Œæ–‡ä»¶ã€‚请在编辑器设置ä¸é…ç½® signtool 路径(导出 > " +"Windows > Signtool),或在导出预设ä¸ç¦ç”¨â€œä»£ç ç¾åâ€ã€‚" + msgid "Signtool failed to sign executable: %s." msgstr "Signtool ç¾åå¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š%s。" msgid "Failed to remove temporary file \"%s\"." msgstr "移除临时文件“%sâ€å¤±è´¥ã€‚" +msgid "" +"The rcedit tool must be configured in the Editor Settings (Export > Windows " +"> rcedit) to change the icon or app information data." +msgstr "" +"必须在编辑器设置ä¸é…ç½® rcedit 工具(导出 > Windows > Rcedit)æ‰èƒ½ä¿®æ”¹å›¾æ ‡æˆ–应" +"用信æ¯æ•°æ®ã€‚" + msgid "Invalid icon path:" msgstr "å›¾æ ‡è·¯å¾„æ— æ•ˆï¼š" @@ -8644,6 +13795,26 @@ msgstr "产å“ç‰ˆæœ¬æ— æ•ˆï¼š" msgid "Windows executables cannot be >= 4 GiB." msgstr "Windows å¯æ‰§è¡Œæ–‡ä»¶ä¸èƒ½ >= 4GiB。" +msgid "Run on remote Windows system" +msgstr "在远程 Windows 系统上è¿è¡Œ" + +msgid "Run exported project on remote Windows system" +msgstr "在远程 Windows 系统上è¿è¡Œå¯¼å‡ºçš„项目" + +msgid "" +"A SpriteFrames resource must be created or set in the \"Frames\" property in " +"order for AnimatedSprite2D to display frames." +msgstr "" +"必须在“Framesâ€å±žæ€§ä¸åˆ›å»ºæˆ–设置 SpriteFrames 资æºï¼Œè®© AnimatedSprite2D 显示" +"帧。" + +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instantiated " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" +"æ¯ä¸ªåœºæ™¯ï¼ˆæˆ–一组实例化的场景)åªå…许一个å¯è§çš„CanvasModulate。第一个创建的将" +"会起作用,而其他的将会被忽略。" + msgid "" "This node has no shape, so it can't collide or interact with other objects.\n" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " @@ -8653,6 +13824,15 @@ msgstr "" "è¯·æ·»åŠ ä¸€ä¸ª CollisionShape2D 或 CollisionPolygon2D 类型的å节点æ¥å®šä¹‰å®ƒçš„å½¢" "状。" +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape." +msgstr "" +"CollisionPolygon2D 节点åªèƒ½ä¸º CollisionObject2D 的派生类æ供碰撞形状,请将其" +"作为 Area2Dã€StaticBody2Dã€RigidBody2D 或 CharacterBody2D çš„å节点以æ供形" +"状。" + msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空的 CollisionPolygon2D ä¸èµ·ä»»ä½•ç¢°æ’žæ£€æµ‹ä½œç”¨ã€‚" @@ -8667,6 +13847,14 @@ msgid "" msgstr "父节点为 Area2D 时将忽略 One Way Collision 属性。" msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, CharacterBody2D, etc. to give them a shape." +msgstr "" +"CollisionShape2D 节点åªèƒ½ä¸º CollisionObject2D 的派生类æ供碰撞形状,请将其作" +"为 Area2Dã€StaticBody2Dã€RigidBody2D 或 CharacterBody2D çš„å节点以æ供形状。" + +msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "CollisionShape2D 必须有形状æ‰èƒ½å·¥ä½œã€‚请先为其创建形状资æºï¼" @@ -8733,6 +13921,13 @@ msgid "" msgstr "NavigationObstacle2D åªèƒ½ç”¨äºŽä¸º Node2D 对象é¿å…碰撞。" msgid "" +"A NavigationMesh resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" +"必须为这个节点设置或创建 NavigationMesh 资æºï¼Œæ‰èƒ½æ£å¸¸å·¥ä½œã€‚请设置属性或绘制" +"多边形。" + +msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" "ParallaxLayer 类型的节点必须作为 ParallaxBackground çš„å节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" @@ -8740,9 +13935,42 @@ msgstr "" msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "PathFollow2D 类型的节点åªæœ‰ä½œä¸º Path2D çš„å节点节æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" +msgid "" +"A PhysicalBone2D only works with a Skeleton2D or another PhysicalBone2D as a " +"parent node!" +msgstr "" +"PhysicalBone2D åªæœ‰åœ¨æœ‰ Skeleton2D 或其他 PhysicalBone2D 作为父节点的情况下æ‰" +"能工作ï¼" + +msgid "" +"A PhysicalBone2D needs to be assigned to a Bone2D node in order to function! " +"Please set a Bone2D node in the inspector." +msgstr "" +"PhysicalBone2D 需è¦åˆ†é…ç»™ Bone2D 节点,æ‰èƒ½å‘挥作用ï¼è¯·åœ¨æ£€æŸ¥å™¨ä¸è®¾ç½® Bone2D " +"节点。" + +msgid "" +"A PhysicalBone2D node should have a Joint2D-based child node to keep bones " +"connected! Please add a Joint2D-based node as a child to this node!" +msgstr "" +"一个 PhysicalBone2D 节点应该有一个基于 Joint2D çš„å节点æ¥ä¿æŒéª¨éª¼çš„连接ï¼è¯·æ·»" +"åŠ ä¸€ä¸ªåŸºäºŽ Joint2D 的节点作为其å节点ï¼" + +msgid "" +"Size changes to RigidBody2D will be overridden by the physics engine when " +"running.\n" +"Change the size in children collision shapes instead." +msgstr "" +"对 RigidBody2D 大å°çš„修改,将会在è¿è¡Œæ—¶è¢«ç‰©ç†å¼•æ“Žæ‰€è¦†ç›–。\n" +"建议修改å节点的碰撞体形状大å°ã€‚" + msgid "Path property must point to a valid Node2D node to work." msgstr "Path 属性必须指å‘有效的 Node2D 节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" +msgid "" +"This node cannot interact with other objects unless a Shape2D is assigned." +msgstr "除éžæŒ‡å®š Shape2D,å¦åˆ™è¯¥èŠ‚点ä¸èƒ½ä¸Žå…¶ä»–对象交互。" + msgid "This Bone2D chain should end at a Skeleton2D node." msgstr "è¿™æ¡ Bone2D 链应该以 Skeleton2D 节点结æŸã€‚" @@ -8754,12 +13982,313 @@ msgid "" "This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." msgstr "è¿™æ ¹éª¨éª¼æ²¡æœ‰åˆé€‚的放æ¾å§¿åŠ¿ã€‚请到 Skeleton2D 节点ä¸è®¾ç½®ä¸€ä¸ªã€‚" +msgid "" +"A Y-sorted layer has the same Z-index value as a not Y-sorted layer.\n" +"This may lead to unwanted behaviors, as a layer that is not Y-sorted will be " +"Y-sorted as a whole with tiles from Y-sorted layers." +msgstr "" +"Y 排åºå›¾å±‚ä¸Žéž Y 排åºå›¾å±‚具有相åŒçš„ Z 索引值。\n" +"è¿™å¯èƒ½ä¼šå¯¼è‡´ä¸éœ€è¦çš„è¡Œä¸ºï¼Œå› ä¸ºæœªæŒ‰ Y 排åºçš„层将作为一个整体,与æ¥è‡ª Y 排åºå±‚" +"的图å—一起进行 Y 排åºã€‚" + +msgid "" +"Isometric TileSet will likely not look as intended without Y-sort enabled " +"for the TileMap and all of its layers." +msgstr "" +"如果ä¸å¯¹ TileMap 和它的所有层å¯ç”¨ Y-sort,Isometric TileSet å¯èƒ½çœ‹èµ·æ¥ä¸åƒé¢„" +"æœŸçš„é‚£æ ·ã€‚" + +msgid "" +"External Skeleton3D node not set! Please set a path to an external " +"Skeleton3D node." +msgstr "未设置外部 Skeleton3D 节点ï¼è¯·è®¾ç½®å¤–部 Skeleton3D 节点的路径。" + +msgid "" +"Parent node is not a Skeleton3D node! Please use an external Skeleton3D if " +"you intend to use the BoneAttachment3D without it being a child of a " +"Skeleton3D node." +msgstr "" +"父节点ä¸æ˜¯ Skeleton3D 节点ï¼å¦‚æžœä¸æƒ³è®© BoneAttachment3D æˆä¸º Skeleton3D 节点" +"çš„å节点,请使用外部 Skeleton3D。" + +msgid "" +"BoneAttachment3D node is not bound to any bones! Please select a bone to " +"attach this node." +msgstr "BoneAttachment3D 节点未绑定至任何骨头ï¼è¯·é€‰æ‹©è¿™ä¸ªèŠ‚ç‚¹é™„åŠ çš„éª¨å¤´ã€‚" + +msgid "" +"This node has no shape, so it can't collide or interact with other objects.\n" +"Consider adding a CollisionShape3D or CollisionPolygon3D as a child to " +"define its shape." +msgstr "" +"è¿™ä¸ªèŠ‚ç‚¹æ²¡æœ‰å½¢çŠ¶ï¼Œå› æ¤æ— 法与其他物体产生碰撞或者进行交互。\n" +"è¯·æ·»åŠ ä¸€ä¸ª CollisionShape3D 或 CollisionPolygon3D 类型的å节点æ¥å®šä¹‰å®ƒçš„å½¢" +"状。" + +msgid "" +"With a non-uniform scale this node will probably not function as expected.\n" +"Please make its scale uniform (i.e. the same on all axes), and change the " +"size in children collision shapes instead." +msgstr "" +"缩放ä¸ç»Ÿä¸€ï¼Œè¿™ä¸ªèŠ‚点很å¯èƒ½æ— 法æ£å¸¸å·¥ä½œã€‚\n" +"请统一其缩放(å³å„è½´å‡ç›¸åŒï¼‰ï¼Œä¿®æ”¹å碰撞形状节点的大å°ã€‚" + +msgid "" +"CollisionPolygon3D only serves to provide a collision shape to a " +"CollisionObject3D derived node.\n" +"Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, " +"CharacterBody3D, etc. to give them a shape." +msgstr "" +"CollisionPolygon3D 类型节点åªèƒ½ä¸º CollisionObject3D 的派生类æ供碰撞形状。\n" +"请将其放在 Area3Dã€StaticBody3Dã€RigidBody3Dã€CharacterBody3D ç‰èŠ‚点下æ供形" +"状。" + +msgid "An empty CollisionPolygon3D has no effect on collision." +msgstr "空的 CollisionPolygon3D ä¸å½±å“碰撞。" + +msgid "" +"A non-uniformly scaled CollisionPolygon3D node will probably not function as " +"expected.\n" +"Please make its scale uniform (i.e. the same on all axes), and change its " +"polygon's vertices instead." +msgstr "" +"CollisionPolygon3D 节点的缩放ä¸ç»Ÿä¸€ï¼Œå¾ˆå¯èƒ½æ— 法æ£å¸¸å·¥ä½œã€‚\n" +"请统一其缩放(å³å„è½´å‡ç›¸åŒï¼‰ï¼Œä¿®æ”¹å¤šè¾¹å½¢çš„顶点。" + +msgid "" +"A shape must be provided for CollisionShape3D to function. Please create a " +"shape resource for it." +msgstr "CollisionShape3D 必须有形状æ‰èƒ½å·¥ä½œã€‚请先为其创建形状资æºã€‚" + +msgid "" +"ConcavePolygonShape3D doesn't support RigidBody3D in another mode than " +"static." +msgstr "ConcavePolygonShape3D ä¸æ”¯æŒé™æ€æ¨¡å¼ä»¥å¤–çš„ RigidBody3D。" + +msgid "" +"WorldBoundaryShape3D doesn't support RigidBody3D in another mode than static." +msgstr "WorldBoundaryShape3D ä¸æ”¯æŒé™æ€æ¨¡å¼ä»¥å¤–çš„ RigidBody3D。" + +msgid "" +"A non-uniformly scaled CollisionShape3D node will probably not function as " +"expected.\n" +"Please make its scale uniform (i.e. the same on all axes), and change the " +"size of its shape resource instead." +msgstr "" +"缩放ä¸ä¸€è‡´çš„ CollisionShape3D 节点å¯èƒ½ä¸ä¼šåƒé¢„æœŸåœ°é‚£æ ·å·¥ä½œã€‚\n" +"请使其缩放统一(å³åœ¨æ‰€æœ‰è½´ä¸Šçš„值相ç‰ï¼‰ï¼Œæ”¹å˜å…¶å½¢çŠ¶èµ„æºçš„大å°è€Œä¸æ˜¯ç¼©æ”¾å€¼ã€‚" + msgid "Nothing is visible because no mesh has been assigned." msgstr "æœªæŒ‡å®šç½‘æ ¼ï¼Œæ— å¯è§å†…容。" msgid "" +"CPUParticles3D animation requires the usage of a StandardMaterial3D whose " +"Billboard Mode is set to \"Particle Billboard\"." +msgstr "" +"CPUParticles3D 动画需è¦ä½¿ç”¨ StandardMaterial3D,其 Billboard Mode 应被设置" +"为“Particle Billboardâ€ã€‚" + +msgid "" +"The decal has no textures loaded into any of its texture properties, and " +"will therefore not be visible." +msgstr "该贴花的所有纹ç†å±žæ€§ä¸éƒ½æ²¡æœ‰åŠ 载纹ç†ï¼Œå› æ¤å°†ä¸å¯è§ã€‚" + +msgid "" +"The decal has a Normal and/or ORM texture, but no Albedo texture is set.\n" +"An Albedo texture with an alpha channel is required to blend the normal/ORM " +"maps onto the underlying surface.\n" +"If you don't want the Albedo texture to be visible, set Albedo Mix to 0." +msgstr "" +"该贴花设有法线和/或 ORM 纹ç†ï¼Œä½†æ²¡æœ‰è®¾ç½®å照率纹ç†ã€‚\n" +"å˜åœ¨å¸¦æœ‰ Alpha 通é“çš„å照率纹ç†ï¼Œæ‰èƒ½å°†æ³•çº¿/ORM 贴图混åˆåˆ°åº•å±‚表é¢ã€‚\n" +"å¦‚æžœä½ ä¸å¸Œæœ›å照率纹ç†å¯è§ï¼Œè¯·å°† Albedo Mix 设置为 0。" + +msgid "" +"The decal's Cull Mask has no bits enabled, which means the decal will not " +"paint objects on any layer.\n" +"To resolve this, enable at least one bit in the Cull Mask property." +msgstr "" +"该贴花的 Cull Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€è¯¥è´´èŠ±ä¸ä¼šåœ¨ä»»ä½•å±‚上绘制对象。\n" +"è¦è§£å†³æ¤é—®é¢˜ï¼Œè¯·åœ¨ Cull Mask 属性ä¸è‡³å°‘å¯ç”¨ä¸€ä½ã€‚" + +msgid "" "Nothing is visible because meshes have not been assigned to draw passes." -msgstr "ç²’åä¸å¯è§ï¼Œå› ä¸ºæ²¡æœ‰ç½‘æ ¼æŒ‡å®šåˆ°ç»˜åˆ¶é€šé“ (Draw Pass)。" +msgstr "ç²’åä¸å¯è§ï¼Œå› 为绘制阶段ä¸æ²¡æœ‰æŒ‡å®šç½‘æ ¼ã€‚" + +msgid "" +"Particles animation requires the usage of a BaseMaterial3D whose Billboard " +"Mode is set to \"Particle Billboard\"." +msgstr "" +"ç²’å动画需è¦ä½¿ç”¨ BaseMaterial3D,其 Billboard Mode 应被设置为“Particle " +"Billboardâ€ã€‚" + +msgid "" +"Using Trail meshes with a skin causes Skin to override Trail poses. Suggest " +"removing the Skin." +msgstr "åŒæ—¶ä½¿ç”¨å°¾è¿¹ç½‘æ ¼å’Œçš®è‚¤ä¼šå¯¼è‡´çš®è‚¤è¦†ç›–å°¾è¿¹çš„å§¿åŠ¿ã€‚å»ºè®®ç§»é™¤è¯¥çš®è‚¤ã€‚" + +msgid "Trails active, but neither Trail meshes or a Skin were found." +msgstr "å°¾è¿¹å·²æ¿€æ´»ï¼Œä½†æœªæ‰¾åˆ°å°¾è¿¹ç½‘æ ¼æˆ–çš®è‚¤ã€‚" + +msgid "" +"Only one Trail mesh is supported. If you want to use more than a single " +"mesh, a Skin is needed (see documentation)." +msgstr "仅支æŒå•ä¸ªå°¾è¿¹ç½‘æ ¼ã€‚å¦‚æžœä½ æƒ³ä½¿ç”¨å¤šä¸ªç½‘æ ¼ï¼Œåˆ™éœ€è¦çš®è‚¤ï¼ˆè§æ–‡æ¡£ï¼‰ã€‚" + +msgid "" +"Trails enabled, but one or more mesh materials are either missing or not set " +"for trails rendering." +msgstr "尾迹已å¯ç”¨ï¼Œä½†è‡³å°‘æœ‰ä¸€ä¸ªç½‘æ ¼æ质处于缺失状æ€ï¼Œæˆ–未设置尾迹渲染。" + +msgid "" +"The Bake Mask has no bits enabled, which means baking will not produce any " +"collision for this GPUParticlesCollisionSDF3D.\n" +"To resolve this, enable at least one bit in the Bake Mask property." +msgstr "" +"Bake Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€çƒ˜ç„™ä¸ä¼šä¸ºæ¤ GPUParticlesCollisionSDF3D 生" +"æˆä»»ä½•ç¢°æ’žã€‚\n" +"è¦è§£å†³æ¤é—®é¢˜ï¼Œè¯·åœ¨ Bake Mask 属性ä¸è‡³å°‘å¯ç”¨ä¸€ä½ã€‚" + +msgid "Node A and Node B must be PhysicsBody3Ds" +msgstr "Node A 与 Node B 必须为 PhysicsBody3D" + +msgid "Node A must be a PhysicsBody3D" +msgstr "Node A 必须为 PhysicsBody3D" + +msgid "Node B must be a PhysicsBody3D" +msgstr "Node B 必须为 PhysicsBody3D" + +msgid "Joint is not connected to any PhysicsBody3Ds" +msgstr "Joint 未连接到任何 PhysicsBody3D" + +msgid "Node A and Node B must be different PhysicsBody3Ds" +msgstr "Node A 与 Node B 必须为ä¸åŒçš„ PhysicsBody3D" + +msgid "A light's scale does not affect the visual size of the light." +msgstr "ç¯å…‰çš„缩放ä¸ä¼šå½±å“ç¯å…‰çš„视觉尺寸。" + +msgid "Projector texture only works with shadows active." +msgstr "投影纹ç†ä»…在阴影激活时能够æ£å¸¸å·¥ä½œã€‚" + +msgid "A SpotLight3D with an angle wider than 90 degrees cannot cast shadows." +msgstr "角度大于 90 度的 SpotLight3D æ— æ³•æŠ•å°„é˜´å½±ã€‚" + +msgid "Finding meshes, lights and probes" +msgstr "æ£åœ¨æŸ¥æ‰¾ç½‘æ ¼ã€ç¯å…‰å’ŒæŽ¢é’ˆ" + +msgid "Preparing geometry %d/%d" +msgstr "æ£åœ¨å‡†å¤‡å‡ 何体 %d/%d" + +msgid "Creating probes" +msgstr "æ£åœ¨åˆ›å»ºæŽ¢é’ˆ" + +msgid "Creating probes from mesh %d/%d" +msgstr "æ£åœ¨ä»Žç½‘æ ¼åˆ›å»ºæŽ¢é’ˆ %d/%d" + +msgid "Preparing Lightmapper" +msgstr "æ£åœ¨å‡†å¤‡å…‰ç…§è´´å›¾å™¨" + +msgid "Preparing Environment" +msgstr "æ£åœ¨å‡†å¤‡çŽ¯å¢ƒ" + +msgid "Generating Probe Volumes" +msgstr "æ£åœ¨ç”ŸæˆæŽ¢é’ˆä½“积" + +msgid "Generating Probe Acceleration Structures" +msgstr "æ£åœ¨ç”ŸæˆæŽ¢é’ˆåŠ 速结构" + +msgid "" +"The NavigationAgent3D can be used only under a Node3D inheriting parent node." +msgstr "NavigationAgent3D åªèƒ½åœ¨ç»§æ‰¿ Node3D 的父节点下使用。" + +msgid "" +"The NavigationObstacle3D only serves to provide collision avoidance to a " +"Node3D inheriting parent object." +msgstr "NavigationObstacle3D åªèƒ½ç”¨äºŽä¸ºç»§æ‰¿è‡ª Node3D 的父级对象é¿å…碰撞。" + +msgid "" +"Occlusion culling is disabled in the Project Settings, which means occlusion " +"culling won't be performed in the root viewport.\n" +"To resolve this, open the Project Settings and enable Rendering > Occlusion " +"Culling > Use Occlusion Culling." +msgstr "" +"“项目设置â€ä¸ç¦ç”¨äº†é®æŒ¡å‰”除,这æ„味ç€åœ¨æ ¹è§†å£ä¸ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”除。\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·æ‰“开“项目设置â€å¹¶å¯ç”¨â€œæ¸²æŸ“ > é®æŒ¡å‰”除 > 使用é®æŒ¡å‰”除â€ã€‚" + +msgid "" +"The Bake Mask has no bits enabled, which means baking will not produce any " +"occluder meshes for this OccluderInstance3D.\n" +"To resolve this, enable at least one bit in the Bake Mask property." +msgstr "" +"Bake Mask 没有å¯ç”¨ä»»ä½•ä½ï¼Œè¿™æ„味ç€çƒ˜ç„™æ—¶ä¸ä¼šä¸ºè¿™ä¸ª OccluderInstance3D 生æˆä»»" +"何é®æŒ¡ç½‘æ ¼ã€‚\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·åœ¨ Bake Mask 属性ä¸è‡³å°‘å¯ç”¨ä¸€ä¸ªä½ã€‚" + +msgid "" +"No occluder mesh is defined in the Occluder property, so no occlusion " +"culling will be performed using this OccluderInstance3D.\n" +"To resolve this, set the Occluder property to one of the primitive occluder " +"types or bake the scene meshes by selecting the OccluderInstance3D and " +"pressing the Bake Occluders button at the top of the 3D editor viewport." +msgstr "" +"Occluder 属性ä¸æ²¡æœ‰å®šä¹‰é®æŒ¡ç½‘æ ¼ï¼Œæ‰€ä»¥ä½¿ç”¨è¿™ä¸ª OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡" +"剔除。\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œå¯ä»¥å°† Occluder 属性设置为基本é®æŒ¡å™¨ç±»åž‹ä¹‹ä¸€ï¼Œæˆ–者通过选择 " +"OccluderInstance3D 并使用 3D 编辑器视å£é¡¶éƒ¨çš„“烘焙é®æŒ¡å™¨â€æŒ‰é’®æ¥çƒ˜ç„™åœºæ™¯ç½‘æ ¼ã€‚" + +msgid "" +"The occluder mesh has less than 3 vertices, so no occlusion culling will be " +"performed using this OccluderInstance3D.\n" +"To generate a proper occluder mesh, select the OccluderInstance3D then use " +"the Bake Occluders button at the top of the 3D editor viewport." +msgstr "" +"é®æŒ¡ç½‘æ ¼çš„é¡¶ç‚¹å°‘äºŽ 3 个,所以使用这个 OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”除。\n" +"è¦ç”Ÿæˆæ£ç¡®çš„é®æŒ¡ç½‘æ ¼ï¼Œè¯·é€‰æ‹© OccluderInstance3D,然åŽä½¿ç”¨ 3D 编辑器视å£é¡¶éƒ¨" +"的“烘焙é®æŒ¡å™¨â€æŒ‰é’®ã€‚" + +msgid "" +"The polygon occluder has less than 3 vertices, so no occlusion culling will " +"be performed using this OccluderInstance3D.\n" +"Vertices can be added in the inspector or using the polygon editing tools at " +"the top of the 3D editor viewport." +msgstr "" +"多边形é®æŒ¡å™¨çš„顶点少于 3 ä¸ªï¼Œå› æ¤ä½¿ç”¨è¿™ä¸ª OccluderInstance3D ä¸ä¼šè¿›è¡Œé®æŒ¡å‰”" +"除。\n" +"å¯ä»¥åœ¨æ£€æŸ¥å™¨ä¸æ·»åŠ 顶点,也å¯ä»¥ä½¿ç”¨ 3D 编辑器视å£é¡¶éƒ¨çš„å¤šè¾¹å½¢ç¼–è¾‘å·¥å…·æ·»åŠ é¡¶" +"点。" + +msgid "PathFollow3D only works when set as a child of a Path3D node." +msgstr "PathFollow3D åªæœ‰ä½œä¸º Path3D çš„å节点节æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" + +msgid "" +"PathFollow3D's ROTATION_ORIENTED requires \"Up Vector\" to be enabled in its " +"parent Path3D's Curve resource." +msgstr "" +"PathFollow3D çš„ ROTATION_ORIENTED è¦æ±‚在其父级 Path3D çš„ Curve 资æºä¸å¯ç”¨â€œUp " +"Vectorâ€ã€‚" + +msgid "" +"Scale changes to RigidBody3D will be overridden by the physics engine when " +"running.\n" +"Please change the size in children collision shapes instead." +msgstr "" +"对 RigidBody3D 尺寸的修改将会在è¿è¡Œæ—¶è¢«ç‰©ç†å¼•æ“Žæ‰€è¦†ç›–。\n" +"请改为修改å节点的碰撞形状的尺寸。" + +msgid "" +"The \"Remote Path\" property must point to a valid Node3D or Node3D-derived " +"node to work." +msgstr "" +"“Remote Pathâ€å±žæ€§å¿…须指å‘有效的 Node3D 或从 Node3D 派生的节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" + +msgid "" +"This node cannot interact with other objects unless a Shape3D is assigned." +msgstr "除éžæŒ‡å®š Shape3D,å¦åˆ™è¯¥èŠ‚点ä¸èƒ½ä¸Žå…¶ä»–对象交互。" + +msgid "" +"ShapeCast3D does not support ConcavePolygonShape3Ds. Collisions will not be " +"reported." +msgstr "ShapeCast3D ä¸æ”¯æŒ ConcavePolygonShape3Dã€‚å°†æ— æ³•æ±‡æŠ¥ç¢°æ’žã€‚" msgid "This body will be ignored until you set a mesh." msgstr "åœ¨è®¾ç½®ç½‘æ ¼ä¹‹å‰ï¼Œå°†å¿½ç•¥è¯¥å®žä½“。" @@ -8771,18 +14300,103 @@ msgstr "" "必须在 “Frames†属性ä¸åˆ›å»ºæˆ–设置 SpriteFrames 资æºï¼ŒAnimatedSprite3D æ‰ä¼šæ˜¾ç¤º" "帧。" +msgid "" +"VehicleWheel3D serves to provide a wheel system to a VehicleBody3D. Please " +"use it as a child of a VehicleBody3D." +msgstr "" +"VehicleWheel3D 是用æ¥ä¸º VehicleBody3D æ供车轮系统的。请将它用作 " +"VehicleBody3D çš„å节点。" + +msgid "" +"The GeometryInstance3D visibility range's End distance is set to a non-zero " +"value, but is lower than the Begin distance.\n" +"This means the GeometryInstance3D will never be visible.\n" +"To resolve this, set the End distance to 0 or to a value greater than the " +"Begin distance." +msgstr "" +"GeometryInstance3D å¯è§†èŒƒå›´çš„结æŸè·ç¦»è¢«è®¾ä¸ºéžé›¶å€¼ï¼Œä½†ä½ŽäºŽå¼€å§‹è·ç¦»ã€‚\n" +"è¿™æ„味ç€è¯¥ GeometryInstance3D 将永远ä¸å¯è§ã€‚\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†ç»“æŸè·ç¦»è®¾ä¸º 0 或设为大于开始è·ç¦»çš„值。" + +msgid "" +"The GeometryInstance3D is configured to fade in smoothly over distance, but " +"the fade transition distance is set to 0.\n" +"To resolve this, increase Visibility Range Begin Margin above 0." +msgstr "" +"GeometryInstance3D 被é…置为éšè·ç¦»å¹³æ»‘淡入,但淡入过渡è·ç¦»è¢«è®¾ä¸º 0。\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†å¯è§åº¦èŒƒå›´èµ·å§‹è¾¹è·å¢žåŠ 到 0 以上。" + +msgid "" +"The GeometryInstance3D is configured to fade out smoothly over distance, but " +"the fade transition distance is set to 0.\n" +"To resolve this, increase Visibility Range End Margin above 0." +msgstr "" +"GeometryInstance3D 被é…置为éšè·ç¦»å¹³æ»‘淡出,但淡出过渡è·ç¦»è¢«è®¾ç½®ä¸º 0。\n" +"è¦è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œè¯·å°†å¯è§åº¦èŒƒå›´ç»“æŸè¾¹è·å¢žåŠ 到 0 以上。" + msgid "Plotting Meshes" msgstr "æ£åœ¨ç»˜åˆ¶ç½‘æ ¼" msgid "Finishing Plot" msgstr "æ£åœ¨å®Œæˆç»˜åˆ¶" +msgid "Generating Distance Field" +msgstr "æ£åœ¨ç”Ÿæˆè·ç¦»åœº" + +msgid "" +"VoxelGIs are not supported by the OpenGL video driver.\n" +"Use a LightmapGI instead." +msgstr "" +"OpenGL 视频驱动ä¸æ”¯æŒ VoxelGI。\n" +"请改用 LightmapGI。" + +msgid "" +"No VoxelGI data set, so this node is disabled. Bake static objects to enable " +"GI." +msgstr "没有 VoxelGI æ•°æ®é›†ï¼Œæ‰€ä»¥è¿™ä¸ªèŠ‚点已ç¦ç”¨ã€‚è¦å¯ç”¨ GI,请烘焙é™æ€å¯¹è±¡ã€‚" + +msgid "" +"To have any visible effect, WorldEnvironment requires its \"Environment\" " +"property to contain an Environment, its \"Camera Attributes\" property to " +"contain a CameraAttributes resource, or both." +msgstr "" +"è¦äº§ç”Ÿå¯è§æ•ˆæžœï¼Œéœ€è¦è®© WorldEnvironment 的“Environmentâ€å±žæ€§åŒ…å« Environment," +"或让其“Camera Attributesâ€å±žæ€§åŒ…å« CameraAttributes 资æºï¼Œä¸¤è€…也å¯åŒæ—¶è®¾ç½®ã€‚" + +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instantiated " +"scenes)." +msgstr "æ¯ä¸ªåœºæ™¯ä¸åªå…许有一个 WorldEnvironment(å«å®žä¾‹åŒ–的场景)。" + +msgid "XRCamera3D must have an XROrigin3D node as its parent." +msgstr "XRCamera3D 必须将 XROrigin3D 节点作为其父节点。" + +msgid "XRController3D must have an XROrigin3D node as its parent." +msgstr "XRController3D 必须将 XROrigin3D 节点作为其父节点。" + +msgid "No tracker name is set." +msgstr "未设置追踪器å称。" + +msgid "No pose is set." +msgstr "未设置姿势。" + +msgid "XROrigin3D requires an XRCamera3D child node." +msgstr "XROrigin3D éœ€è¦ XRCamera3D å节点。" + +msgid "" +"XR is not enabled in rendering project settings. Stereoscopic output is not " +"supported unless this is enabled." +msgstr "渲染项目设置ä¸æœªå¯ç”¨ XR。除éžå¯ç”¨è¯¥åŠŸèƒ½ï¼Œå¦åˆ™ä¸æ”¯æŒç«‹ä½“输出。" + msgid "On BlendTree node '%s', animation not found: '%s'" msgstr "在 BlendTree 节点 “%s†上没有å‘现动画: “%sâ€" msgid "Animation not found: '%s'" msgstr "没有动画: “%sâ€" +msgid "Animation Apply Reset" +msgstr "动画应用é‡ç½®" + msgid "In node '%s', invalid animation: '%s'." msgstr "在节点 “%sâ€ ä¸Šçš„åŠ¨ç”»æ— æ•ˆï¼š “%s†。" @@ -8805,6 +14419,11 @@ msgid "The AnimationPlayer root node is not a valid node." msgstr "AnimationPlayer æ ¹èŠ‚ç‚¹ä¸æ˜¯æœ‰æ•ˆèŠ‚点。" msgid "" +"ButtonGroup is intended to be used only with buttons that have toggle_mode " +"set to true." +msgstr "ButtonGroup 的目的是åªç”¨äºŽé‚£äº›å°† toggle_mode 设置为 true 的按钮。" + +msgid "" "Color: #%s\n" "LMB: Apply color\n" "RMB: Remove preset" @@ -8813,9 +14432,22 @@ msgstr "" "é¼ æ ‡å·¦é”®ï¼šåº”ç”¨é¢œè‰²\n" "é¼ æ ‡å³é”®ï¼šç§»é™¤é¢„设" +msgid "" +"Color: #%s\n" +"LMB: Apply color" +msgstr "" +"颜色:#%s\n" +"é¼ æ ‡å·¦é”®ï¼šåº”ç”¨é¢œè‰²" + msgid "Pick a color from the editor window." msgstr "从编辑器窗å£ä¸é€‰æ‹©ä¸€ç§é¢œè‰²ã€‚" +msgid "Select a picker shape." +msgstr "选择选å–器形状。" + +msgid "Select a picker mode." +msgstr "选择选å–器模å¼ã€‚" + msgid "Switch between hexadecimal and code values." msgstr "在åå…进制值和代ç 值之间切æ¢ã€‚" @@ -8837,6 +14469,11 @@ msgstr "" "由于该控件的 Mouse Filter 设置为“Ignoreâ€å› æ¤å°†ä¸ä¼šæ˜¾ç¤ºé«˜äº®å·¥å…·æ示。将 Mouse " "Filter 设置为“Stopâ€æˆ–“Passâ€å¯ä¿®æ£æ¤é—®é¢˜ã€‚" +msgid "" +"Changing the Z index of a control only affects the drawing order, not the " +"input event handling order." +msgstr "改å˜æŽ§ä»¶çš„Z索引åªå½±å“绘图顺åºï¼Œä¸å½±å“输入事件的处ç†é¡ºåºã€‚" + msgid "Theme Overrides" msgstr "主题覆盖" @@ -8846,11 +14483,94 @@ msgstr "è¦å‘Šï¼" msgid "Please Confirm..." msgstr "请确认..." +msgid "You don't have permission to access contents of this folder." +msgstr "ä½ æ— æƒè®¿é—®æ¤æ–‡ä»¶å¤¹çš„内容。" + +msgid "All Files" +msgstr "所有文件" + msgid "Must use a valid extension." msgstr "必须使用有效的扩展å。" msgid "Enable grid minimap." -msgstr "å¯ç”¨ç½‘æ ¼å°åœ°å›¾ã€‚" +msgstr "å¯ç”¨æ …æ ¼å°åœ°å›¾ã€‚" + +msgid "Arrange nodes." +msgstr "排列节点。" + +msgid "" +"The current font does not support rendering one or more characters used in " +"this Label's text." +msgstr "当å‰å—体ä¸æ”¯æŒæ¸²æŸ“è¯¥æ ‡ç¾æ–‡æœ¬ä¸ä½¿ç”¨çš„一个或多个å—符。" + +msgid "Same as Layout Direction" +msgstr "与布局方å‘一致" + +msgid "Auto-Detect Direction" +msgstr "自动检测方å‘" + +msgid "Left-to-Right" +msgstr "从左至å³" + +msgid "Right-to-Left" +msgstr "从å³è‡³å·¦" + +msgid "Left-to-Right Mark (LRM)" +msgstr "从左至å³æ ‡å¿—(LRM)" + +msgid "Right-to-Left Mark (RLM)" +msgstr "从å³è‡³å·¦æ ‡å¿—(RLM)" + +msgid "Start of Left-to-Right Embedding (LRE)" +msgstr "从左到å³åµŒå…¥ (LRE) 的开始" + +msgid "Start of Right-to-Left Embedding (RLE)" +msgstr "开始从å³è‡³å·¦åµŒå…¥ï¼ˆRLE)" + +msgid "Start of Left-to-Right Override (LRO)" +msgstr "开始从左至å³å¼ºåˆ¶ï¼ˆLRO)" + +msgid "Start of Right-to-Left Override (RLO)" +msgstr "开始从å³è‡³å·¦å¼ºåˆ¶ï¼ˆRLO)" + +msgid "Pop Direction Formatting (PDF)" +msgstr "退出方å‘æ ¼å¼åŒ–(PDF)" + +msgid "Arabic Letter Mark (ALM)" +msgstr "阿拉伯å—æ¯æ ‡è®°ï¼ˆALM)" + +msgid "Left-to-Right Isolate (LRI)" +msgstr "从左至å³éš”离(LRI)" + +msgid "Right-to-Left Isolate (RLI)" +msgstr "从å³è‡³å·¦éš”离(RLI)" + +msgid "First Strong Isolate (FSI)" +msgstr "第一个强隔离(FSI)" + +msgid "Pop Direction Isolate (PDI)" +msgstr "退出方å‘隔离(PDI)" + +msgid "Zero-Width Joiner (ZWJ)" +msgstr "零宽连接符(ZWJ)" + +msgid "Zero-Width Non-Joiner (ZWNJ)" +msgstr "零宽éžè¿žæŽ¥ç¬¦ï¼ˆZWNJ)" + +msgid "Word Joiner (WJ)" +msgstr "æ–‡å—连接符(WJ)" + +msgid "Soft Hyphen (SHY)" +msgstr "软连å—符(SHY)" + +msgid "Text Writing Direction" +msgstr "文本书写方å‘" + +msgid "Display Control Characters" +msgstr "显示控制å—符" + +msgid "Insert Control Character" +msgstr "æ’入控制å—符" msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "如果å¯ç”¨äº† “Exp Editâ€ï¼Œåˆ™ “Min Value†必须大于 0。" @@ -8864,15 +14584,61 @@ msgstr "" "å节点应该是å•ä¸ªå®¹å™¨ï¼ˆVBoxã€HBox ç‰ï¼‰æˆ–者使用å•ä¸ªæŽ§ä»¶å¹¶æ‰‹åŠ¨è®¾ç½®å…¶è‡ªå®šä¹‰æœ€å°å°º" "寸。" +msgid "" +"This node doesn't have a SubViewport as child, so it can't display its " +"intended content.\n" +"Consider adding a SubViewport as a child to provide something displayable." +msgstr "" +"这个节点没有 SubViewport åèŠ‚ç‚¹ï¼Œæ‰€ä»¥æ— æ³•æ˜¾ç¤ºé¢„æœŸçš„å†…å®¹ã€‚\n" +"è¯·è€ƒè™‘æ·»åŠ ä¸€ä¸ª SubViewport 作为å节点,æ¥æä¾›å¯æ˜¾ç¤ºçš„内容。" + msgid "(Other)" msgstr "(其他)" msgid "" +"This node was saved as class type '%s', which was no longer available when " +"this scene was loaded." +msgstr "该节点被ä¿å˜ä¸ºâ€œ%sâ€ç±»åž‹ï¼Œå½“è¿™ä¸ªåœºæ™¯è¢«åŠ è½½æ—¶ï¼Œå®ƒä¸å†å¯ç”¨ã€‚" + +msgid "" +"Data from the original node is kept as a placeholder until this type of node " +"is available again. It can hence be safely re-saved without risk of data " +"loss." +msgstr "" +"原始节点ä¸çš„æ•°æ®å°†ä¿ç•™ä¸ºå ä½ç¬¦ï¼Œç›´åˆ°æ¤ç±»åž‹çš„节点å†æ¬¡å¯ç”¨ã€‚å› æ¤ï¼Œå®ƒå¯ä»¥å®‰å…¨åœ°" +"é‡æ–°ä¿å˜ï¼Œè€Œä¸ä¼šæœ‰æ•°æ®ä¸¢å¤±çš„风险。" + +msgid "" +"Setting node name '%s' to be unique within scene for '%s', but it's already " +"claimed by '%s'.\n" +"'%s' is no longer set as having a unique name." +msgstr "" +"æ£åœ¨å°†åœºæ™¯ä¸çš„唯一节点å称“%sâ€è®¾ç»™â€œ%sâ€ï¼Œä½†è¯¥å称已被“%sâ€å 用。\n" +"“%sâ€ä¸å†è®¾ç½®ä¸ºå…·æœ‰å”¯ä¸€å称。" + +msgid "" +"This node is marked as deprecated and will be removed in future versions.\n" +"Please check the Godot documentation for information about migration." +msgstr "" +"æ¤èŠ‚ç‚¹æ ‡è®°ä¸ºå·²å¼ƒç”¨ï¼Œä¼šåœ¨å°†æ¥çš„版本ä¸ç§»é™¤ã€‚\n" +"请查看 Godot 文档ä¸å…³äºŽè¿ç§»çš„ä¿¡æ¯ã€‚" + +msgid "" +"This node is marked as experimental and may be subject to removal or major " +"changes in future versions." +msgstr "æ¤èŠ‚ç‚¹æ ‡è®°ä¸ºå®žéªŒæ€§èŠ‚ç‚¹ï¼Œå¯èƒ½ä¼šåœ¨å°†æ¥çš„版本ä¸åˆ 除或进行é‡å¤§æ›´æ”¹ã€‚" + +msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "æ— æ³•åŠ è½½é¡¹ç›®è®¾ç½®ä¸çš„默认环境(渲染 -> 环境 -> 默认环境)。" msgid "" +"ShaderGlobalsOverride is not active because another node of the same type is " +"in the scene." +msgstr "ShaderGlobalsOverride æœªæ¿€æ´»ï¼Œå› ä¸ºåœºæ™¯ä¸å˜åœ¨å¦ä¸€ä¸ªç›¸åŒç±»åž‹çš„节点。" + +msgid "" "Very low timer wait times (< 0.05 seconds) may behave in significantly " "different ways depending on the rendered or physics frame rate.\n" "Consider using a script's process loop instead of relying on a Timer for " @@ -8887,6 +14653,51 @@ msgid "" "dimensions to render anything." msgstr "Viewport 的宽高都大于ç‰äºŽ 2 åƒç´ æ—¶æ‰èƒ½è¿›è¡Œæ¸²æŸ“。" +msgid "Cannot open font from file: %s." +msgstr "æ— æ³•æ‰“å¼€å—体文件:%s。" + +msgid "Version %d of BMFont is not supported (should be 3)." +msgstr "ä¸æ”¯æŒç‰ˆæœ¬ä¸º %d çš„ BMFont(应该是3)。" + +msgid "Invalid BMFont info block size." +msgstr "æ— æ•ˆçš„ BMFont ä¿¡æ¯å—大å°ã€‚" + +msgid "Invalid BMFont common block size." +msgstr "æ— æ•ˆçš„ BMFont 公共å—大å°ã€‚" + +msgid "Can't load font texture: %s." +msgstr "æ— æ³•åŠ è½½å—体纹ç†ï¼š%s。" + +msgid "Unsupported BMFont texture format." +msgstr "ä¸æ”¯æŒçš„ BMFont 纹ç†æ ¼å¼ã€‚" + +msgid "Invalid BMFont block type." +msgstr "æ— æ•ˆçš„ BMFont å—类型。" + +msgid "" +"Shader keywords cannot be used as parameter names.\n" +"Choose another name." +msgstr "" +"ç€è‰²å™¨å…³é”®å—ä¸èƒ½ç”¨ä½œå‚æ•°å称。\n" +"请选择其他å称。" + +msgid "This parameter type does not support the '%s' qualifier." +msgstr "该å‚数类型ä¸æ”¯æŒâ€œ%sâ€é™å®šç¬¦ã€‚" + +msgid "" +"Global parameter '%s' does not exist.\n" +"Create it in the Project Settings." +msgstr "" +"全局å‚数“%sâ€ä¸å˜åœ¨ã€‚\n" +"在项目设置ä¸åˆ›å»ºå®ƒã€‚" + +msgid "" +"Global parameter '%s' has an incompatible type for this kind of node.\n" +"Change it in the Project Settings." +msgstr "" +"全局å‚数“%sâ€å…·æœ‰ä¸Žæ¤ç±»èŠ‚点ä¸å…¼å®¹çš„类型。\n" +"在项目设置ä¸æ”¹å˜å®ƒã€‚" + msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." @@ -8898,6 +14709,9 @@ msgstr "预览的æºèµ„æºæ— 效。" msgid "Invalid source for shader." msgstr "ç€è‰²å™¨çš„æºèµ„æºæ— 效。" +msgid "Invalid operator for that type." +msgstr "è¿ç®—ç¬¦å¯¹è¯¥ç±»åž‹æ— æ•ˆã€‚" + msgid "Default Color" msgstr "默认颜色" @@ -8910,14 +14724,660 @@ msgstr "é‡å¤" msgid "Invalid comparison function for that type." msgstr "è¯¥ç±»åž‹çš„æ¯”è¾ƒåŠŸèƒ½æ— æ•ˆã€‚" +msgid "2D Mode" +msgstr "2D 模å¼" + +msgid "Use All Surfaces" +msgstr "使用所有表é¢" + +msgid "Surface Index" +msgstr "表é¢ç´¢å¼•" + +msgid "" +"Invalid number of arguments when calling stage function '%s', which expects " +"%d arguments." +msgstr "调用阶段函数“%sâ€æ—¶å‚æ•°æ•°é‡æ— 效,预期为 %d 个å‚数。" + +msgid "" +"Invalid argument type when calling stage function '%s', type expected is " +"'%s'." +msgstr "调用阶段函数“%sâ€æ—¶å‚æ•°ç±»åž‹æ— æ•ˆï¼Œé¢„æœŸç±»åž‹ä¸ºâ€œ%sâ€ã€‚" + +msgid "Expected integer constant within [%d..%d] range." +msgstr "预期为 [%d..%d] 范围内的整数常é‡ã€‚" + +msgid "Argument %d of function '%s' is not a variable, array, or member." +msgstr "å‚æ•° %d ä¸æ˜¯å˜é‡ã€æ•°ç»„ã€æˆå‘˜ï¼Œå‡½æ•°ä¸ºâ€œ%sâ€ã€‚" + +msgid "Varyings cannot be passed for the '%s' parameter." +msgstr "Varying ä¸èƒ½ä¼ 给“%sâ€å‚数。" + +msgid "A constant value cannot be passed for the '%s' parameter." +msgstr "常é‡å€¼ä¸èƒ½ä¼ 给“%sâ€å‚数。" + +msgid "" +"Argument %d of function '%s' can only take a local variable, array, or " +"member." +msgstr "å‚æ•° %d åªèƒ½æŽ¥å—å˜é‡ã€æ•°ç»„ã€æˆå‘˜ï¼Œå‡½æ•°ä¸ºâ€œ%sâ€ã€‚" + +msgid "Built-in function \"%s(%s)\" is only supported on high-end platforms." +msgstr "内置函数“%s(%s)â€åªåœ¨é«˜ç«¯å¹³å°ä¸Šæ”¯æŒã€‚" + +msgid "Invalid arguments for the built-in function: \"%s(%s)\"." +msgstr "内置函数的å‚æ•°æ— æ•ˆï¼šâ€œ%s(%s)â€ã€‚" + +msgid "Recursion is not allowed." +msgstr "ä¸å…许递归。" + +msgid "Function '%s' can't be called from source code." +msgstr "函数“%sâ€ä¸èƒ½ä»Žæºä»£ç ä¸è°ƒç”¨ã€‚" + +msgid "" +"Invalid argument for \"%s(%s)\" function: argument %d should be %s but is %s." +msgstr "“%s(%s)â€å‡½æ•°çš„å‚æ•°æ— æ•ˆï¼šå‚æ•° %d 应该是 %s 但实际上是 %s。" + +msgid "" +"Too few arguments for \"%s(%s)\" call. Expected at least %d but received %d." +msgstr "“%s(%s)â€è°ƒç”¨çš„å‚数太少。预计至少 %d 个,但收到 %d 个。" + +msgid "" +"Too many arguments for \"%s(%s)\" call. Expected at most %d but received %d." +msgstr "“%s(%s)â€è°ƒç”¨çš„å‚数太多。预计至多 %d 个,但收到 %d 个。" + +msgid "Invalid assignment of '%s' to '%s'." +msgstr "将“%sâ€åˆ†é…给“%sâ€æ— 效。" + +msgid "Expected constant expression." +msgstr "预期为常é‡è¡¨è¾¾å¼ã€‚" + +msgid "Expected ',' or ')' after argument." +msgstr "å‚æ•°åŽæœŸæœ›æœ‰â€œ,â€æˆ–“)â€ã€‚" + msgid "Varying may not be assigned in the '%s' function." msgstr "Varying ä¸èƒ½åœ¨â€œ%sâ€å‡½æ•°ä¸èµ‹å€¼ã€‚" +msgid "" +"Varying with '%s' data type may only be assigned in the 'fragment' function." +msgstr "æ•°æ®ç±»åž‹ä¸ºâ€œ%sâ€çš„ Varying åªèƒ½åœ¨â€œfragmentâ€å‡½æ•°ä¸è¢«èµ‹å€¼ã€‚" + +msgid "" +"Varyings which assigned in 'vertex' function may not be reassigned in " +"'fragment' or 'light'." +msgstr "已在“vertexâ€å‡½æ•°ä¸èµ‹å€¼çš„ varying ä¸èƒ½åœ¨â€œfragmentâ€æˆ–“lightâ€ä¸é‡æ–°èµ‹å€¼ã€‚" + +msgid "" +"Varyings which assigned in 'fragment' function may not be reassigned in " +"'vertex' or 'light'." +msgstr "已在“fragmentâ€å‡½æ•°ä¸èµ‹å€¼çš„ varying ä¸èƒ½åœ¨â€œvertexâ€æˆ–“lightâ€ä¸é‡æ–°èµ‹å€¼ã€‚" + msgid "Assignment to function." msgstr "对函数的赋值。" +msgid "Swizzling assignment contains duplicates." +msgstr "Swizzling 赋值包å«é‡å¤é¡¹ã€‚" + msgid "Assignment to uniform." msgstr "对 Uniform 的赋值。" msgid "Constants cannot be modified." msgstr "ä¸å…许修改常é‡ã€‚" + +msgid "" +"Sampler argument %d of function '%s' called more than once using both built-" +"ins and uniform textures, this is not supported (use either one or the " +"other)." +msgstr "" +"é‡‡æ ·å™¨å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼ŒåŒæ—¶ä½¿ç”¨äº†å†…置和 uniform 纹ç†ï¼Œä¸æ”¯æŒè¿™ç§" +"用法(请在其ä¸é€‰æ‹©ä¸€ç§ä½¿ç”¨ï¼‰ã€‚" + +msgid "" +"Sampler argument %d of function '%s' called more than once using textures " +"that differ in either filter or repeat setting." +msgstr "é‡‡æ ·å™¨å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼Œæ‰€ä½¿ç”¨çº¹ç†çš„过滤或é‡å¤è®¾ç½®ä¸åŒã€‚" + +msgid "" +"Sampler argument %d of function '%s' called more than once using different " +"built-ins. Only calling with the same built-in is supported." +msgstr "" +"é‡‡æ ·å™¨å‚æ•° %d:函数“%sâ€æœ‰å¤šæ¬¡è°ƒç”¨ï¼Œä½¿ç”¨çš„内置ä¸åŒã€‚仅支æŒä½¿ç”¨ç›¸åŒçš„内置进行调" +"用。" + +msgid "Array size is already defined." +msgstr "数组大å°å·²å®šä¹‰ã€‚" + +msgid "Unknown array size is forbidden in that context." +msgstr "该上下文ä¸ç¦æ¢æœªçŸ¥æ•°ç»„大å°ã€‚" + +msgid "Array size expressions are not supported." +msgstr "ä¸æ”¯æŒæ•°ç»„大å°è¡¨è¾¾å¼ã€‚" + +msgid "Expected a positive integer constant." +msgstr "预期为æ£æ•´æ•°å¸¸é‡ã€‚" + +msgid "Invalid data type for the array." +msgstr "数组的数æ®ç±»åž‹æ— 效。" + +msgid "Array size mismatch." +msgstr "数组大å°ä¸åŒ¹é…。" + +msgid "Expected array initialization." +msgstr "预期为数组åˆå§‹åŒ–。" + +msgid "Cannot convert from '%s' to '%s'." +msgstr "æ— æ³•ä»Žâ€œ%sâ€è½¬æ¢ä¸ºâ€œ%sâ€ã€‚" + +msgid "Expected ')' in expression." +msgstr "表达å¼ä¸éœ€è¦â€œ)â€ã€‚" + +msgid "Void value not allowed in expression." +msgstr "表达å¼ä¸ä¸å…许有空值。" + +msgid "Expected '(' after the type name." +msgstr "类型å称åŽé¢„期为“(â€ã€‚" + +msgid "No matching constructor found for: '%s'." +msgstr "没有找到匹é…çš„æž„é€ å‡½æ•°ï¼šâ€œ%sâ€ã€‚" + +msgid "Expected a function name." +msgstr "预期为函数å称。" + +msgid "No matching function found for: '%s'." +msgstr "没有找到与之匹é…的函数:“%sâ€ã€‚" + +msgid "" +"Varying '%s' must be assigned in the 'vertex' or 'fragment' function first." +msgstr "Varying“%sâ€å¿…须先在“vertexâ€æˆ–“fragmentâ€å‡½æ•°ä¸èµ‹å€¼ã€‚" + +msgid "Varying '%s' cannot be passed for the '%s' parameter in that context." +msgstr "Varying“%sâ€åœ¨è¯¥ä¸Šä¸‹æ–‡ä¸æ— 法作为“%sâ€å‚æ•°ä¼ é€’ã€‚" + +msgid "A constant value cannot be passed for '%s' parameter." +msgstr "常é‡å€¼ä¸èƒ½ä½œä¸ºâ€œ%sâ€å‚æ•°ä¼ é€’ã€‚" + +msgid "Unknown identifier in expression: '%s'." +msgstr "表达å¼ä¸çš„æ ‡è¯†ç¬¦æœªçŸ¥ï¼šâ€œ%sâ€ã€‚" + +msgid "" +"%s has been removed in favor of using hint_%s with a uniform.\n" +"To continue with minimal code changes add 'uniform sampler2D %s : hint_%s, " +"filter_linear_mipmap;' near the top of your shader." +msgstr "" +"%s 已被移除,请改用 hint_%s å’Œ uniform。\n" +"为了ä¿æŒæœ€å°çš„代ç æ”¹åŠ¨ï¼Œä½ å¯ä»¥åœ¨ç€è‰²å™¨é¡¶éƒ¨é™„è¿‘æ·»åŠ â€œuniform sampler2D %s : " +"hint_%s, filter_linear_mipmap;â€ã€‚" + +msgid "" +"Varying with '%s' data type may only be used in the 'fragment' function." +msgstr "æ•°æ®ç±»åž‹ä¸ºâ€œ%sâ€çš„ Varying ä¸èƒ½åœ¨â€œfragmentâ€å‡½æ•°ä¸ä½¿ç”¨ã€‚" + +msgid "Varying '%s' must be assigned in the 'fragment' function first." +msgstr "Varying“%sâ€å¿…须先在“fragmentâ€å‡½æ•°ä¸èµ‹å€¼ã€‚" + +msgid "" +"Varying with integer data type must be declared with `flat` interpolation " +"qualifier." +msgstr "æ•´æ•°æ•°æ®ç±»åž‹çš„ Varying 必须使用 `flat` æ’值修饰符声明。" + +msgid "Can't use function as identifier: '%s'." +msgstr "ä¸èƒ½ä½¿ç”¨å‡½æ•°ä½œä¸ºæ ‡è¯†ç¬¦ï¼šâ€œ%sâ€ã€‚" + +msgid "Only integer expressions are allowed for indexing." +msgstr "åªå…许使用整数表达å¼è¿›è¡Œç´¢å¼•ã€‚" + +msgid "Index [%d] out of range [%d..%d]." +msgstr "索引 [%d] 超出了范围 [%d...%d]。" + +msgid "Expected expression, found: '%s'." +msgstr "预期为表达å¼ï¼Œå‘现:“%sâ€ã€‚" + +msgid "Empty statement. Remove ';' to fix this warning." +msgstr "空è¯å¥ã€‚ä¿®å¤æ¤è¦å‘Šè¯·ç§»é™¤â€œ;â€ã€‚" + +msgid "Expected an identifier as a member." +msgstr "预期为æˆå‘˜æ ‡è¯†ç¬¦ã€‚" + +msgid "Cannot combine symbols from different sets in expression '.%s'." +msgstr "“.%sâ€è¡¨è¾¾å¼ä¸ä¸èƒ½åˆå¹¶ä¸åŒé›†åˆä¸çš„符å·ã€‚" + +msgid "Invalid member for '%s' expression: '.%s'." +msgstr "“%sâ€è¡¨è¾¾å¼çš„æˆå‘˜æ— 效:“.%sâ€ã€‚" + +msgid "An object of type '%s' can't be indexed." +msgstr "类型为“%sâ€çš„对象ä¸èƒ½è¢«ç´¢å¼•ã€‚" + +msgid "Invalid base type for increment/decrement operator." +msgstr "递增/递å‡è¿ç®—ç¬¦çš„åŸºç¡€ç±»åž‹æ— æ•ˆã€‚" + +msgid "Invalid use of increment/decrement operator in a constant expression." +msgstr "在常é‡è¡¨è¾¾å¼ä¸ä½¿ç”¨é€’增/递å‡è¿ç®—ç¬¦æ— æ•ˆã€‚" + +msgid "Invalid token for the operator: '%s'." +msgstr "è¿ç®—ç¬¦æ ‡è®°æ— æ•ˆï¼šâ€œ%sâ€ã€‚" + +msgid "Unexpected end of expression." +msgstr "表达å¼æ„外结æŸã€‚" + +msgid "Invalid arguments to unary operator '%s': %s." +msgstr "一元è¿ç®—符“%sâ€çš„å‚æ•°æ— æ•ˆï¼š%s。" + +msgid "Missing matching ':' for select operator." +msgstr "选择è¿ç®—符缺少匹é…的“:â€ã€‚" + +msgid "Invalid argument to ternary operator: '%s'." +msgstr "三元è¿ç®—符的å‚æ•°æ— æ•ˆï¼šâ€œ%sâ€ã€‚" + +msgid "Invalid arguments to operator '%s': '%s'." +msgstr "è¿ç®—符“%sâ€çš„å‚æ•°æ— æ•ˆï¼šâ€œ%sâ€ã€‚" + +msgid "A switch may only contain '%s' and '%s' blocks." +msgstr "switch åªèƒ½åŒ…å«â€œ%sâ€å’Œâ€œ%sâ€å—。" + +msgid "Expected variable type after precision modifier." +msgstr "精度修饰符åŽé¢„期为å˜é‡ç±»åž‹ã€‚" + +msgid "Invalid variable type (samplers are not allowed)." +msgstr "æ— æ•ˆçš„å˜é‡ç±»åž‹ï¼ˆä¸å…è®¸ä½¿ç”¨é‡‡æ ·å™¨ï¼‰ã€‚" + +msgid "Expected an identifier or '[' after type." +msgstr "类型åŽé¢„æœŸä¸ºæ ‡è¯†ç¬¦æˆ–â€œ[â€ã€‚" + +msgid "Expected an identifier." +msgstr "é¢„æœŸä¸ºæ ‡è¯†ç¬¦ã€‚" + +msgid "Expected array initializer." +msgstr "预期为数组åˆå§‹åŒ–器。" + +msgid "Expected data type after precision modifier." +msgstr "精度修饰符åŽé¢„期为数æ®ç±»åž‹ã€‚" + +msgid "Expected a constant expression." +msgstr "预期为常é‡è¡¨è¾¾å¼ã€‚" + +msgid "Expected initialization of constant." +msgstr "预期为常é‡çš„åˆå§‹åŒ–。" + +msgid "" +"Expected constant expression for argument %d of function call after '='." +msgstr "“=â€åŽé¢„期为函数调用å‚æ•° %d 的常é‡è¡¨è¾¾å¼ã€‚" + +msgid "Expected a boolean expression." +msgstr "预期为布尔表达å¼ã€‚" + +msgid "Expected an integer expression." +msgstr "预期为整数表达å¼ã€‚" + +msgid "Cases must be defined before default case." +msgstr "必须在默认 case å‰å®šä¹‰å…¶ä»– case。" + +msgid "Default case must be defined only once." +msgstr "默认 case å¿…é¡»åªå®šä¹‰ä¸€æ¬¡ã€‚" + +msgid "Duplicated case label: %d." +msgstr "é‡å¤çš„ case æ ‡ç¾ï¼š%d。" + +msgid "'%s' must be placed within a '%s' block." +msgstr "“%sâ€å¿…须放在“%sâ€å—内。" + +msgid "Expected an integer constant." +msgstr "预期为整数常é‡ã€‚" + +msgid "Using '%s' in the '%s' processor function is incorrect." +msgstr "“%sâ€åœ¨â€œ%sâ€å¤„ç†å™¨å‡½æ•°ä¸çš„使用ä¸æ£ç¡®ã€‚" + +msgid "Expected '%s' with an expression of type '%s'." +msgstr "预期为“%sâ€ï¼Œæ˜¯ç±»åž‹ä¸ºâ€œ%sâ€çš„表达å¼ã€‚" + +msgid "Expected return with an expression of type '%s'." +msgstr "预期为返回类型为“%sâ€çš„表达å¼ã€‚" + +msgid "Use of '%s' is not allowed here." +msgstr "æ¤å¤„ä¸å…许使用“%sâ€ã€‚" + +msgid "'%s' is not allowed outside of a loop or '%s' statement." +msgstr "循环和“%sâ€è¯å¥ä¹‹å¤–ä¸å…许“%sâ€ã€‚" + +msgid "'%s' is not allowed outside of a loop." +msgstr "循环之外ä¸å…许“%sâ€ã€‚" + +msgid "The middle expression is expected to be a boolean operator." +msgstr "ä¸é—´çš„表达å¼é¢„期为布尔è¿ç®—符。" + +msgid "The left expression is expected to be a variable declaration." +msgstr "左侧的表达å¼é¢„期为å˜é‡å£°æ˜Žã€‚" + +msgid "The precision modifier cannot be used on structs." +msgstr "精度修饰符ä¸èƒ½ç”¨äºŽç»“构体。" + +msgid "The precision modifier cannot be used on boolean types." +msgstr "精度修饰符ä¸èƒ½ç”¨äºŽå¸ƒå°”类型。" + +msgid "Expected '%s' at the beginning of shader. Valid types are: %s." +msgstr "ç€è‰²å™¨å¼€å¤´é¢„期为“%sâ€ã€‚有效的类型有:%s。" + +msgid "" +"Expected an identifier after '%s', indicating the type of shader. Valid " +"types are: %s." +msgstr "“%sâ€åŽé¢„æœŸä¸ºæ ‡è¯†ç¬¦ï¼Œè¡¨æ˜Žç€è‰²å™¨çš„类型。有效的类型有:%s。" + +msgid "Invalid shader type. Valid types are: %s" +msgstr "æ— æ•ˆçš„ç€è‰²å™¨ç±»åž‹ã€‚有效的类型有:%s" + +msgid "Expected an identifier for render mode." +msgstr "预期为渲染模å¼æ ‡è¯†ç¬¦ã€‚" + +msgid "Duplicated render mode: '%s'." +msgstr "é‡å¤çš„渲染模å¼ï¼šâ€œ%sâ€ã€‚" + +msgid "" +"Redefinition of render mode: '%s'. The '%s' mode has already been set to " +"'%s'." +msgstr "渲染模å¼â€œ%sâ€é‡å®šä¹‰ã€‚“%sâ€æ¨¡å¼å·²ç»è¢«è®¾ç½®ä¸ºâ€œ%sâ€ã€‚" + +msgid "Invalid render mode: '%s'." +msgstr "æ— æ•ˆçš„æ¸²æŸ“æ¨¡å¼ï¼šâ€œ%sâ€ã€‚" + +msgid "Unexpected token: '%s'." +msgstr "æ„å¤–çš„æ ‡è®°ï¼šâ€œ%sâ€ã€‚" + +msgid "Expected a struct identifier." +msgstr "é¢„æœŸä¸ºç»“æž„ä½“æ ‡è¯†ç¬¦ã€‚" + +msgid "Nested structs are not allowed." +msgstr "ä¸å…许嵌套结构。" + +msgid "Expected data type." +msgstr "预期的数æ®ç±»åž‹ã€‚" + +msgid "A '%s' data type is not allowed here." +msgstr "这里ä¸å…许“%sâ€æ•°æ®ç±»åž‹ã€‚" + +msgid "Expected an identifier or '['." +msgstr "é¢„æœŸä¸ºæ ‡è¯†ç¬¦æˆ–â€œ[â€ã€‚" + +msgid "Empty structs are not allowed." +msgstr "ä¸å…许空结构体。" + +msgid "Uniform instances are not yet implemented for '%s' shaders." +msgstr "“%sâ€ç€è‰²å™¨å°šæœªå®žçŽ° uniform 实例。" + +msgid "Varyings cannot be used in '%s' shaders." +msgstr "Varying ä¸èƒ½åœ¨â€œ%sâ€ç€è‰²å™¨ä¸ä½¿ç”¨ã€‚" + +msgid "Interpolation qualifiers are not supported for uniforms." +msgstr "Uniform ä¸æ”¯æŒæ’值修饰符。" + +msgid "The '%s' data type is not supported for uniforms." +msgstr "Uniform ä¸æ”¯æŒâ€œ%sâ€æ•°æ®ç±»åž‹ã€‚" + +msgid "The '%s' data type is not allowed here." +msgstr "这里ä¸å…许使用“%sâ€æ•°æ®ç±»åž‹ã€‚" + +msgid "Interpolation modifier '%s' cannot be used with boolean types." +msgstr "æ’值修饰符“%sâ€ä¸èƒ½ç”¨äºŽå¸ƒå°”类型。" + +msgid "Invalid data type for varying." +msgstr "Varying çš„æ•°æ®ç±»åž‹æ— 效。" + +msgid "Global uniform '%s' does not exist. Create it in Project Settings." +msgstr "全局 uniform“%sâ€ä¸å˜åœ¨ã€‚请在项目设置ä¸åˆ›å»ºã€‚" + +msgid "Global uniform '%s' must be of type '%s'." +msgstr "全局 uniform“%sâ€çš„类型必须为“%sâ€ã€‚" + +msgid "The '%s' qualifier is not supported for sampler types." +msgstr "é‡‡æ ·å™¨ç±»åž‹ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚" + +msgid "The '%s' qualifier is not supported for matrix types." +msgstr "矩阵类型ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚" + +msgid "The '%s' qualifier is not supported for uniform arrays." +msgstr "Uniform æ•°æ®ä¸æ”¯æŒâ€œ%sâ€ä¿®é¥°ç¬¦ã€‚" + +msgid "Expected valid type hint after ':'." +msgstr "“:â€åŽé¢„期为有效的类型æ示。" + +msgid "This hint is not supported for uniform arrays." +msgstr "这个æ示ä¸æ”¯æŒ uniform 数组。" + +msgid "Source color hint is for '%s', '%s' or sampler types only." +msgstr "æºç 颜色æ示仅适用于“%sâ€â€œ%sâ€æˆ–é‡‡æ ·å™¨ç±»åž‹ã€‚" + +msgid "Duplicated hint: '%s'." +msgstr "é‡å¤çš„æ示:“%sâ€ã€‚" + +msgid "Range hint is for '%s' and '%s' only." +msgstr "范围æ示仅适用于“%sâ€å’Œâ€œ%sâ€ã€‚" + +msgid "Expected ',' after integer constant." +msgstr "整数常é‡åŽé¢„期为“,â€ã€‚" + +msgid "Expected an integer constant after ','." +msgstr "“,â€åŽé¢„期为整数常é‡ã€‚" + +msgid "Can only specify '%s' once." +msgstr "åªèƒ½æŒ‡å®šä¸€æ¬¡â€œ%sâ€ã€‚" + +msgid "The instance index can't be negative." +msgstr "实例索引ä¸èƒ½ä¸ºè´Ÿã€‚" + +msgid "Allowed instance uniform indices must be within [0..%d] range." +msgstr "实例 uniform 索引必须在 [0...%d] 范围内。" + +msgid "This hint is only for sampler types." +msgstr "这个æç¤ºä»…é€‚ç”¨äºŽé‡‡æ ·å™¨ç±»åž‹ã€‚" + +msgid "Redefinition of hint: '%s'. The hint has already been set to '%s'." +msgstr "æ示é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚æ示已被设为“%sâ€ã€‚" + +msgid "Duplicated filter mode: '%s'." +msgstr "é‡å¤çš„过滤器模å¼ï¼šâ€œ%sâ€ã€‚" + +msgid "" +"Redefinition of filter mode: '%s'. The filter mode has already been set to " +"'%s'." +msgstr "过滤模å¼é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚过滤模å¼å·²è¢«è®¾ä¸ºâ€œ%sâ€ã€‚" + +msgid "Duplicated repeat mode: '%s'." +msgstr "é‡å¤çš„é‡å¤æ¨¡å¼ï¼šâ€œ%sâ€ã€‚" + +msgid "" +"Redefinition of repeat mode: '%s'. The repeat mode has already been set to " +"'%s'." +msgstr "é‡å¤æ¨¡å¼é‡å®šä¹‰ï¼šâ€œ%sâ€ã€‚é‡å¤æ¨¡å¼å·²è¢«è®¾ä¸ºâ€œ%sâ€ã€‚" + +msgid "Too many '%s' uniforms in shader, maximum supported is %d." +msgstr "ç€è‰²å™¨ä¸çš„“%sâ€uniform 太多,最大支æŒé‡ä¸º %d 个。" + +msgid "Setting default values to uniform arrays is not supported." +msgstr "ä¸æ”¯æŒä¸º uniform 数组设置默认值。" + +msgid "Expected constant expression after '='." +msgstr "“=â€åŽé¢„期为常é‡è¡¨è¾¾å¼ã€‚" + +msgid "Can't convert constant to '%s'." +msgstr "æ— æ³•å°†å¸¸é‡è½¬æ¢ä¸ºâ€œ%sâ€ã€‚" + +msgid "Expected an uniform subgroup identifier." +msgstr "预期为 uniform ååˆ†ç»„æ ‡è¯†ç¬¦ã€‚" + +msgid "Expected an uniform group identifier." +msgstr "预期为 uniform åˆ†ç»„æ ‡è¯†ç¬¦ã€‚" + +msgid "Expected an uniform group identifier or `;`." +msgstr "预期为 uniform åˆ†ç»„æ ‡è¯†ç¬¦æˆ– `;`。" + +msgid "Group needs to be opened before." +msgstr "分组需è¦åœ¨æ¤ä¹‹å‰æ‰“开。" + +msgid "Shader type is already defined." +msgstr "ç€è‰²å™¨ç±»åž‹å·²å®šä¹‰ã€‚" + +msgid "Expected constant, function, uniform or varying." +msgstr "预期为常é‡ã€å‡½æ•°ã€uniform 或 varying。" + +msgid "Invalid constant type (samplers are not allowed)." +msgstr "æ— æ•ˆçš„å¸¸é‡ç±»åž‹ï¼ˆä¸å…è®¸ä½¿ç”¨é‡‡æ ·å™¨ï¼‰ã€‚" + +msgid "Invalid function type (samplers are not allowed)." +msgstr "æ— æ•ˆçš„å‡½æ•°ç±»åž‹ï¼ˆä¸å…è®¸ä½¿ç”¨é‡‡æ ·å™¨ï¼‰ã€‚" + +msgid "Expected a function name after type." +msgstr "类型åŽé¢„期为函数å。" + +msgid "Expected '(' after function identifier." +msgstr "å‡½æ•°æ ‡è¯†ç¬¦åŽé¢„期为“(â€ã€‚" + +msgid "" +"Global non-constant variables are not supported. Expected '%s' keyword " +"before constant definition." +msgstr "ä¸æ”¯æŒå…¨å±€éžå¸¸é‡å˜é‡ã€‚常é‡å®šä¹‰å‰é¢„期为“%sâ€å…³é”®å—。" + +msgid "Expected an identifier after type." +msgstr "类型åŽé¢„æœŸä¸ºæ ‡è¯†ç¬¦ã€‚" + +msgid "" +"The '%s' qualifier cannot be used within a function parameter declared with " +"'%s'." +msgstr "“%sâ€ä¿®é¥°ç¬¦ä¸èƒ½ç”¨äºŽå£°æ˜Žä¸ºâ€œ%sâ€çš„函数å‚数。" + +msgid "Expected a valid data type for argument." +msgstr "å‚数预期为有效的数æ®ç±»åž‹ã€‚" + +msgid "Opaque types cannot be output parameters." +msgstr "ä¸é€æ˜Žç±»åž‹ä¸èƒ½ä½œä¸ºè¾“出å‚数。" + +msgid "Void type not allowed as argument." +msgstr "ä¸å…许将 void 类型作为å‚数。" + +msgid "Expected an identifier for argument name." +msgstr "å‚æ•°åç§°é¢„æœŸä¸ºæ ‡è¯†ç¬¦ã€‚" + +msgid "Function '%s' expects no arguments." +msgstr "函数“%sâ€é¢„期没有å‚数。" + +msgid "Function '%s' must be of '%s' return type." +msgstr "函数“%sâ€çš„返回类型必须为“%sâ€ã€‚" + +msgid "Expected a '{' to begin function." +msgstr "函数开头预期为“{â€ã€‚" + +msgid "Expected at least one '%s' statement in a non-void function." +msgstr "éž void 函数ä¸é¢„期至少有一æ¡â€œ%sâ€è¯å¥ã€‚" + +msgid "uniform buffer" +msgstr "uniform 缓冲" + +msgid "Expected a '%s'." +msgstr "预期为“%sâ€ã€‚" + +msgid "Expected a '%s' or '%s'." +msgstr "预期为“%sâ€æˆ–“%sâ€ã€‚" + +msgid "Expected a '%s' after '%s'." +msgstr "期望一个“%sâ€ï¼Œåœ¨æ¤ä¹‹å‰æ˜¯â€œ%sâ€ã€‚" + +msgid "Redefinition of '%s'." +msgstr "é‡å¤å®šä¹‰â€œ%sâ€ã€‚" + +msgid "Unknown directive." +msgstr "未知指令。" + +msgid "Invalid macro name." +msgstr "æ— æ•ˆå®å称。" + +msgid "Macro redefinition." +msgstr "å®é‡å®šä¹‰ã€‚" + +msgid "Invalid argument name." +msgstr "å‚æ•°åç§°æ— æ•ˆã€‚" + +msgid "Expected a comma in the macro argument list." +msgstr "希望在å®å‚数列表ä¸æ·»åŠ 一个逗å·ã€‚" + +msgid "Unmatched elif." +msgstr "elif 未é…对。" + +msgid "Missing condition." +msgstr "缺少æ¡ä»¶ã€‚" + +msgid "Condition evaluation error." +msgstr "æ¡ä»¶è¯„估错误。" + +msgid "Unmatched else." +msgstr "else 未é…对。" + +msgid "Unmatched endif." +msgstr "endif 未é…对。" + +msgid "Invalid ifdef." +msgstr "æ— æ•ˆçš„ ifdef。" + +msgid "Invalid ifndef." +msgstr "æ— æ•ˆçš„ ifndef。" + +msgid "" +"Shader include load failed. Does the shader include exist? Is there a cyclic " +"dependency?" +msgstr "ç€è‰²å™¨å¤´æ–‡ä»¶åŠ 载失败。该头文件是å¦å˜åœ¨ï¼Ÿæ˜¯å¦å˜åœ¨å¾ªçŽ¯ä¾èµ–?" + +msgid "Shader include resource type is wrong." +msgstr "ç€è‰²å™¨å¤´æ–‡ä»¶çš„资æºç±»åž‹é”™è¯¯ã€‚" + +msgid "Cyclic include found." +msgstr "å‘现循环包å«ã€‚" + +msgid "Shader max include depth exceeded." +msgstr "超出ç€è‰²å™¨æœ€å¤§åŒ…å«æ·±åº¦ã€‚" + +msgid "Invalid pragma directive." +msgstr "æ— æ•ˆçš„ pragma 指令。" + +msgid "Invalid undef." +msgstr "æ— æ•ˆçš„ undef。" + +msgid "Macro expansion limit exceeded." +msgstr "已超出å®å±•å¼€é™åˆ¶ã€‚" + +msgid "Invalid macro argument count." +msgstr "æ— æ•ˆçš„å®å‚数计数。" + +msgid "Can't find matching branch directive." +msgstr "æ— æ³•æ‰¾åˆ°é…对的分支指令。" + +msgid "Invalid symbols placed before directive." +msgstr "指令å‰æ”¾ç½®çš„符å·æ— 效。" + +msgid "Unmatched conditional statement." +msgstr "æ¡ä»¶è¯å¥æœªé…对。" + +msgid "" +"Direct floating-point comparison (this may not evaluate to `true` as you " +"expect). Instead, use `abs(a - b) < 0.0001` for an approximate but " +"predictable comparison." +msgstr "" +"直接进行浮点比较(å¯èƒ½ä¸ä¼šåƒä½ æœŸæœ›çš„é‚£æ ·å¾—åˆ° `true`)。请改用 `abs(a - b) < " +"0.0001` 进行近似但å¯é¢„测的比较。" + +msgid "The const '%s' is declared but never used." +msgstr "常é‡â€œ%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "The function '%s' is declared but never used." +msgstr "函数“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "The struct '%s' is declared but never used." +msgstr "结构体“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "The uniform '%s' is declared but never used." +msgstr "Uniform“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "The varying '%s' is declared but never used." +msgstr "Varying“%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "The local variable '%s' is declared but never used." +msgstr "局部å˜é‡â€œ%sâ€å·²å£°æ˜Žï¼Œä½†ä»Žæœªä½¿ç”¨ã€‚" + +msgid "" +"The total size of the %s for this shader on this device has been exceeded " +"(%d/%d). The shader may not work correctly." +msgstr "" +"å·²ç»è¶…出该ç€è‰²å™¨åœ¨æ¤è®¾å¤‡ä¸Šçš„ %s 的总大å°ï¼ˆ%d/%d)。该ç€è‰²å™¨å¯èƒ½æ— 法æ£å¸¸å·¥ä½œã€‚" diff --git a/editor/translations/editor/zh_TW.po b/editor/translations/editor/zh_TW.po index 354ff922ef..2b54cdefcc 100644 --- a/editor/translations/editor/zh_TW.po +++ b/editor/translations/editor/zh_TW.po @@ -12,7 +12,7 @@ # Qing <icinriiq@gmail.com>, 2018. # Sam Pan <sampan66@gmail.com>, 2016. # ken l <macauhome@gmail.com>, 2018. -# Eric K <eric900601@gmail.com>, 2019. +# Eric K <eric900601@gmail.com>, 2019, 2023. # cnieFIT <dtotncq@gmail.com>, 2019. # Bluesir Bruce <a5566740293@gmail.com>, 2019, 2020. # leela <53352@protonmail.com>, 2019. @@ -39,13 +39,14 @@ # Hugel <qihu@nfschina.com>, 2022. # nitenook <admin@alterbaum.net>, 2022. # Edison Lee <edisonlee@edisonlee55.com>, 2023. +# abcabcc <xmmandxpp@outlook.com>, 2023. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor interface\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-14 10:06+0000\n" -"Last-Translator: Edison Lee <edisonlee@edisonlee55.com>\n" +"PO-Revision-Date: 2023-02-10 10:44+0000\n" +"Last-Translator: abcabcc <xmmandxpp@outlook.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -53,11 +54,35 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" + +msgid "Unset" +msgstr "未è¨ç½®" msgid "Physical" msgstr "物ç†" +msgid "Left Mouse Button" +msgstr "æ»‘é¼ å·¦éµ" + +msgid "Right Mouse Button" +msgstr "æ»‘é¼ å³éµ" + +msgid "Middle Mouse Button" +msgstr "æ»‘é¼ ä¸éµ" + +msgid "Mouse Wheel Up" +msgstr "滾輪å‘上" + +msgid "Mouse Wheel Down" +msgstr "滾輪å‘下" + +msgid "Mouse Wheel Left" +msgstr "æ»‘é¼ æ»¾è¼ªå‘å·¦" + +msgid "Mouse Wheel Right" +msgstr "æ»‘é¼ æ»¾è¼ªå‘å³" + msgid "Button" msgstr "按鈕" @@ -599,6 +624,9 @@ msgstr "自訊號:" msgid "Scene does not contain any script." msgstr "å ´æ™¯ä¸ç„¡ä»»ä½•è…³æœ¬ã€‚" +msgid "Select Method" +msgstr "é¸æ“‡æ–¹æ³•" + msgid "Remove" msgstr "移除" @@ -654,9 +682,6 @@ msgstr "斷開訊號連接" msgid "Connect a Signal to a Method" msgstr "連接訊號至方法" -msgid "Edit Connection:" -msgstr "編輯連接內容:" - msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "確定è¦åˆ 除所有來自訊號「%sã€çš„連接嗎?" @@ -800,23 +825,8 @@ msgstr "è¦å‘Šï¼š" msgid "Error:" msgstr "錯誤:" -msgid "C++ Error" -msgstr "C++ 錯誤" - -msgid "C++ Error:" -msgstr "C++ 錯誤:" - -msgid "Source" -msgstr "來æº" - -msgid "C++ Source" -msgstr "C++ 原始檔" - -msgid "Source:" -msgstr "原始檔:" - -msgid "C++ Source:" -msgstr "C++ 原始檔:" +msgid "%s Error" +msgstr "%s 錯誤" msgid "Stack Trace" msgstr "å †ç–Šå›žæº¯" @@ -827,6 +837,9 @@ msgstr "複製錯誤" msgid "Open C++ Source on GitHub" msgstr "æ–¼GitHubé–‹å•ŸC++原始碼" +msgid "C++ Source" +msgstr "C++ 原始檔" + msgid "Video RAM" msgstr "視訊記憶體" @@ -1290,6 +1303,9 @@ msgstr "全域變數" msgid "Navigation" msgstr "導航" +msgid "Vulkan" +msgstr "Vulkan" + msgid "Nodes and Classes:" msgstr "節點與類別:" @@ -1767,12 +1783,12 @@ msgstr "顯示所有地å€" msgid "Show Selected Locales Only" msgstr "僅顯示é¸å®šçš„地å€" +msgid "Edit Filters" +msgstr "編輯篩é¸æ¢ä»¶" + msgid "Language:" msgstr "語言:" -msgid "Script" -msgstr "腳本" - msgid "Variant" msgstr "變體" @@ -2295,22 +2311,6 @@ msgid "Install from file" msgstr "自檔案安è£" msgid "" -"This will set up your project for custom Android builds by installing the " -"source template to \"res://android/build\".\n" -"You can then apply modifications and build your own custom APK on export " -"(adding modules, changing the AndroidManifest.xml, etc.).\n" -"Note that in order to make custom builds instead of using pre-built APKs, " -"the \"Use Custom Build\" option should be enabled in the Android export " -"preset." -msgstr "" -"將於「res://android/buildã€å®‰è£åŽŸå§‹æ¨£æ¿ä»¥ç‚ºè©²é …ç›®è¨å®šè‡ªå®š Android 建置樣" -"æ¿ã€‚\n" -"輸出時å¯å¥—用修改並建置自定 APK(如新增模組ã€ä¿®æ”¹ AndroidManifest.xml …" -"ç‰ï¼‰ã€‚\n" -"請注æ„,若è¦ä½¿ç”¨è‡ªå®šå»ºç½®è€Œéžä½¿ç”¨é 先建置之 APK,請啟用 Android 匯出é è¨è¨å®šä¸" -"çš„ [Use Custom Build] é¸é …。" - -msgid "" "The Android build template is already installed in this project and it won't " "be overwritten.\n" "Remove the \"res://android/build\" directory manually before attempting this " @@ -2529,9 +2529,6 @@ msgstr "å¿«æ·éµ" msgid "Binding" msgstr "ç¶å®š" -msgid "%s Error" -msgstr "%s 錯誤" - msgid "All Devices" msgstr "所有è£ç½®" @@ -3434,6 +3431,9 @@ msgstr "é¸æ“‡ä¸¦ç§»å‹•é ‚é»žï¼Œä½¿ç”¨æ»‘é¼ å³éµå»ºç«‹é ‚點。" msgid "Enable snap and show grid." msgstr "啟用å¸é™„ä¸¦é¡¯ç¤ºç¶²æ ¼ã€‚" +msgid "Blend:" +msgstr "æ··åˆï¼š" + msgid "Point" msgstr "點" @@ -3476,15 +3476,9 @@ msgstr "åˆªé™¤é ‚é»žèˆ‡ä¸‰è§’å½¢ã€‚" msgid "Generate blend triangles automatically (instead of manually)" msgstr "自動產生混åˆä¸‰è§’形(而éžæ‰‹å‹•ï¼‰" -msgid "Blend:" -msgstr "æ··åˆï¼š" - msgid "Parameter Changed:" msgstr "已更改åƒæ•¸ï¼š" -msgid "Edit Filters" -msgstr "編輯篩é¸æ¢ä»¶" - msgid "Output node can't be added to the blend tree." msgstr "輸出節點無法被新增至混åˆæ¨¹ã€‚" @@ -3601,9 +3595,6 @@ msgstr "自目å‰ä½ç½®é–‹å§‹å€’放所é¸çš„動畫。 (A)" msgid "Play selected animation backwards from end. (Shift+A)" msgstr "自çµå°¾å€’放所é¸å‹•ç•«ã€‚(Shift+A)" -msgid "Stop animation playback. (S)" -msgstr "åœæ¢æ’放動畫。(S)" - msgid "Play selected animation from start. (Shift+D)" msgstr "從é æ’放所é¸å‹•ç•«ã€‚(Shift+D)" @@ -4802,12 +4793,6 @@ msgstr "更改通知器 AABB" msgid "Change Particles AABB" msgstr "更改粒å AABB" -msgid "Change Box Shape Extents" -msgstr "更改框形範åœ" - -msgid "Change Probe Extents" -msgstr "更改探查範åœ" - msgid "Change Capsule Shape Radius" msgstr "更改楕圓形åŠå¾‘" @@ -5607,6 +5592,9 @@ msgstr "標準" msgid "Connections to method:" msgstr "連接至方法:" +msgid "Source" +msgstr "來æº" + msgid "Target" msgstr "目標" @@ -5845,12 +5833,6 @@ msgstr "(空)" msgid "Animations:" msgstr "動畫:" -msgid "Speed:" -msgstr "速度:" - -msgid "Loop" -msgstr "循環" - msgid "Animation Frames:" msgstr "動畫幀:" @@ -7210,9 +7192,6 @@ msgstr "新增輸入æ“作" msgid "Change Action deadzone" msgstr "修改æ“作盲å€" -msgid "Add Input Action Event" -msgstr "新增輸入æ“作事件" - msgid "Erase Input Action" msgstr "清除輸入æ“作" @@ -7240,9 +7219,6 @@ msgstr "é¸æ“‡å±¬æ€§" msgid "Select Virtual Method" msgstr "é¸æ“‡è™›æ“¬æ–¹æ³•" -msgid "Select Method" -msgstr "é¸æ“‡æ–¹æ³•" - msgid "Batch Rename" msgstr "批次é‡æ–°å‘½å" @@ -7986,12 +7962,6 @@ msgstr "無效的 APK Expansion 公鑰。" msgid "Invalid package name:" msgstr "無效的套件å稱:" -msgid "\"Use Custom Build\" must be enabled to use the plugins." -msgstr "「使用自定建置ã€å¿…é ˆå•Ÿç”¨ä»¥ä½¿ç”¨æœ¬å¤–æŽ›ã€‚" - -msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." -msgstr "「Export AABã€åƒ…於「Use Custom Buildã€å•Ÿç”¨æ™‚å¯ç”¨ã€‚" - msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "ã€Œæœ€å° SDKã€æ‡‰ç‚ºæœ‰æ•ˆæ•´æ•¸ï¼Œä½†ç›®å‰å€¼ç‚ºç„¡æ•ˆçš„「%sã€ã€‚" @@ -8047,12 +8017,6 @@ msgid "Unsupported export format!" msgstr "ä¸æ”¯æ´çš„åŒ¯å‡ºæ ¼å¼ï¼" msgid "" -"Trying to build from a custom built template, but no version info for it " -"exists. Please reinstall from the 'Project' menu." -msgstr "" -"嘗試自自定建置樣æ¿é€²è¡Œå»ºç½®ï¼Œä½†ç„¡ç‰ˆæœ¬è³‡è¨Šå¯ç”¨ã€‚請自「專案ã€é¸å–®ä¸é‡æ–°å®‰è£ã€‚" - -msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" diff --git a/editor/translations/properties/de.po b/editor/translations/properties/de.po index e919f91096..f66608bcde 100644 --- a/editor/translations/properties/de.po +++ b/editor/translations/properties/de.po @@ -93,16 +93,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-09 20:42+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2023-02-09 01:12+0000\n" +"Last-Translator: co1inco <colin.meihoefer@gmx.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" -"godot/de/>\n" +"godot-properties/de/>\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Anwendung" @@ -113,9 +113,15 @@ msgstr "Konfiguration" msgid "Name" msgstr "Name" +msgid "Description" +msgstr "Beschreibung" + msgid "Run" msgstr "Ausführen" +msgid "Main Scene" +msgstr "Hauptszene" + msgid "Disable stdout" msgstr "Stdout deaktivieren" @@ -143,6 +149,9 @@ msgstr "Fenster" msgid "Size" msgstr "Größe" +msgid "Mode" +msgstr "Modus" + msgid "Resizable" msgstr "Verstellbar" @@ -158,6 +167,9 @@ msgstr "Energiesparen" msgid "Keep Screen On" msgstr "Bildschirm an lassen" +msgid "Audio" +msgstr "Audio" + msgid "Editor" msgstr "Editor" @@ -179,6 +191,9 @@ msgstr "Debuggen" msgid "Settings" msgstr "Einstellungen" +msgid "Compression" +msgstr "Kompression" + msgid "Crash Handler" msgstr "Absturzbehandlung" @@ -188,6 +203,21 @@ msgstr "Nachricht" msgid "Rendering" msgstr "Am Rendern" +msgid "Occlusion Culling" +msgstr "Occlusion-Culling" + +msgid "Limits" +msgstr "Grenzen" + +msgid "GUI" +msgstr "GUI" + +msgid "Max Size (MB)" +msgstr "Maximale Größe (MB)" + +msgid "Vulkan" +msgstr "Vulkan" + msgid "Low Processor Usage Mode" msgstr "Niedrige-Prozessorauslastungsmodus" @@ -236,6 +266,9 @@ msgstr "Faktor" msgid "Button Index" msgstr "Tastenindex" +msgid "Double Click" +msgstr "Doppelklick" + msgid "Tilt" msgstr "Neigung" @@ -290,6 +323,12 @@ msgstr "Tastenkürzel" msgid "Big Endian" msgstr "Big-Endian" +msgid "Network" +msgstr "Netzwerk" + +msgid "Page Size" +msgstr "Page-Größe" + msgid "Blocking Mode Enabled" msgstr "Blockierender Modus aktiviert" @@ -326,9 +365,6 @@ msgstr "Pfad" msgid "Data Array" msgstr "Datenliste" -msgid "Blocking Handshake" -msgstr "Blockierender Handshake" - msgid "Max Pending Connections" msgstr "Maximale Anzahl hängender Verbindungen" @@ -404,15 +440,6 @@ msgstr "Animation" msgid "Easing" msgstr "Glätten Ein-Aus" -msgid "Interface" -msgstr "Schnittstelle" - -msgid "Editors" -msgstr "Editoren" - -msgid "Network" -msgstr "Netzwerk" - msgid "Remote Port" msgstr "Fern-Port" @@ -482,8 +509,8 @@ msgstr "Ausgewählt" msgid "Keying" msgstr "Schlüsselwerte erzeugen" -msgid "Main Scene" -msgstr "Hauptszene" +msgid "Interface" +msgstr "Schnittstelle" msgid "Show Update Spinner" msgstr "Aktualisierungsrad anzeigen" @@ -791,6 +818,9 @@ msgstr "Schriftgröße von Quellcode in der Hilfe" msgid "Help Title Font Size" msgstr "Schriftgröße von Titeln der Hilfe" +msgid "Editors" +msgstr "Editoren" + msgid "Grid Map" msgstr "Gitterkarte" @@ -1208,6 +1238,9 @@ msgstr "Umrissgröße" msgid "Variation" msgstr "Variation" +msgid "Transform" +msgstr "Transformation" + msgid "Collada" msgstr "Collada" @@ -1238,15 +1271,9 @@ msgstr "Vorladen" msgid "Columns" msgstr "Spalten" -msgid "Mode" -msgstr "Modus" - msgid "Lossy Quality" msgstr "Verlustbehaftete Qualität" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmaps" @@ -1313,12 +1340,6 @@ msgstr "Optimierer" msgid "Max Angular Error" msgstr "Max Winkelfehler" -msgid "Compression" -msgstr "Kompression" - -msgid "Page Size" -msgstr "Page-Größe" - msgid "Nodes" msgstr "Nodes" @@ -1427,6 +1448,9 @@ msgstr "Threads verwenden" msgid "Available URLs" msgstr "Verfügbare URLs" +msgid "Unset" +msgstr "Deaktiviert" + msgid "Error" msgstr "Fehler" @@ -1544,9 +1568,6 @@ msgstr "Threads" msgid "Thread Model" msgstr "Thread-Model" -msgid "Audio" -msgstr "Audio" - msgid "Handheld" msgstr "Handgerät" @@ -1577,15 +1598,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Home-Anzeiger verbergen" +msgid "Input Devices" +msgstr "Eingabegeräte" + +msgid "Pointing" +msgstr "Zeigend" + msgid "Boot Splash" msgstr "Startladebild" msgid "BG Color" msgstr "Hintergrundfarbe" -msgid "Input Devices" -msgstr "Eingabegeräte" - msgid "Environment" msgstr "Umgebung" @@ -1595,21 +1619,24 @@ msgstr "Standard Löschfarbe" msgid "Show Image" msgstr "Bild anzeigen" +msgid "Image" +msgstr "Bild" + msgid "Fullsize" msgstr "Orginalgröße" msgid "Use Filter" msgstr "Filter verwenden" +msgid "Icon" +msgstr "Symbol" + msgid "Buffering" msgstr "Puffern" msgid "Agile Event Flushing" msgstr "Bewegliches Ereignis-Flushing" -msgid "Pointing" -msgstr "Zeigend" - msgid "Emulate Touch From Mouse" msgstr "Druckberührung mit Maus emulieren" @@ -1637,12 +1664,15 @@ msgstr "Solution-Verzeichnis" msgid "Main Loop Type" msgstr "Typ der Hauptschleife" +msgid "Stretch" +msgstr "Strecken" + +msgid "Aspect" +msgstr "Verhältnis" + msgid "Auto Accept Quit" msgstr "Automatisches Beendenakzeptieren" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "Schriftarten" @@ -1652,6 +1682,9 @@ msgstr "Dynamische Schriftarten" msgid "Use Oversampling" msgstr "Oversampling verwenden" +msgid "Textures" +msgstr "Texturen" + msgid "Operation" msgstr "Betrieb" @@ -1835,9 +1868,6 @@ msgstr "Basispfad" msgid "Root Nodes" msgstr "Wurzel-Nodes" -msgid "Textures" -msgstr "Texturen" - msgid "Images" msgstr "Bilder" @@ -2132,9 +2162,6 @@ msgstr "IGD-Status" msgid "Write Mode" msgstr "Schreibmodus" -msgid "Limits" -msgstr "Grenzen" - msgid "WebRTC" msgstr "WebRTC" @@ -2189,12 +2216,6 @@ msgstr "Angepasster Vordergrund 432 x 432" msgid "Adaptive Background 432 X 432" msgstr "Angepasster Hintergrund 432 x 432" -msgid "Custom Build" -msgstr "Eigener Build" - -msgid "Use Custom Build" -msgstr "Einen Build verwenden" - msgid "Export Format" msgstr "Exportformat" @@ -2462,9 +2483,6 @@ msgstr "Architektur" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Symbol" - msgid "Copyright" msgstr "Urheberrecht" @@ -2600,9 +2618,6 @@ msgstr "Anzeigename" msgid "Short Name" msgstr "Kurzname" -msgid "Description" -msgstr "Beschreibung" - msgid "Publisher" msgstr "Veröffentlicher" @@ -2762,18 +2777,12 @@ msgstr "Dateibeschreibung" msgid "Trademarks" msgstr "Handelsmarken" -msgid "Frames" -msgstr "Frames" - msgid "Frame" msgstr "Frame" msgid "Speed Scale" msgstr "Geschwindigkeitsskalierung" -msgid "Playing" -msgstr "Wird abgespielt" - msgid "Centered" msgstr "Zentriert" @@ -2819,6 +2828,9 @@ msgstr "Volumen-dB" msgid "Pitch Scale" msgstr "Tonhöhenskalierung" +msgid "Playing" +msgstr "Wird abgespielt" + msgid "Autoplay" msgstr "Automatisches Abspielen" @@ -3188,9 +3200,6 @@ msgstr "Reisekosten" msgid "Estimate Radius" msgstr "Radius schätzen" -msgid "Transform" -msgstr "Transformation" - msgid "Rotation Degrees" msgstr "Rotationswinkel" @@ -3473,9 +3482,6 @@ msgstr "Z deaktivieren" msgid "Flatness" msgstr "Flachheit" -msgid "Extents" -msgstr "Ausmaße" - msgid "Albedo" msgstr "Albedo" @@ -4034,9 +4040,6 @@ msgstr "Zufällige Zeitverzögerung" msgid "Xfade Time" msgstr "Ãœberblendzeit" -msgid "Reset" -msgstr "Zurücksetzen" - msgid "Active" msgstr "Aktiv" @@ -4046,8 +4049,8 @@ msgstr "Menge hinzufügen" msgid "Blend Amount" msgstr "Abbildungsmenge" -msgid "Seek Position" -msgstr "Position aufsuchen" +msgid "Reset" +msgstr "Zurücksetzen" msgid "Switch" msgstr "Durchwechseln" @@ -4370,9 +4373,6 @@ msgstr "Umgebung" msgid "Relative Index" msgstr "Relativer Index" -msgid "Fit Content Height" -msgstr "An Inhaltshöhe anpassen" - msgid "Scroll Active" msgstr "Scrollen möglich" @@ -4415,9 +4415,6 @@ msgstr "Eingeklappt" msgid "Dragger Visibility" msgstr "Trennersichtbarkeit" -msgid "Stretch" -msgstr "Strecken" - msgid "Stretch Shrink" msgstr "Strecken-Stauchen" @@ -4436,6 +4433,9 @@ msgstr "Tabs sichtbar" msgid "Syntax Highlighter" msgstr "Syntaxhervorhebung" +msgid "Fit Content Height" +msgstr "An Inhaltshöhe anpassen" + msgid "Draw" msgstr "Zeichnen" @@ -4607,9 +4607,6 @@ msgstr "Kantenglättung" msgid "Use Debanding" msgstr "Debanding verwenden" -msgid "Occlusion Culling" -msgstr "Occlusion-Culling" - msgid "Atlas Size" msgstr "Atlasgröße" @@ -4691,9 +4688,6 @@ msgstr "Min Größe" msgid "Max Size" msgstr "Max Größe" -msgid "Aspect" -msgstr "Verhältnis" - msgid "Layer Names" msgstr "Ebenennamen" @@ -5591,9 +5585,6 @@ msgstr "Wachstumsanfang" msgid "Grow End" msgstr "Wachstumsende" -msgid "Image" -msgstr "Bild" - msgid "Load Path" msgstr "Ladepfad" @@ -5618,6 +5609,9 @@ msgstr "Von" msgid "To" msgstr "Bis" +msgid "Frames" +msgstr "Frames" + msgid "Current Frame" msgstr "Aktueller Frame" @@ -5675,18 +5669,6 @@ msgstr "Navigationskarte" msgid "Direct Space State" msgstr "Direkter Raum Zustand" -msgid "Default Gravity" -msgstr "Standard-Gravitation" - -msgid "Default Gravity Vector" -msgstr "Standardgravitationsvektor" - -msgid "Default Cell Size" -msgstr "Standardzellgröße" - -msgid "Default Edge Connection Margin" -msgstr "Standard Kantenverbinungsabstand" - msgid "Fallback Environment" msgstr "Ausweichumgebung" @@ -5822,20 +5804,17 @@ msgstr "Videoverzögerungsbehandlung (ms)" msgid "Bus Count" msgstr "Busanzahl" -msgid "Capture Device" -msgstr "Aufnahmegerät" - msgid "Feed" msgstr "Zufuhr" msgid "Is Active" msgstr "Ist aktiv" -msgid "Sleep Threshold Linear" -msgstr "Schlafschwelle linear" +msgid "Default Cell Size" +msgstr "Standardzellgröße" -msgid "Sleep Threshold Angular" -msgstr "Schlafschwelle Winkel" +msgid "Default Edge Connection Margin" +msgstr "Standard Kantenverbinungsabstand" msgid "Inverse Mass" msgstr "Umgekehrte Masse" @@ -5864,6 +5843,18 @@ msgstr "Mit anderen Gebieten kollidieren" msgid "Shape RID" msgstr "Form RID" +msgid "Default Gravity" +msgstr "Standard-Gravitation" + +msgid "Default Gravity Vector" +msgstr "Standardgravitationsvektor" + +msgid "Sleep Threshold Linear" +msgstr "Schlafschwelle linear" + +msgid "Sleep Threshold Angular" +msgstr "Schlafschwelle Winkel" + msgid "Physics Engine" msgstr "Physikengine" @@ -5897,18 +5888,6 @@ msgstr "Render-Schleife aktiviert" msgid "VRAM Compression" msgstr "VRAM-Kompression" -msgid "Import BPTC" -msgstr "BPTC importieren" - -msgid "Import S3TC" -msgstr "S3TC importieren" - -msgid "Import ETC" -msgstr "ETC importieren" - -msgid "Import ETC2" -msgstr "ETC2 importieren" - msgid "Lossless Compression" msgstr "Verlustfreie Komprimierung" diff --git a/editor/translations/properties/es.po b/editor/translations/properties/es.po index 363ff0a120..40a4fe1441 100644 --- a/editor/translations/properties/es.po +++ b/editor/translations/properties/es.po @@ -97,16 +97,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: Daniel Miranda <danmiranda@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Damien Monasterios <monasterio13septiembre@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" -"godot/es/>\n" +"godot-properties/es/>\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Aplicación" @@ -117,9 +117,15 @@ msgstr "Configuración" msgid "Name" msgstr "Nombre" +msgid "Description" +msgstr "Descripción" + msgid "Run" msgstr "Ejecutar" +msgid "Main Scene" +msgstr "Escena Principal" + msgid "Disable stdout" msgstr "Desactivar stdout" @@ -147,6 +153,9 @@ msgstr "Ventana" msgid "Size" msgstr "Tamaño" +msgid "Mode" +msgstr "Modo" + msgid "Resizable" msgstr "Redimensionable" @@ -156,12 +165,18 @@ msgstr "Sin bordes" msgid "Transparent" msgstr "Transparente" +msgid "Extend to Title" +msgstr "Extender al TÃtulo" + msgid "Energy Saving" msgstr "Ahorro de EnergÃa" msgid "Keep Screen On" msgstr "Mantener la Pantalla Activa" +msgid "Audio" +msgstr "Audio" + msgid "Editor" msgstr "Editor" @@ -183,6 +198,9 @@ msgstr "Depurar" msgid "Settings" msgstr "Configuración" +msgid "Compression" +msgstr "Compresión" + msgid "Crash Handler" msgstr "Manipulador de Colisiones" @@ -192,6 +210,15 @@ msgstr "Mensaje" msgid "Rendering" msgstr "Renderización" +msgid "Occlusion Culling" +msgstr "Occlusion Culling" + +msgid "Limits" +msgstr "LÃmites" + +msgid "GUI" +msgstr "GUI" + msgid "Low Processor Usage Mode" msgstr "Modo de Bajo Uso del Procesador" @@ -240,6 +267,9 @@ msgstr "Factor" msgid "Button Index" msgstr "Ãndice de Botones" +msgid "Double Click" +msgstr "Doble Clic" + msgid "Tilt" msgstr "Inclinar" @@ -294,6 +324,12 @@ msgstr "Atajo" msgid "Big Endian" msgstr "Big Endian" +msgid "Network" +msgstr "Red" + +msgid "Page Size" +msgstr "Tamaño de Página" + msgid "Blocking Mode Enabled" msgstr "Modo de Bloqueo Activado" @@ -330,9 +366,6 @@ msgstr "Ruta" msgid "Data Array" msgstr "Array de Datos" -msgid "Blocking Handshake" -msgstr "Bloquear Handshake" - msgid "Max Pending Connections" msgstr "Máximo de Conexiones Pendientes" @@ -408,15 +441,6 @@ msgstr "Animación" msgid "Easing" msgstr "Suavizar" -msgid "Interface" -msgstr "Interfaz" - -msgid "Editors" -msgstr "Editores" - -msgid "Network" -msgstr "Red" - msgid "Remote Port" msgstr "Puerto Remoto" @@ -486,8 +510,8 @@ msgstr "Chequeado" msgid "Keying" msgstr "Teclear" -msgid "Main Scene" -msgstr "Escena Principal" +msgid "Interface" +msgstr "Interfaz" msgid "Show Update Spinner" msgstr "Mostrar Spinner de Actualización" @@ -589,7 +613,7 @@ msgid "Theme" msgstr "Theme" msgid "Preset" -msgstr "Preajuste" +msgstr "Preconfigurado" msgid "Base Color" msgstr "Color Base" @@ -795,6 +819,9 @@ msgstr "Tamaño de Fuente de Código de Ayuda" msgid "Help Title Font Size" msgstr "Tamaño de Fuente del TÃtulo de Ayuda" +msgid "Editors" +msgstr "Editores" + msgid "Grid Map" msgstr "Mapeo de CuadrÃcula" @@ -1206,12 +1233,18 @@ msgstr "Oversampling" msgid "Compress" msgstr "Comprimir" +msgid "Language" +msgstr "Idioma" + msgid "Outline Size" msgstr "Tamaño del Contorno" msgid "Variation" msgstr "Variación" +msgid "Transform" +msgstr "Transformar" + msgid "Collada" msgstr "Collada" @@ -1242,15 +1275,9 @@ msgstr "Precarga" msgid "Columns" msgstr "Columnas" -msgid "Mode" -msgstr "Modo" - msgid "Lossy Quality" msgstr "Con Pérdidas de Calidad" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmaps" @@ -1317,12 +1344,6 @@ msgstr "Optimizador" msgid "Max Angular Error" msgstr "Error Angular Máximo" -msgid "Compression" -msgstr "Compresión" - -msgid "Page Size" -msgstr "Tamaño de Página" - msgid "Nodes" msgstr "Nodos" @@ -1336,7 +1357,7 @@ msgid "Root Scale" msgstr "Escala de RaÃz" msgid "Meshes" -msgstr "Meshes" +msgstr "Mallas" msgid "Ensure Tangents" msgstr "Asegurar Tangentes" @@ -1431,6 +1452,9 @@ msgstr "Usar Hilos" msgid "Available URLs" msgstr "URLs Disponibles" +msgid "Unset" +msgstr "Desactivar" + msgid "Error" msgstr "Error" @@ -1548,9 +1572,6 @@ msgstr "Hilos" msgid "Thread Model" msgstr "Modelo de Hilo" -msgid "Audio" -msgstr "Audio" - msgid "Handheld" msgstr "Manipulador" @@ -1581,15 +1602,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Ocultar Indicador de Inicio" +msgid "Input Devices" +msgstr "Dispositivos de Entrada" + +msgid "Pointing" +msgstr "Puntero" + msgid "Boot Splash" msgstr "Pantalla de Splash" msgid "BG Color" msgstr "Color de Fondo" -msgid "Input Devices" -msgstr "Dispositivos de Entrada" - msgid "Environment" msgstr "Entorno" @@ -1599,21 +1623,24 @@ msgstr "Color Claro Predeterminado" msgid "Show Image" msgstr "Mostrar Imagen" +msgid "Image" +msgstr "imagen" + msgid "Fullsize" msgstr "Tamaño completo" msgid "Use Filter" msgstr "Usar Filtro" +msgid "Icon" +msgstr "Icono" + msgid "Buffering" msgstr "Buffering" msgid "Agile Event Flushing" msgstr "Evento Ãgil de Vaciado" -msgid "Pointing" -msgstr "Puntero" - msgid "Emulate Touch From Mouse" msgstr "Emular Toque Desde El Mouse" @@ -1641,12 +1668,15 @@ msgstr "Directorio de Soluciones" msgid "Main Loop Type" msgstr "Tipo de Bucle Principal" +msgid "Stretch" +msgstr "Estirar" + +msgid "Aspect" +msgstr "Aspecto" + msgid "Auto Accept Quit" msgstr "Aceptar Cierre Del Programa Automáticamente" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "Fuentes" @@ -1656,6 +1686,9 @@ msgstr "Fuentes Dinámicas" msgid "Use Oversampling" msgstr "Usar Sobremuestreo" +msgid "Textures" +msgstr "Texturas" + msgid "Operation" msgstr "Operación" @@ -1839,9 +1872,6 @@ msgstr "Ruta Base" msgid "Root Nodes" msgstr "Nodos RaÃz" -msgid "Textures" -msgstr "Texturas" - msgid "Images" msgstr "Imágenes" @@ -2136,9 +2166,6 @@ msgstr "Estado del IGD" msgid "Write Mode" msgstr "Modo de Escritura" -msgid "Limits" -msgstr "LÃmites" - msgid "WebRTC" msgstr "WebRTC" @@ -2193,12 +2220,6 @@ msgstr "Primer Plano Adaptable 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Fondo Adaptable 432 X 432" -msgid "Custom Build" -msgstr "Build Personalizada" - -msgid "Use Custom Build" -msgstr "Usar Compilación Personalizada" - msgid "Export Format" msgstr "Formato de Exportación" @@ -2466,9 +2487,6 @@ msgstr "Arquitectura" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Icono" - msgid "Copyright" msgstr "Copyright" @@ -2604,9 +2622,6 @@ msgstr "Nombre a Mostrar" msgid "Short Name" msgstr "Nombre Corto" -msgid "Description" -msgstr "Descripción" - msgid "Publisher" msgstr "Editor" @@ -2766,18 +2781,12 @@ msgstr "Descripción del Archivo" msgid "Trademarks" msgstr "Marcas comerciales" -msgid "Frames" -msgstr "Fotogramas" - msgid "Frame" msgstr "Fotograma" msgid "Speed Scale" msgstr "Escala de Velocidad" -msgid "Playing" -msgstr "Reproducir" - msgid "Centered" msgstr "Centrado" @@ -2823,6 +2832,9 @@ msgstr "Volumen dB" msgid "Pitch Scale" msgstr "Escala de Tono" +msgid "Playing" +msgstr "Reproducir" + msgid "Autoplay" msgstr "Reproducción Automática" @@ -3192,9 +3204,6 @@ msgstr "Costo del Viaje" msgid "Estimate Radius" msgstr "Estimación del Radio" -msgid "Transform" -msgstr "Transformar" - msgid "Rotation Degrees" msgstr "Grados de Rotación" @@ -3477,9 +3486,6 @@ msgstr "Desactivar Z" msgid "Flatness" msgstr "Llanura" -msgid "Extents" -msgstr "Extensiones" - msgid "Albedo" msgstr "Albedo" @@ -4038,9 +4044,6 @@ msgstr "Retraso Aleatorio" msgid "Xfade Time" msgstr "Tiempo de Fundido Cruzado" -msgid "Reset" -msgstr "Resetear" - msgid "Active" msgstr "Activo" @@ -4050,8 +4053,8 @@ msgstr "Añadir Cantidad" msgid "Blend Amount" msgstr "Cantidad de Mezcla" -msgid "Seek Position" -msgstr "Buscar Posición" +msgid "Reset" +msgstr "Resetear" msgid "Switch" msgstr "Cambiar" @@ -4374,9 +4377,6 @@ msgstr "Env" msgid "Relative Index" msgstr "Ãndice Relativo" -msgid "Fit Content Height" -msgstr "Ajustar Altura Del Contenido" - msgid "Scroll Active" msgstr "Scroll Activo" @@ -4419,9 +4419,6 @@ msgstr "Colapsado" msgid "Dragger Visibility" msgstr "Visibilidad de los Arrastradores" -msgid "Stretch" -msgstr "Estirar" - msgid "Stretch Shrink" msgstr "Encogimiento por Estiramiento" @@ -4440,6 +4437,9 @@ msgstr "Pestañas Visibles" msgid "Syntax Highlighter" msgstr "Resaltador de Sintaxis" +msgid "Fit Content Height" +msgstr "Ajustar Altura Del Contenido" + msgid "Draw" msgstr "Dibujar" @@ -4611,9 +4611,6 @@ msgstr "Antialias" msgid "Use Debanding" msgstr "Usar Debanding" -msgid "Occlusion Culling" -msgstr "Occlusion Culling" - msgid "Atlas Size" msgstr "Tamaño de Atlas" @@ -4695,9 +4692,6 @@ msgstr "Tamaño MÃnimo" msgid "Max Size" msgstr "Tamaño Máximo" -msgid "Aspect" -msgstr "Aspecto" - msgid "Layer Names" msgstr "Nombres de las Capas" @@ -5586,9 +5580,6 @@ msgstr "Inicio de Expansión" msgid "Grow End" msgstr "Fin de Expansión" -msgid "Image" -msgstr "imagen" - msgid "Load Path" msgstr "Ruta de Carga" @@ -5613,6 +5604,9 @@ msgstr "Desde" msgid "To" msgstr "A" +msgid "Frames" +msgstr "Fotogramas" + msgid "Current Frame" msgstr "Cuadro Actual" @@ -5670,18 +5664,6 @@ msgstr "Mapa de Navegación" msgid "Direct Space State" msgstr "Estado de Espacio Directo" -msgid "Default Gravity" -msgstr "Gravedad Predeterminada" - -msgid "Default Gravity Vector" -msgstr "Vector de Gravedad Predeterminado" - -msgid "Default Cell Size" -msgstr "Vista Previa Predeterminada" - -msgid "Default Edge Connection Margin" -msgstr "Margen de Conexión de Bordes Predeterminado" - msgid "Fallback Environment" msgstr "Entorno de Retorno" @@ -5811,20 +5793,17 @@ msgstr "Compensación de Retraso de VÃdeo (ms)" msgid "Bus Count" msgstr "Conteo de Buses" -msgid "Capture Device" -msgstr "Dispositivo de Captura" - msgid "Feed" msgstr "Feed" msgid "Is Active" msgstr "Activo" -msgid "Sleep Threshold Linear" -msgstr "Umbral de Sueño Lineal" +msgid "Default Cell Size" +msgstr "Vista Previa Predeterminada" -msgid "Sleep Threshold Angular" -msgstr "Umbral de Sueño Angular" +msgid "Default Edge Connection Margin" +msgstr "Margen de Conexión de Bordes Predeterminado" msgid "Inverse Mass" msgstr "Masa Inversa" @@ -5850,6 +5829,18 @@ msgstr "Colisionar Con Ãreas" msgid "Shape RID" msgstr "RID de Forma" +msgid "Default Gravity" +msgstr "Gravedad Predeterminada" + +msgid "Default Gravity Vector" +msgstr "Vector de Gravedad Predeterminado" + +msgid "Sleep Threshold Linear" +msgstr "Umbral de Sueño Lineal" + +msgid "Sleep Threshold Angular" +msgstr "Umbral de Sueño Angular" + msgid "Physics Engine" msgstr "Motor de FÃsica" @@ -5883,18 +5874,6 @@ msgstr "Bucle de Renderización Activado" msgid "VRAM Compression" msgstr "Compresión VRAM" -msgid "Import BPTC" -msgstr "Importar BPTC" - -msgid "Import S3TC" -msgstr "Importar S3TC" - -msgid "Import ETC" -msgstr "Importar ETC" - -msgid "Import ETC2" -msgstr "Importar ETC2" - msgid "Lossless Compression" msgstr "Compresión Sin Pérdidas" diff --git a/editor/translations/properties/fr.po b/editor/translations/properties/fr.po index e2921d8586..74b674aa1c 100644 --- a/editor/translations/properties/fr.po +++ b/editor/translations/properties/fr.po @@ -114,16 +114,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-14 00:01+0000\n" -"Last-Translator: slundi <slundi@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 14:12+0000\n" +"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" -"godot/fr/>\n" +"godot-properties/fr/>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Application" @@ -134,9 +134,15 @@ msgstr "Configuration" msgid "Name" msgstr "Nom" +msgid "Description" +msgstr "Description" + msgid "Run" msgstr "Lancer" +msgid "Main Scene" +msgstr "Scène principale" + msgid "Disable stdout" msgstr "Désactiver stdout" @@ -164,33 +170,54 @@ msgstr "Fenêtre" msgid "Size" msgstr "Taille" +msgid "Mode" +msgstr "Mode" + msgid "Resizable" msgstr "Redimensionnable" msgid "Borderless" msgstr "Sans Bordure" +msgid "Always on Top" +msgstr "Toujours au dessus" + msgid "Transparent" msgstr "Transparent" +msgid "Extend to Title" +msgstr "Étirer au titre" + msgid "Energy Saving" msgstr "Économie d'Énergie" msgid "Keep Screen On" msgstr "Garder l'écran actif" +msgid "Audio" +msgstr "Audio" + msgid "Editor" msgstr "Éditeur" msgid "Main Run Args" msgstr "Paramètres d'exécution du programme principal" +msgid "Default Signal Callback Name" +msgstr "Nom de rappel de signal par défaut" + +msgid "Default Signal Callback to Self Name" +msgstr "Nom de rappel de signal à soi-même par défaut" + msgid "Physics" msgstr "Physique" msgid "2D" msgstr "2D" +msgid "Run on Separate Thread" +msgstr "Exécuter sur un thread différent" + msgid "3D" msgstr "3D" @@ -200,6 +227,9 @@ msgstr "Débogage" msgid "Settings" msgstr "Paramètres" +msgid "Compression" +msgstr "Compression" + msgid "Crash Handler" msgstr "Gestionnaire de Crash" @@ -209,6 +239,36 @@ msgstr "Message" msgid "Rendering" msgstr "Rendu" +msgid "Occlusion Culling" +msgstr "Elagage de l'occlusion" + +msgid "Limits" +msgstr "Limites" + +msgid "Internationalization" +msgstr "Internationalisation" + +msgid "Force Right to Left Layout Direction" +msgstr "Forcer l'affichage de droite à gauche" + +msgid "GUI" +msgstr "GUI" + +msgid "Rendering Device" +msgstr "Matériel de rendu" + +msgid "Block Size (KB)" +msgstr "Taille de bloc (Ko)" + +msgid "Max Size (MB)" +msgstr "Taille Maximale (Mo)" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Max Descriptors per Pool" +msgstr "Descripteurs maximums par Pool" + msgid "Low Processor Usage Mode" msgstr "Mode d'utilisation du processeur bas en ressources" @@ -218,6 +278,15 @@ msgstr "Mode d'utilisation faible du processeur Veille (µsec)" msgid "Print Error Messages" msgstr "Afficher les messages d'erreur" +msgid "Physics Ticks per Second" +msgstr "Ticks de physique par seconde" + +msgid "Max Physics Steps per Frame" +msgstr "Étapes de physique maximum par trame" + +msgid "Max FPS" +msgstr "FPS Max" + msgid "Time Scale" msgstr "Échelle de temps" @@ -233,9 +302,33 @@ msgstr "Utiliser l'entrée accumulée" msgid "Device" msgstr "Périphérique" +msgid "Window ID" +msgstr "ID de la fenêtre" + +msgid "Alt Pressed" +msgstr "Alt pressé" + +msgid "Shift Pressed" +msgstr "Shift pressé" + +msgid "Ctrl Pressed" +msgstr "Ctrl pressé" + +msgid "Meta Pressed" +msgstr "Meta pressé" + msgid "Pressed" msgstr "Pressé" +msgid "Keycode" +msgstr "Keycode" + +msgid "Physical Keycode" +msgstr "Keycode physique" + +msgid "Key Label" +msgstr "Label de touche" + msgid "Unicode" msgstr "Unicode" @@ -257,6 +350,9 @@ msgstr "Facteur" msgid "Button Index" msgstr "Index du Button" +msgid "Double Click" +msgstr "Double clic" + msgid "Tilt" msgstr "Inclinaison" @@ -281,6 +377,9 @@ msgstr "Valeur de l'Axe" msgid "Index" msgstr "Index" +msgid "Double Tap" +msgstr "Double appui" + msgid "Action" msgstr "Action" @@ -308,9 +407,24 @@ msgstr "Valeur du controller" msgid "Shortcut" msgstr "Raccourci" +msgid "Events" +msgstr "Événements" + +msgid "Include Navigational" +msgstr "Inclure navigationel" + +msgid "Include Hidden" +msgstr "Inclure caché(s)" + msgid "Big Endian" msgstr "Gros-boutiste" +msgid "Network" +msgstr "Réseau" + +msgid "Page Size" +msgstr "Taille de page" + msgid "Blocking Mode Enabled" msgstr "Mode de blocage activé" @@ -326,6 +440,12 @@ msgstr "Données" msgid "Object ID" msgstr "Identifiant de l'Objet" +msgid "Original Class" +msgstr "Classe originale" + +msgid "Recording Properties" +msgstr "Propriétés d'enregistrement" + msgid "Encode Buffer Max Size" msgstr "Taille maximale du tampon d'encodage" @@ -341,15 +461,15 @@ msgstr "Pair de flux" msgid "Resource" msgstr "Ressource" +msgid "Local to Scene" +msgstr "Local à la scène" + msgid "Path" msgstr "Chemin" msgid "Data Array" msgstr "Tableau de données" -msgid "Blocking Handshake" -msgstr "Blocage de la poignée de main" - msgid "Max Pending Connections" msgstr "Connexions Maximales en Attente" @@ -359,6 +479,18 @@ msgstr "Décalage" msgid "Cell Size" msgstr "Taille des Cellules" +msgid "Jumping Enabled" +msgstr "Saut actif" + +msgid "Default Compute Heuristic" +msgstr "Calculation heuristique par défaut" + +msgid "Default Estimate Heuristic" +msgstr "Estimation heuristique par défaut" + +msgid "Diagonal Mode" +msgstr "Mode diagonal" + msgid "Seed" msgstr "Graine" @@ -368,6 +500,24 @@ msgstr "État" msgid "Source Code" msgstr "Code Source" +msgid "TLS" +msgstr "TLS" + +msgid "Threading" +msgstr "Tâches parallèles (Threading)" + +msgid "Worker Pool" +msgstr "Pool de travailleur" + +msgid "Max Threads" +msgstr "Tâches parallèles maximum" + +msgid "Use System Threads for Low Priority Tasks" +msgstr "Utiliser les threads système pour les tâches de basse priorité" + +msgid "Low Priority Thread Ratio" +msgstr "Ratio de threads à basse priorité" + msgid "Locale" msgstr "Localisation" @@ -377,15 +527,33 @@ msgstr "Test" msgid "Fallback" msgstr "Repli" +msgid "Pseudolocalization" +msgstr "Pseudo-localisation" + +msgid "Use Pseudolocalization" +msgstr "Utiliser la pseudo-localisation" + +msgid "Replace With Accents" +msgstr "Remplacer avec accents" + +msgid "Double Vowels" +msgstr "Double voyelles" + msgid "Override" msgstr "Redéfinition" +msgid "Expansion Ratio" +msgstr "Ratio d'expansion" + msgid "Prefix" msgstr "Préfixe" msgid "Suffix" msgstr "Suffixe" +msgid "Skip Placeholders" +msgstr "Ignorer les substituts" + msgid "Rotation" msgstr "Rotation" @@ -425,21 +593,24 @@ msgstr "Animation" msgid "Easing" msgstr "Transition entrée-sortie" -msgid "Interface" -msgstr "Interface" - -msgid "Editors" -msgstr "Éditeurs" - -msgid "Network" -msgstr "Réseau" +msgid "Debug Adapter" +msgstr "Adaptateur de débogage" msgid "Remote Port" msgstr "Port distant" +msgid "Request Timeout" +msgstr "Délai de requête expiré (Timeout)" + +msgid "Sync Breakpoints" +msgstr "Synchroniser les point d'arrêts" + msgid "Debugger" msgstr "Débogueur" +msgid "Auto Switch to Remote Scene Tree" +msgstr "Basculer automatiquement vers l'arborescence de scène distante" + msgid "Remote Scene Tree Refresh Interval" msgstr "Intervalle de rafraîchissement de l'arborescence distante" @@ -458,6 +629,9 @@ msgstr "Accès" msgid "Display Mode" msgstr "Mode d'affichage" +msgid "File Mode" +msgstr "Mode fichier" + msgid "Current Dir" msgstr "Répertoire Actuel" @@ -479,6 +653,9 @@ msgstr "Importer" msgid "Reimport Missing Imported Files" msgstr "Réimporter les fichiers importés manquants" +msgid "Use Multiple Threads" +msgstr "Utiliser le multitâche" + msgid "Text Editor" msgstr "Éditeur de texte" @@ -500,11 +677,20 @@ msgstr "Cochable" msgid "Checked" msgstr "Coché" +msgid "Draw Warning" +msgstr "Montrer les avertissements" + msgid "Keying" msgstr "En train de taper" -msgid "Main Scene" -msgstr "Scène principale" +msgid "Deletable" +msgstr "Supprimable" + +msgid "Interface" +msgstr "Interface" + +msgid "Save on Focus Loss" +msgstr "Enregistrer à la perte de focus" msgid "Show Update Spinner" msgstr "Afficher l'indicateur d'activité" @@ -518,6 +704,9 @@ msgstr "Traduction des paramètres" msgid "Scene Tabs" msgstr "Onglets de scène" +msgid "Restore Scenes on Load" +msgstr "Rouvrir les scènes au chargement" + msgid "Inspector" msgstr "Inspecteur" @@ -539,9 +728,18 @@ msgstr "Édition horizontale de Vector2" msgid "Horizontal Vector Types Editing" msgstr "Édition de Types de Vecteur Horizontal" +msgid "Open Resources in Current Inspector" +msgstr "Ouvrir les ressources dans l'inspecteur actuel" + +msgid "Resources to Open in New Inspector" +msgstr "Ressources à ouvrir dans un nouvel inspecteur" + msgid "Default Color Picker Mode" msgstr "Mode par défaut du sélectionneur de couleur" +msgid "Default Color Picker Shape" +msgstr "Forme par défaut du sélecteur de couleur" + msgid "Distraction Free Mode" msgstr "Mode Sans Distraction" @@ -566,6 +764,15 @@ msgstr "Langue de l'éditeur" msgid "Display Scale" msgstr "Échelle d'affichage" +msgid "Enable Pseudolocalization" +msgstr "Activer la pseudo-localisation" + +msgid "Use Embedded Menu" +msgstr "Utiliser le menu intégré" + +msgid "Expand to Title" +msgstr "Étirer à la longueur du texte" + msgid "Custom Display Scale" msgstr "Échelle personnalisée d'affichage" @@ -575,9 +782,15 @@ msgstr "Taille de la police principale" msgid "Code Font Size" msgstr "Taille de la police du code" +msgid "Font Antialiasing" +msgstr "Anticrénelage de la police" + msgid "Font Hinting" msgstr "Optimisation de rendu de police" +msgid "Font Subpixel Positioning" +msgstr "Positionnement sous-pixel de la police" + msgid "Main Font" msgstr "Police Principale" @@ -599,15 +812,30 @@ msgstr "Mode distraction séparée" msgid "Automatically Open Screenshots" msgstr "Ouvrir automatiquement les captures d'écran" +msgid "Single Window Mode" +msgstr "Mode fenêtre unique" + msgid "Mouse Extra Buttons Navigate History" msgstr "Boutons additionnels de la souris déplacent dans l'historique" +msgid "Save Each Scene on Quit" +msgstr "Enregistrer chaque scène à la fermeture" + +msgid "Show Internal Errors in Toast Notifications" +msgstr "Montrer les erreurs internes dans les notifications Toast" + +msgid "Show Low Level OpenType Features" +msgstr "Afficher les fonctionnalités bas-niveau pour OpenType" + msgid "Theme" msgstr "Thème" msgid "Preset" msgstr "Préréglage" +msgid "Icon and Font Color" +msgstr "Couleur de police et d'icône" + msgid "Base Color" msgstr "Couleur de Base" @@ -617,6 +845,12 @@ msgstr "Couleur d'accentuation" msgid "Contrast" msgstr "Contraste" +msgid "Draw Extra Borders" +msgstr "Dessiner bordures supplémentaires" + +msgid "Icon Saturation" +msgstr "Saturation d'icône" + msgid "Relationship Line Opacity" msgstr "Opacité des lignes de relation" @@ -632,12 +866,36 @@ msgstr "Espacement supplémentaire" msgid "Custom Theme" msgstr "Thème Personnalisé" +msgid "Display Close Button" +msgstr "Afficher bouton Fermer" + +msgid "Show Thumbnail on Hover" +msgstr "Afficher la vignette au survol" + +msgid "Maximum Width" +msgstr "Largeur maximum" + msgid "Show Script Button" msgstr "Afficher le bouton script" msgid "FileSystem" msgstr "Système de fichiers" +msgid "External Programs" +msgstr "Programmes externes" + +msgid "Raster Image Editor" +msgstr "Éditeur d'images tramées" + +msgid "Vector Image Editor" +msgstr "Éditeur d'images vectorielles" + +msgid "Audio Editor" +msgstr "Éditeur audio" + +msgid "3D Model Editor" +msgstr "Éditeur de modèles 3D" + msgid "Directories" msgstr "Dossiers" @@ -668,9 +926,15 @@ msgstr "Arborescence de scène" msgid "Start Create Dialog Fully Expanded" msgstr "Lancer le dialogue de création complètement déplié" +msgid "Auto Expand to Selected" +msgstr "Étirement auto à la sélection" + msgid "Always Show Folders" msgstr "Toujours afficher les dossiers" +msgid "Textfile Extensions" +msgstr "Extensions de fichiers texte" + msgid "Property Editor" msgstr "Éditeur de Propriétés" @@ -692,12 +956,18 @@ msgstr "Caret" msgid "Caret Blink" msgstr "Clignotement du caret" +msgid "Caret Blink Interval" +msgstr "Intervalle de clignotement du caret" + msgid "Highlight Current Line" msgstr "Mettre en évidence la ligne actuelle" msgid "Highlight All Occurrences" msgstr "Mettre en évidence toutes les occurrences" +msgid "Guidelines" +msgstr "Lignes de guide" + msgid "Show Line Length Guidelines" msgstr "Montrer les guides de longueur de ligne" @@ -707,6 +977,9 @@ msgstr "Colonne douce des guides de longueur de ligne" msgid "Line Length Guideline Hard Column" msgstr "Colonne dure des guides de longueur de ligne" +msgid "Gutters" +msgstr "Gouttières" + msgid "Show Line Numbers" msgstr "Afficher les numéros de Ligne" @@ -731,12 +1004,18 @@ msgstr "Afficher la minimap" msgid "Minimap Width" msgstr "Largeur de la mini-carte" +msgid "Lines" +msgstr "Lignes" + msgid "Code Folding" msgstr "Rétrécir le code" msgid "Word Wrap" msgstr "Retour à la ligne des mots" +msgid "Whitespace" +msgstr "Espaces" + msgid "Draw Tabs" msgstr "Montrer les tabulations" @@ -746,15 +1025,30 @@ msgstr "Afficher les espaces" msgid "Line Spacing" msgstr "Espace entre les lignes" +msgid "Behavior" +msgstr "Comportement" + msgid "Navigation" msgstr "Navigation" +msgid "Move Caret on Right Click" +msgstr "Déplacer le caret au clic droit" + +msgid "Scroll Past End of File" +msgstr "Défiler au-delà de la fin du fichier" + msgid "Smooth Scrolling" msgstr "Défilement doux" msgid "V Scroll Speed" msgstr "Vitesse du défilement vertical" +msgid "Drag and Drop Selection" +msgstr "Glisser/déposer la sélection" + +msgid "Stay in Script Editor on Node Selected" +msgstr "Rester sur l’éditeur de script à la sélection d'un nÅ“ud" + msgid "Indent" msgstr "Indentation" @@ -764,9 +1058,21 @@ msgstr "Indentation automatique" msgid "Files" msgstr "Fichiers" +msgid "Trim Trailing Whitespace on Save" +msgstr "Retirer les espaces de fin de ligne à l'enregistrement" + msgid "Autosave Interval Secs" msgstr "Intervalle entre les sauvegardes automatiques (en secondes)" +msgid "Restore Scripts on Load" +msgstr "Rouvrir les scripts au chargement" + +msgid "Convert Indent on Save" +msgstr "Convertir les indentations à l'enregistrement" + +msgid "Auto Reload Scripts on External Change" +msgstr "Recharger automatiquement les scripts sur changement externe" + msgid "Script List" msgstr "Liste de scripts" @@ -812,6 +1118,12 @@ msgstr "Taille de police d'origine de l'aide" msgid "Help Title Font Size" msgstr "Taille de police du titre de l'aide" +msgid "Class Reference Examples" +msgstr "Exemples de référence de classe" + +msgid "Editors" +msgstr "Éditeurs" + msgid "Grid Map" msgstr "Grille" @@ -833,6 +1145,9 @@ msgstr "Manipulateurs 3D" msgid "Gizmo Colors" msgstr "Couleurs des manipulateurs" +msgid "Instantiated" +msgstr "Instancié" + msgid "Joint" msgstr "Jointure" @@ -977,9 +1292,15 @@ msgstr "Restreindre la fenêtre d'éditeur" msgid "Simple Panning" msgstr "Panoramique simple" +msgid "Tiles Editor" +msgstr "Éditeur de tuiles" + msgid "Display Grid" msgstr "Afficher la grille" +msgid "Polygon Editor" +msgstr "Éditeur de polygones" + msgid "Point Grab Radius" msgstr "Rayon de saisie de point" @@ -1010,6 +1331,15 @@ msgstr "Éditeurs visuels" msgid "Minimap Opacity" msgstr "Opacité de la mini-carte" +msgid "Lines Curvature" +msgstr "Courbe de lignes" + +msgid "Visual Shader" +msgstr "Visual Shader" + +msgid "Port Preview Size" +msgstr "Taille d'aperçu" + msgid "Window Placement" msgstr "Placement de la fenêtre" @@ -1037,6 +1367,9 @@ msgstr "Taille de la Police" msgid "Remote Host" msgstr "Hôte distant" +msgid "Editor TLS Certificates" +msgstr "Certificats TLS de l’éditeur" + msgid "Profiler Frame History Size" msgstr "Taille de l'historique de la trame du profileur" @@ -1175,6 +1508,9 @@ msgstr "Zoomer" msgid "Export" msgstr "Exporter" +msgid "Convert Text Resources to Binary" +msgstr "Convertir les ressources texte en binaire lors de l'exportation" + msgid "Custom Template" msgstr "Modèle Personnalisé" @@ -1229,6 +1565,9 @@ msgstr "Taille de Contour" msgid "Variation" msgstr "Variation" +msgid "Transform" +msgstr "Transformation" + msgid "Collada" msgstr "Collada" @@ -1259,15 +1598,9 @@ msgstr "Précharger" msgid "Columns" msgstr "Colonnes" -msgid "Mode" -msgstr "Mode" - msgid "Lossy Quality" msgstr "Mauvaise qualité" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmaps" @@ -1334,12 +1667,6 @@ msgstr "Optimiseur" msgid "Max Angular Error" msgstr "Erreur Angulaire Max" -msgid "Compression" -msgstr "Compression" - -msgid "Page Size" -msgstr "Taille de page" - msgid "Nodes" msgstr "NÅ“uds" @@ -1448,6 +1775,9 @@ msgstr "Utiliser le multitâche" msgid "Available URLs" msgstr "URLs disponibles" +msgid "Unset" +msgstr "Vider" + msgid "Error" msgstr "Erreur" @@ -1565,9 +1895,6 @@ msgstr "Tâches Parallèles" msgid "Thread Model" msgstr "Modèle de Parallélisme" -msgid "Audio" -msgstr "Audio" - msgid "Handheld" msgstr "Portable" @@ -1598,15 +1925,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Masquer l'indicateur d’accueil" +msgid "Input Devices" +msgstr "Périphériques d'entrée" + +msgid "Pointing" +msgstr "Pointage" + msgid "Boot Splash" msgstr "Écran de démarrage" msgid "BG Color" msgstr "Couleur d'arrière-plan" -msgid "Input Devices" -msgstr "Périphériques d'entrée" - msgid "Environment" msgstr "Environnement" @@ -1616,21 +1946,24 @@ msgstr "Couleur d'effacement par défaut" msgid "Show Image" msgstr "Afficher l'image" +msgid "Image" +msgstr "Image" + msgid "Fullsize" msgstr "Pleine taille" msgid "Use Filter" msgstr "Utiliser le filtrage" +msgid "Icon" +msgstr "Icône" + msgid "Buffering" msgstr "Mise en mémoire tampon" msgid "Agile Event Flushing" msgstr "Purge d'événement agile" -msgid "Pointing" -msgstr "Pointage" - msgid "Emulate Touch From Mouse" msgstr "Émuler le toucher tactile avec la souris" @@ -1658,12 +1991,15 @@ msgstr "Choisir un répertoire pour la solution" msgid "Main Loop Type" msgstr "Type de boucle principale" +msgid "Stretch" +msgstr "Étirement" + +msgid "Aspect" +msgstr "Aspect" + msgid "Auto Accept Quit" msgstr "Accepter automatiquement la fermeture" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "Polices" @@ -1673,6 +2009,9 @@ msgstr "Polices Dynamiques" msgid "Use Oversampling" msgstr "Utiliser le suréchantillonnage" +msgid "Textures" +msgstr "Textures" + msgid "Operation" msgstr "Opération" @@ -1856,9 +2195,6 @@ msgstr "Chemin de base" msgid "Root Nodes" msgstr "NÅ“uds racines" -msgid "Textures" -msgstr "Textures" - msgid "Images" msgstr "Images" @@ -2153,9 +2489,6 @@ msgstr "État IGD" msgid "Write Mode" msgstr "Mode écriture" -msgid "Limits" -msgstr "Limites" - msgid "WebRTC" msgstr "WebRTC" @@ -2210,12 +2543,6 @@ msgstr "Avant-Plan Adaptatif 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Arrière-Plan Adaptatif 432 X 432" -msgid "Custom Build" -msgstr "Construction personnalisé" - -msgid "Use Custom Build" -msgstr "Utiliser une construction personnalisé" - msgid "Export Format" msgstr "Format d'exportation" @@ -2483,9 +2810,6 @@ msgstr "Architecture" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Icône" - msgid "Copyright" msgstr "Copyright" @@ -2621,9 +2945,6 @@ msgstr "Afficher le nom" msgid "Short Name" msgstr "Nom Abrégé" -msgid "Description" -msgstr "Description" - msgid "Publisher" msgstr "Publicateur" @@ -2783,18 +3104,12 @@ msgstr "Description de fichier" msgid "Trademarks" msgstr "Marques Déposées" -msgid "Frames" -msgstr "Trames" - msgid "Frame" msgstr "Trame" msgid "Speed Scale" msgstr "Échelle de vitesse" -msgid "Playing" -msgstr "En train de jouer" - msgid "Centered" msgstr "Centré" @@ -2840,6 +3155,9 @@ msgstr "Volume (dB)" msgid "Pitch Scale" msgstr "Échelle de pitch" +msgid "Playing" +msgstr "En train de jouer" + msgid "Autoplay" msgstr "Lecture automatique" @@ -3209,9 +3527,6 @@ msgstr "Coût de déplacement" msgid "Estimate Radius" msgstr "Estimer le rayon" -msgid "Transform" -msgstr "Transformation" - msgid "Rotation Degrees" msgstr "Degrés de Rotation" @@ -3494,9 +3809,6 @@ msgstr "Désactiver axe Z" msgid "Flatness" msgstr "Platitude" -msgid "Extents" -msgstr "Étendues" - msgid "Albedo" msgstr "Albédo" @@ -4055,9 +4367,6 @@ msgstr "Retard aléatoire" msgid "Xfade Time" msgstr "Durée du fondu croisé" -msgid "Reset" -msgstr "Réinitialiser" - msgid "Active" msgstr "Actif" @@ -4067,8 +4376,8 @@ msgstr "Ajouter une quantité" msgid "Blend Amount" msgstr "Quantité de mélange" -msgid "Seek Position" -msgstr "Chercher la position" +msgid "Reset" +msgstr "Réinitialiser" msgid "Switch" msgstr "Switch" @@ -4391,9 +4700,6 @@ msgstr "Alentours" msgid "Relative Index" msgstr "Position relative" -msgid "Fit Content Height" -msgstr "Ajuster à la hauteur du conteneur" - msgid "Scroll Active" msgstr "Défilement actif" @@ -4436,9 +4742,6 @@ msgstr "Réduit" msgid "Dragger Visibility" msgstr "Visibilité du Tireur" -msgid "Stretch" -msgstr "Étirement" - msgid "Stretch Shrink" msgstr "Etirer-Réduire" @@ -4457,6 +4760,9 @@ msgstr "Onglets Visibles" msgid "Syntax Highlighter" msgstr "Coloration syntaxique" +msgid "Fit Content Height" +msgstr "Ajuster à la hauteur du conteneur" + msgid "Draw" msgstr "Dessiner" @@ -4628,9 +4934,6 @@ msgstr "Anticrénelage" msgid "Use Debanding" msgstr "Utiliser le Debanding" -msgid "Occlusion Culling" -msgstr "Elagage de l'occlusion" - msgid "Atlas Size" msgstr "Taille de l'Atlas" @@ -4712,9 +5015,6 @@ msgstr "Taille Minimale" msgid "Max Size" msgstr "Taille maximale" -msgid "Aspect" -msgstr "Aspect" - msgid "Layer Names" msgstr "Noms des couches" @@ -5612,9 +5912,6 @@ msgstr "Début d'Expansion" msgid "Grow End" msgstr "Fin d'Expansion" -msgid "Image" -msgstr "Image" - msgid "Load Path" msgstr "Charger chemin" @@ -5639,6 +5936,9 @@ msgstr "De" msgid "To" msgstr "À" +msgid "Frames" +msgstr "Trames" + msgid "Current Frame" msgstr "Trame actuelle" @@ -5696,18 +5996,6 @@ msgstr "Carte de navigation" msgid "Direct Space State" msgstr "Etat de l'espace direct" -msgid "Default Gravity" -msgstr "Gravité par Défaut" - -msgid "Default Gravity Vector" -msgstr "Vecteur de gravité par défaut" - -msgid "Default Cell Size" -msgstr "Taille de cellule par défaut" - -msgid "Default Edge Connection Margin" -msgstr "Marge de connexion des bords par défaut" - msgid "Fallback Environment" msgstr "Environnement de repli" @@ -5843,20 +6131,17 @@ msgstr "Compensation de retard vidéo (ms)" msgid "Bus Count" msgstr "Nombre de ports" -msgid "Capture Device" -msgstr "Périphérique de capture" - msgid "Feed" msgstr "Flux" msgid "Is Active" msgstr "Est active" -msgid "Sleep Threshold Linear" -msgstr "Seuil linéaire de veille" +msgid "Default Cell Size" +msgstr "Taille de cellule par défaut" -msgid "Sleep Threshold Angular" -msgstr "Seuil angulaire de veille" +msgid "Default Edge Connection Margin" +msgstr "Marge de connexion des bords par défaut" msgid "Inverse Mass" msgstr "Masse inverse" @@ -5885,6 +6170,18 @@ msgstr "Collisions avec les zones" msgid "Shape RID" msgstr "RID de forme" +msgid "Default Gravity" +msgstr "Gravité par Défaut" + +msgid "Default Gravity Vector" +msgstr "Vecteur de gravité par défaut" + +msgid "Sleep Threshold Linear" +msgstr "Seuil linéaire de veille" + +msgid "Sleep Threshold Angular" +msgstr "Seuil angulaire de veille" + msgid "Physics Engine" msgstr "Moteur physique" @@ -5918,18 +6215,6 @@ msgstr "Boucle de rendu activée" msgid "VRAM Compression" msgstr "Compression VRAM" -msgid "Import BPTC" -msgstr "Importer BPTC" - -msgid "Import S3TC" -msgstr "Importer S3TC" - -msgid "Import ETC" -msgstr "Importer ETC" - -msgid "Import ETC2" -msgstr "Importer ETC2" - msgid "Lossless Compression" msgstr "Compression sans perte" diff --git a/editor/translations/properties/it.po b/editor/translations/properties/it.po index 07a23b2ceb..b68a503386 100644 --- a/editor/translations/properties/it.po +++ b/editor/translations/properties/it.po @@ -82,16 +82,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-15 13:34+0000\n" -"Last-Translator: Damiano Guida <damiano.guida22@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:55+0000\n" +"Last-Translator: gianmarco malandra <giamminho12@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" -"godot/it/>\n" +"godot-properties/it/>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Applicazione" @@ -102,9 +102,15 @@ msgstr "Configurazione" msgid "Name" msgstr "Nome" +msgid "Description" +msgstr "Descrizione" + msgid "Run" msgstr "Esegui" +msgid "Main Scene" +msgstr "Scena Principale" + msgid "Disable stdout" msgstr "Disabilita stdout" @@ -124,7 +130,7 @@ msgid "Project Settings Override" msgstr "Sovrascrittura Impostazioni del Progetto" msgid "Display" -msgstr "Display" +msgstr "Schermo" msgid "Window" msgstr "Finestra" @@ -132,6 +138,9 @@ msgstr "Finestra" msgid "Size" msgstr "Dimensione" +msgid "Mode" +msgstr "Modalità " + msgid "Resizable" msgstr "Ridimensionabile" @@ -144,6 +153,9 @@ msgstr "Risparmio Energia" msgid "Keep Screen On" msgstr "Mantieni lo Schermo Acceso" +msgid "Audio" +msgstr "Audio" + msgid "Editor" msgstr "Editor" @@ -165,6 +177,9 @@ msgstr "Debug" msgid "Settings" msgstr "Impostazioni" +msgid "Compression" +msgstr "Compressione" + msgid "Crash Handler" msgstr "Gestore di Crash" @@ -174,6 +189,12 @@ msgstr "Messaggio" msgid "Rendering" msgstr "Renderer" +msgid "Limits" +msgstr "Limiti" + +msgid "GUI" +msgstr "Interfaccia Grafica" + msgid "Low Processor Usage Mode" msgstr "Modalità Processore a Basso Consumo" @@ -273,6 +294,12 @@ msgstr "Valore Controller" msgid "Big Endian" msgstr "Big Endian" +msgid "Network" +msgstr "Reti" + +msgid "Page Size" +msgstr "Dimensione Pagina" + msgid "Blocking Mode Enabled" msgstr "Modalità Blocco Attivata" @@ -309,15 +336,15 @@ msgstr "Percorso" msgid "Data Array" msgstr "Array di Dati" -msgid "Blocking Handshake" -msgstr "Blocco Handshake" - msgid "Max Pending Connections" msgstr "Quantità Massima Connessioni in Attesa" msgid "Offset" msgstr "Scostamento" +msgid "Cell Size" +msgstr "Dimensione Cella" + msgid "Seed" msgstr "Seme" @@ -375,15 +402,6 @@ msgstr "Animazione" msgid "Easing" msgstr "Allentamento" -msgid "Interface" -msgstr "Interfaccia Utente" - -msgid "Editors" -msgstr "Editori" - -msgid "Network" -msgstr "Reti" - msgid "Remote Port" msgstr "Porta Remota" @@ -453,8 +471,8 @@ msgstr "Selezionato" msgid "Keying" msgstr "Tasti" -msgid "Main Scene" -msgstr "Scena Principale" +msgid "Interface" +msgstr "Interfaccia Utente" msgid "Show Update Spinner" msgstr "Mostra Rotella di Caricamento dell'Update" @@ -753,6 +771,9 @@ msgstr "Dimensione dei caratteri della sezione d'assistenza codice sorgente" msgid "Help Title Font Size" msgstr "Dimensione Carattere Titolo della Guida" +msgid "Editors" +msgstr "Editori" + msgid "Grid Map" msgstr "Mappa di Griglia" @@ -1152,6 +1173,9 @@ msgstr "Password" msgid "Compress" msgstr "Comprimi" +msgid "Transform" +msgstr "Trasformazione" + msgid "Collada" msgstr "Collada" @@ -1179,9 +1203,6 @@ msgstr "Delimitatore" msgid "Preload" msgstr "Pre-carica" -msgid "Mode" -msgstr "Modalità " - msgid "Lossy Quality" msgstr "Qualità Lossy" @@ -1242,12 +1263,6 @@ msgstr "Ottimizzatore" msgid "Max Angular Error" msgstr "Errore Angolare Max" -msgid "Compression" -msgstr "Compressione" - -msgid "Page Size" -msgstr "Dimensione Pagina" - msgid "Nodes" msgstr "Nodi" @@ -1353,6 +1368,9 @@ msgstr "Utilizza Threads" msgid "Available URLs" msgstr "URLs Disponibili" +msgid "Unset" +msgstr "Non Impostato" + msgid "Error" msgstr "Errore" @@ -1464,9 +1482,6 @@ msgstr "Threads" msgid "Thread Model" msgstr "Modello Thread" -msgid "Audio" -msgstr "Audio" - msgid "Handheld" msgstr "Maneggiato" @@ -1497,15 +1512,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Nascondi Indicatore Home" +msgid "Input Devices" +msgstr "Dispositivi Input" + +msgid "Pointing" +msgstr "Puntamento" + msgid "Boot Splash" msgstr "Sfondo Di Avvio" msgid "BG Color" msgstr "Colore Sfondo" -msgid "Input Devices" -msgstr "Dispositivi Input" - msgid "Environment" msgstr "Ambiente" @@ -1515,21 +1533,24 @@ msgstr "Colore Di Sfondo Di Default" msgid "Show Image" msgstr "Mostra Immagine" +msgid "Image" +msgstr "Immagine" + msgid "Fullsize" msgstr "Dimensione Massima" msgid "Use Filter" msgstr "Usa Filtro" +msgid "Icon" +msgstr "Icona" + msgid "Buffering" msgstr "Buffering" msgid "Agile Event Flushing" msgstr "Svuotamento degli eventi usando l'algoritmo Agile" -msgid "Pointing" -msgstr "Puntamento" - msgid "Emulate Touch From Mouse" msgstr "Emula Tocco Da Mouse" @@ -1554,12 +1575,15 @@ msgstr "Cartella di Soluzione" msgid "Main Loop Type" msgstr "Tipo di Loop Principale" +msgid "Stretch" +msgstr "Allarga" + +msgid "Aspect" +msgstr "Aspetto" + msgid "Auto Accept Quit" msgstr "Auto-Accetta Uscita" -msgid "GUI" -msgstr "Interfaccia Grafica" - msgid "Fonts" msgstr "Font" @@ -1569,6 +1593,9 @@ msgstr "Font Dinamici" msgid "Use Oversampling" msgstr "Usa Oversampling" +msgid "Textures" +msgstr "Textures" + msgid "Operation" msgstr "Operazione" @@ -1737,9 +1764,6 @@ msgstr "Nome Scena" msgid "Root Nodes" msgstr "Nodi Radice" -msgid "Textures" -msgstr "Textures" - msgid "Images" msgstr "Immagini" @@ -2013,9 +2037,6 @@ msgstr "Indirizzo locale IGD" msgid "IGD Status" msgstr "Stato IGD" -msgid "Limits" -msgstr "Limiti" - msgid "Handshake Timeout" msgstr "Timeout Handshake" @@ -2058,12 +2079,6 @@ msgstr "Primo Piano Adattivo 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Sfondo Adattivo 432 X 432" -msgid "Custom Build" -msgstr "Build Personalizzata" - -msgid "Use Custom Build" -msgstr "Utilizza Build Personalizzata" - msgid "Export Format" msgstr "Formato Esportazione" @@ -2319,9 +2334,6 @@ msgstr "Architettura" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Icona" - msgid "Copyright" msgstr "Copyright" @@ -2439,9 +2451,6 @@ msgstr "UWP" msgid "Short Name" msgstr "Nome Corto" -msgid "Description" -msgstr "Descrizione" - msgid "Publisher" msgstr "Publisher" @@ -2559,9 +2568,6 @@ msgstr "Multimesh" msgid "Navigation Layers" msgstr "Livelli Navigazione" -msgid "Transform" -msgstr "Trasformazione" - msgid "Rotation Degrees" msgstr "Rotazione in Gradi" @@ -2784,9 +2790,6 @@ msgstr "Passo" msgid "Page" msgstr "Pagina" -msgid "Stretch" -msgstr "Allarga" - msgid "Current Tab" msgstr "Scheda Attuale" @@ -2841,9 +2844,6 @@ msgstr "Schermo Attuale" msgid "Min Size" msgstr "Dimensione Min" -msgid "Aspect" -msgstr "Aspetto" - msgid "Format" msgstr "Formato" @@ -2874,6 +2874,12 @@ msgstr "Cursore" msgid "Node" msgstr "Nodo" +msgid "Sky" +msgstr "Cielo" + +msgid "Ambient Light" +msgstr "Luce Ambientale" + msgid "Source" msgstr "Sorgente" @@ -2946,9 +2952,6 @@ msgstr "In Basso A Destra" msgid "Bottom Left" msgstr "In Basso A Sinistra" -msgid "Image" -msgstr "Immagine" - msgid "Atlas" msgstr "Atlas" diff --git a/editor/translations/properties/ja.po b/editor/translations/properties/ja.po index cb921b2f8a..60b30d9404 100644 --- a/editor/translations/properties/ja.po +++ b/editor/translations/properties/ja.po @@ -52,16 +52,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: T K <kidaaam@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 00:55+0000\n" +"Last-Translator: Saitos <purifyzombie@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" -"godot/ja/>\n" +"godot-properties/ja/>\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "アプリケーション" @@ -72,9 +72,15 @@ msgstr "構æˆ" msgid "Name" msgstr "åå‰" +msgid "Description" +msgstr "説明" + msgid "Run" msgstr "実行" +msgid "Main Scene" +msgstr "メインシーン" + msgid "Disable stdout" msgstr "stdoutを無効化" @@ -102,6 +108,9 @@ msgstr "ウィンドウ" msgid "Size" msgstr "サイズ" +msgid "Mode" +msgstr "モード" + msgid "Resizable" msgstr "サイズを変更å¯èƒ½" @@ -114,6 +123,9 @@ msgstr "çœã‚¨ãƒãƒ«ã‚®ãƒ¼" msgid "Keep Screen On" msgstr "ç”»é¢ã‚’常ã«ç‚¹ç¯" +msgid "Audio" +msgstr "オーディオ" + msgid "Editor" msgstr "エディター" @@ -135,6 +147,9 @@ msgstr "デãƒãƒƒã‚°" msgid "Settings" msgstr "è¨å®š" +msgid "Compression" +msgstr "圧縮" + msgid "Crash Handler" msgstr "クラッシュãƒãƒ³ãƒ‰ãƒ©ãƒ¼" @@ -144,6 +159,24 @@ msgstr "メッセージ" msgid "Rendering" msgstr "レンダリング" +msgid "Occlusion Culling" +msgstr "オクルージョンカリング" + +msgid "Limits" +msgstr "制é™" + +msgid "Force Right to Left Layout Direction" +msgstr "レイアウト方å‘ã‚’å³ã‹ã‚‰å·¦ã«å¼·åˆ¶" + +msgid "GUI" +msgstr "GUI" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Max Descriptors per Pool" +msgstr "プールã‚ãŸã‚Šã®æœ€å¤§è¨˜è¿°åæ•°" + msgid "Low Processor Usage Mode" msgstr "プãƒã‚»ãƒƒã‚µãƒ¼ä½Žä½¿ç”¨çŽ‡ãƒ¢ãƒ¼ãƒ‰" @@ -168,9 +201,15 @@ msgstr "è“„ç©ã•ã‚ŒãŸå…¥åŠ›ã‚’使用" msgid "Device" msgstr "デãƒã‚¤ã‚¹" +msgid "Command or Control Autoremap" +msgstr "コマンドã¾ãŸã¯ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®è‡ªå‹•å†ãƒžãƒƒãƒ—" + msgid "Pressed" msgstr "押下" +msgid "Keycode" +msgstr "ã‚ーコード" + msgid "Unicode" msgstr "Unicode" @@ -192,6 +231,9 @@ msgstr "ä¿‚æ•°" msgid "Button Index" msgstr "ボタンã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹" +msgid "Double Click" +msgstr "ダブルクリック" + msgid "Tilt" msgstr "傾ã" @@ -243,6 +285,12 @@ msgstr "コントãƒãƒ¼ãƒ©ãƒ¼å€¤" msgid "Big Endian" msgstr "ビッグエンディアン" +msgid "Network" +msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" + +msgid "Page Size" +msgstr "ページサイズ" + msgid "Blocking Mode Enabled" msgstr "ブãƒãƒƒã‚ングモードを有効化" @@ -279,9 +327,6 @@ msgstr "パス" msgid "Data Array" msgstr "データé…列" -msgid "Blocking Handshake" -msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’ブãƒãƒƒã‚ング処ç†ã«ã™ã‚‹" - msgid "Max Pending Connections" msgstr "ä¿ç•™ä¸ã®æŽ¥ç¶šæ•°ã®ä¸Šé™" @@ -300,6 +345,18 @@ msgstr "状態" msgid "Source Code" msgstr "ソースコード" +msgid "TLS" +msgstr "TLS" + +msgid "Worker Pool" +msgstr "ワーカープール" + +msgid "Use System Threads for Low Priority Tasks" +msgstr "優先度ã®ä½Žã„タスクã«ã‚·ã‚¹ãƒ†ãƒ スレッドを使用" + +msgid "Low Priority Thread Ratio" +msgstr "優先度ã®ä½Žã„スレッドã®æ¯”率" + msgid "Locale" msgstr "ãƒã‚±ãƒ¼ãƒ«" @@ -309,6 +366,9 @@ msgstr "テスト" msgid "Fallback" msgstr "フォールãƒãƒƒã‚¯" +msgid "Fake BiDi" +msgstr "å½ã®BiDi" + msgid "Override" msgstr "上書ã" @@ -345,15 +405,6 @@ msgstr "アニメーション" msgid "Easing" msgstr "イージング" -msgid "Interface" -msgstr "インターフェース" - -msgid "Editors" -msgstr "エディター" - -msgid "Network" -msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" - msgid "Remote Port" msgstr "リモートãƒãƒ¼ãƒˆ" @@ -423,8 +474,8 @@ msgstr "ãƒã‚§ãƒƒã‚¯æ¸ˆã¿" msgid "Keying" msgstr "ã‚ーイング" -msgid "Main Scene" -msgstr "メインシーン" +msgid "Interface" +msgstr "インターフェース" msgid "Show Update Spinner" msgstr "アップデートスピナーを表示" @@ -486,6 +537,12 @@ msgstr "エディターã®è¨€èªž" msgid "Display Scale" msgstr "表示スケール" +msgid "Enable Pseudolocalization" +msgstr "擬似ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã®æœ‰åŠ¹åŒ–" + +msgid "Use Embedded Menu" +msgstr "埋ã‚è¾¼ã¿ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’使用" + msgid "Custom Display Scale" msgstr "カスタムã®è¡¨ç¤ºã‚¹ã‚±ãƒ¼ãƒ«" @@ -495,9 +552,18 @@ msgstr "メインã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º" msgid "Code Font Size" msgstr "コードã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º" +msgid "Code Font Contextual Ligatures" +msgstr "コードフォントコンテã‚ストåˆå—" + +msgid "Code Font Custom OpenType Features" +msgstr "コードフォントカスタムOpenType機能" + msgid "Font Hinting" msgstr "フォントã®ãƒ’ンティング" +msgid "Font Subpixel Positioning" +msgstr "フォントサブピクセルã®é…ç½®" + msgid "Main Font" msgstr "メインã®ãƒ•ã‚©ãƒ³ãƒˆ" @@ -522,6 +588,15 @@ msgstr "自動的ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹ã" msgid "Mouse Extra Buttons Navigate History" msgstr "マウスã®è¿½åŠ ボタンã§å±¥æ´ã‚’表示" +msgid "Accept Dialog Cancel OK Buttons" +msgstr "確èªãƒ€ã‚¤ã‚¢ãƒã‚°ã‚ャンセルOKボタン" + +msgid "Show Internal Errors in Toast Notifications" +msgstr "Toast通知ã«å†…部エラーを表示" + +msgid "Show Low Level OpenType Features" +msgstr "低レベルã®OpenType機能を表示" + msgid "Theme" msgstr "テーマ" @@ -537,6 +612,9 @@ msgstr "アクセントカラー" msgid "Contrast" msgstr "コントラスト" +msgid "Draw Extra Borders" +msgstr "エクストラボーダーをæç”»" + msgid "Relationship Line Opacity" msgstr "関係線ã®ä¸é€æ˜Žåº¦" @@ -555,6 +633,9 @@ msgstr "スクリプトボタンを表示" msgid "FileSystem" msgstr "ファイルシステム" +msgid "Vector Image Editor" +msgstr "ベクター画åƒã‚¨ãƒ‡ã‚£ã‚¿" + msgid "Directories" msgstr "ディレクトリ" @@ -603,6 +684,9 @@ msgstr "カラーテーマ" msgid "Appearance" msgstr "外観" +msgid "Caret" +msgstr "ã‚ャレット" + msgid "Caret Blink" msgstr "ã‚ャレットã®ç‚¹æ»…" @@ -612,6 +696,9 @@ msgstr "ç¾åœ¨ã®è¡Œã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" msgid "Highlight All Occurrences" msgstr "ã™ã¹ã¦ã®å‡ºç¾ç®‡æ‰€ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" +msgid "Guidelines" +msgstr "ガイドライン" + msgid "Show Line Length Guidelines" msgstr "è¡Œã®é•·ã•ã®ã‚¬ã‚¤ãƒ‰ç·šã‚’表示" @@ -636,6 +723,9 @@ msgstr "ブックマークãƒãƒ¼ã‚’表示" msgid "Show Info Gutter" msgstr "æƒ…å ±ãƒãƒ¼ã‚’表示" +msgid "Minimap" +msgstr "ミニマップ" + msgid "Show Minimap" msgstr "ミニマップを表示" @@ -648,6 +738,9 @@ msgstr "コードã®æŠ˜ã‚ŠãŸãŸã¿" msgid "Word Wrap" msgstr "ワードラップ" +msgid "Whitespace" +msgstr "空白" + msgid "Draw Tabs" msgstr "タブをæç”»" @@ -657,9 +750,15 @@ msgstr "スペースをæç”»" msgid "Line Spacing" msgstr "行間隔" +msgid "Behavior" +msgstr "ビヘイビア" + msgid "Navigation" msgstr "ナビゲーション" +msgid "Move Caret on Right Click" +msgstr "å³ã‚¯ãƒªãƒƒã‚¯ã§ã‚ャレットを移動" + msgid "Smooth Scrolling" msgstr "スムーズスクãƒãƒ¼ãƒ«" @@ -723,6 +822,9 @@ msgstr "ヘルプã®ã‚½ãƒ¼ã‚¹ã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º" msgid "Help Title Font Size" msgstr "ヘルプã®ã‚¿ã‚¤ãƒˆãƒ«ã®ãƒ•ã‚©ãƒ³ãƒˆã‚µã‚¤ã‚º" +msgid "Editors" +msgstr "エディター" + msgid "Grid Map" msgstr "グリッドマップ" @@ -882,6 +984,12 @@ msgstr "ビューãƒãƒ¼ãƒˆã®ãƒœãƒ¼ãƒ€ãƒ¼ã®è‰²" msgid "Constrain Editor View" msgstr "エディタビューをæŸç¸›ã™ã‚‹" +msgid "Sub Editors Panning Scheme" +msgstr "サブエディターã®ãƒ‘ンニングスã‚ーム" + +msgid "Animation Editors Panning Scheme" +msgstr "アニメーションエディタã®ãƒ‘ンニングスã‚ーム" + msgid "Simple Panning" msgstr "簡易パンニングæ“作" @@ -1122,9 +1230,30 @@ msgstr "ファイルサーãƒãƒ¼" msgid "Password" msgstr "パスワード" +msgid "Multichannel Signed Distance Field" +msgstr "マルãƒãƒãƒ£ãƒ³ãƒãƒ«ç¬¦å·ä»˜ãè·é›¢ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰" + +msgid "MSDF Pixel Range" +msgstr "MSDF ピクセル範囲" + +msgid "Hinting" +msgstr "ヒンティング" + +msgid "Subpixel Positioning" +msgstr "サブピクセルã®é…ç½®" + +msgid "Oversampling" +msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リング" + msgid "Compress" msgstr "圧縮" +msgid "Language" +msgstr "言語:" + +msgid "Transform" +msgstr "トランスフォーム" + msgid "Collada" msgstr "Collada" @@ -1143,21 +1272,18 @@ msgstr "フィルター" msgid "Threshold" msgstr "ã—ãã„値" +msgid "Except Bone Transform" +msgstr "ボーントランスフォームを除外" + msgid "Create From" msgstr "作æˆå…ƒ" msgid "Delimiter" msgstr "区切り文å—" -msgid "Mode" -msgstr "モード" - msgid "Lossy Quality" msgstr "éžå¯é€†å“質" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "ミップマップ" @@ -1218,12 +1344,6 @@ msgstr "オプティマイザー(Optimizer)" msgid "Max Angular Error" msgstr "最大角度エラー" -msgid "Compression" -msgstr "圧縮" - -msgid "Page Size" -msgstr "ページサイズ" - msgid "Nodes" msgstr "ノード" @@ -1329,6 +1449,9 @@ msgstr "スレッドを使用" msgid "Available URLs" msgstr "有効ãªURL" +msgid "Unset" +msgstr "未è¨å®š" + msgid "Error" msgstr "エラー" @@ -1428,9 +1551,6 @@ msgstr "スレッド" msgid "Thread Model" msgstr "スレッドモデル" -msgid "Audio" -msgstr "オーディオ" - msgid "Handheld" msgstr "ãƒãƒ¼ã‚¿ãƒ–ル" @@ -1461,15 +1581,21 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "ãƒ›ãƒ¼ãƒ ã‚¤ãƒ³ã‚¸ã‚±ãƒ¼ã‚¿ãƒ¼ã‚’éš ã™" +msgid "Input Devices" +msgstr "入力デãƒã‚¤ã‚¹" + +msgid "Pointing" +msgstr "ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°" + +msgid "XR" +msgstr "XR" + msgid "Boot Splash" msgstr "ブートスプラッシュ" msgid "BG Color" msgstr "背景色" -msgid "Input Devices" -msgstr "入力デãƒã‚¤ã‚¹" - msgid "Environment" msgstr "環境" @@ -1479,21 +1605,24 @@ msgstr "デフォルトã®ã‚¯ãƒªã‚¢ãƒ¼è‰²" msgid "Show Image" msgstr "ç”»åƒã‚’表示" +msgid "Image" +msgstr "ç”»åƒ" + msgid "Fullsize" msgstr "フルサイズ" msgid "Use Filter" msgstr "フィルターを使用" +msgid "Icon" +msgstr "アイコン" + msgid "Buffering" msgstr "ãƒãƒƒãƒ•ã‚¡ãƒªãƒ³ã‚°" msgid "Agile Event Flushing" msgstr "å³åº§ã«ã‚¤ãƒ™ãƒ³ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥" -msgid "Pointing" -msgstr "ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°" - msgid "Emulate Touch From Mouse" msgstr "マウスã§ã‚¿ãƒƒãƒæ“作をエミュレート" @@ -1521,12 +1650,15 @@ msgstr "ソリューションã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" msgid "Main Loop Type" msgstr "メインループã®ã‚¿ã‚¤ãƒ—" +msgid "Stretch" +msgstr "ストレッãƒ" + +msgid "Aspect" +msgstr "アスペクト" + msgid "Auto Accept Quit" msgstr "プãƒã‚°ãƒ©ãƒ 終了を自動的ã«å—ã‘入れる" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "フォント" @@ -1536,6 +1668,9 @@ msgstr "ダイナミックフォント" msgid "Use Oversampling" msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングを使用" +msgid "Textures" +msgstr "テクスãƒãƒ£" + msgid "Operation" msgstr "æ“作" @@ -1611,6 +1746,9 @@ msgstr "強度" msgid "Range" msgstr "範囲" +msgid "Specular Factor" +msgstr "é¡é¢åå°„ä¿‚æ•°" + msgid "Json" msgstr "JSON" @@ -1632,9 +1770,6 @@ msgstr "マテリアル" msgid "Root Nodes" msgstr "ルートノード" -msgid "Textures" -msgstr "テクスãƒãƒ£" - msgid "Images" msgstr "ç”»åƒ" @@ -1791,9 +1926,6 @@ msgstr "æ–‡å—列" msgid "Write Mode" msgstr "書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰" -msgid "Limits" -msgstr "制é™" - msgid "WebRTC" msgstr "WebRTC" @@ -1944,9 +2076,6 @@ msgstr "アーã‚テクãƒãƒ£" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "アイコン" - msgid "Codesign" msgstr "コード署å" @@ -1974,9 +2103,6 @@ msgstr "表示å" msgid "Short Name" msgstr "略称" -msgid "Description" -msgstr "説明" - msgid "Publisher" msgstr "パブリッシャー" @@ -2055,6 +2181,9 @@ msgstr "HTTPホスト" msgid "HTTP Port" msgstr "HTTPãƒãƒ¼ãƒˆ" +msgid "Variant" +msgstr "ãƒãƒªã‚¢ãƒ³ãƒˆ" + msgid "VRAM Texture Compression" msgstr "VRAMテクスãƒãƒ£åœ§ç¸®" @@ -2100,18 +2229,12 @@ msgstr "ファイルã®èª¬æ˜Ž" msgid "Trademarks" msgstr "商標" -msgid "Frames" -msgstr "フレーム" - msgid "Frame" msgstr "フレーム" msgid "Speed Scale" msgstr "スピードスケール" -msgid "Playing" -msgstr "実行ä¸" - msgid "Centered" msgstr "ä¸å¤®æƒãˆ" @@ -2154,6 +2277,9 @@ msgstr "ボリュームdB" msgid "Pitch Scale" msgstr "ピッãƒã‚¹ã‚±ãƒ¼ãƒ«" +msgid "Playing" +msgstr "実行ä¸" + msgid "Autoplay" msgstr "自動å†ç”Ÿ" @@ -2310,8 +2436,11 @@ msgstr "ボーダー" msgid "Round Precision" msgstr "丸ã‚精度" -msgid "Transform" -msgstr "トランスフォーム" +msgid "Rotation Degrees" +msgstr "回転角度" + +msgid "Global Rotation Degrees" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«å›žè»¢è§’度" msgid "Ignore Camera Zoom" msgstr "カメラã®ã‚ºãƒ¼ãƒ を無視" @@ -2454,6 +2583,9 @@ msgstr "ボーン" msgid "Target" msgstr "ターゲット" +msgid "Simulation Precision" +msgstr "シミュレーション精度" + msgid "Total Mass" msgstr "ç·è³ªé‡" @@ -2463,6 +2595,9 @@ msgstr "圧力係数" msgid "Damping Coefficient" msgstr "減衰係数" +msgid "Wheel" +msgstr "ホイール" + msgid "Travel" msgstr "トラベル" @@ -2481,6 +2616,9 @@ msgstr "終り" msgid "Sync" msgstr "åŒæœŸ" +msgid "Request" +msgstr "リクエスト" + msgid "Reset" msgstr "リセット" @@ -2505,12 +2643,18 @@ msgstr "ボタングループ" msgid "Localization" msgstr "ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚º" +msgid "Focus" +msgstr "フォーカス" + msgid "Next" msgstr "次" msgid "Previous" msgstr "å‰" +msgid "Default Cursor Shape" +msgstr "デフォルトã®ã‚«ãƒ¼ã‚½ãƒ«å½¢çŠ¶" + msgid "Filters" msgstr "フィルター" @@ -2538,8 +2682,11 @@ msgstr "ステップ" msgid "Page" msgstr "ページ" -msgid "Stretch" -msgstr "ストレッãƒ" +msgid "Progress Bar Delay" +msgstr "プãƒã‚°ãƒ¬ã‚¹ãƒãƒ¼ã®ãƒ‡ã‚£ãƒ¬ã‚¤" + +msgid "Drag to Rearrange Enabled" +msgstr "ドラッグã—ã¦å†é…ç½®å¯èƒ½" msgid "Syntax Highlighter" msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ" @@ -2571,8 +2718,8 @@ msgstr "転é€ãƒãƒ£ãƒ³ãƒãƒ«" msgid "Current Scene" msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³" -msgid "Occlusion Culling" -msgstr "オクルージョンカリング" +msgid "Screen Space AA" +msgstr "スクリーンスペースAA" msgid "Wait Time" msgstr "待機時間" @@ -2592,9 +2739,6 @@ msgstr "入力無効化" msgid "Current Screen" msgstr "ç¾åœ¨ã®ç”»é¢" -msgid "Aspect" -msgstr "アスペクト" - msgid "2D Physics" msgstr "2D物ç†" @@ -2643,6 +2787,9 @@ msgstr "分離" msgid "Cursor" msgstr "カーソル" +msgid "Screen Picker" +msgstr "スクリーンピッカー" + msgid "Node" msgstr "ノード" @@ -2664,6 +2811,9 @@ msgstr "ブルーム" msgid "Fog" msgstr "フォグ" +msgid "Color Correction" +msgstr "色補æ£" + msgid "Features" msgstr "機能" @@ -2697,6 +2847,15 @@ msgstr "アイテム" msgid "Preview" msgstr "プレビュー" +msgid "Transform Format" +msgstr "変æ›å½¢å¼" + +msgid "Transform Array" +msgstr "Transformã®é…列" + +msgid "Parsed Geometry Type" +msgstr "解æžã•ã‚ŒãŸã‚¸ã‚ªãƒ¡ãƒˆãƒªåž‹" + msgid "B" msgstr "B" @@ -2724,12 +2883,12 @@ msgstr "å³ä¸‹" msgid "Bottom Left" msgstr "左下" -msgid "Image" -msgstr "ç”»åƒ" - msgid "Use HDR" msgstr "HDRを使用" +msgid "Frames" +msgstr "フレーム" + msgid "Transpose" msgstr "行列(縦横)入れ替ãˆ" @@ -2739,6 +2898,9 @@ msgstr "コンスタント" msgid "Function" msgstr "関数" +msgid "Degrees Mode" +msgstr "角度モード" + msgid "Pan" msgstr "パン" @@ -2769,6 +2931,9 @@ msgstr "FFTサイズ" msgid "High-pass" msgstr "ãƒã‚¤ãƒ‘ス" +msgid "Time Pullout (ms)" +msgstr "タイムプルアウト(ミリ秒)" + msgid "Surround" msgstr "サラウンド" @@ -2790,24 +2955,15 @@ msgstr "フラグメント" msgid "Unshaded" msgstr "シェーディングãªã—ã§" +msgid "Ensure Correct Normals" +msgstr "æ£ã—ã„法線を確ä¿" + msgid "Vertex Lighting" msgstr "é ‚ç‚¹ãƒ©ã‚¤ãƒ†ã‚£ãƒ³ã‚°" msgid "VRAM Compression" msgstr "VRAM圧縮" -msgid "Import BPTC" -msgstr "BPTCをインãƒãƒ¼ãƒˆ" - -msgid "Import S3TC" -msgstr "S3TCをインãƒãƒ¼ãƒˆ" - -msgid "Import ETC" -msgstr "ETCをインãƒãƒ¼ãƒˆ" - -msgid "Import ETC2" -msgstr "ETC2をインãƒãƒ¼ãƒˆ" - msgid "Lossless Compression" msgstr "ãƒã‚¹ãƒ¬ã‚¹åœ§ç¸®" diff --git a/editor/translations/properties/ko.po b/editor/translations/properties/ko.po index de9268d577..9118036e30 100644 --- a/editor/translations/properties/ko.po +++ b/editor/translations/properties/ko.po @@ -47,16 +47,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-20 10:19+0000\n" -"Last-Translator: 오지훈 <jule1130@naver.com>\n" +"PO-Revision-Date: 2023-02-09 15:26+0000\n" +"Last-Translator: ì´ì •í¬ <daemul72@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" -"godot/ko/>\n" +"godot-properties/ko/>\n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "어플리케ì´ì…˜" @@ -67,9 +67,15 @@ msgstr "구성" msgid "Name" msgstr "ì´ë¦„" +msgid "Description" +msgstr "설명" + msgid "Run" msgstr "실행" +msgid "Main Scene" +msgstr "ë©”ì¸ ì”¬" + msgid "Disable stdout" msgstr "표준 ì¶œë ¥ 비활성화" @@ -97,6 +103,9 @@ msgstr "ì°½" msgid "Size" msgstr "í¬ê¸°" +msgid "Mode" +msgstr "모드" + msgid "Resizable" msgstr "í¬ê¸° ì¡°ì ˆ 가능한" @@ -109,6 +118,9 @@ msgstr "ì—너지 ì ˆì•½" msgid "Keep Screen On" msgstr "화면 í•ìƒ 활성화" +msgid "Audio" +msgstr "오디오" + msgid "Editor" msgstr "ì—디터" @@ -130,6 +142,9 @@ msgstr "디버그" msgid "Settings" msgstr "ì„¤ì •" +msgid "Compression" +msgstr "압축" + msgid "Crash Handler" msgstr "ì¶©ëŒ ì²˜ë¦¬ê¸°" @@ -139,6 +154,12 @@ msgstr "메시지" msgid "Rendering" msgstr "ë Œë”ë§" +msgid "Limits" +msgstr "ì œí•œ" + +msgid "GUI" +msgstr "GUI" + msgid "Low Processor Usage Mode" msgstr "ì €ì‚¬ì–‘ 모드" @@ -238,6 +259,12 @@ msgstr "컨트롤러 ê°’" msgid "Big Endian" msgstr "ë¹… 엔디안" +msgid "Network" +msgstr "네트워í¬" + +msgid "Page Size" +msgstr "페ì´ì§€ í¬ê¸°" + msgid "Blocking Mode Enabled" msgstr "Blocking 모드 활성화" @@ -274,9 +301,6 @@ msgstr "경로" msgid "Data Array" msgstr "ë°ì´í„° ë°°ì—´" -msgid "Blocking Handshake" -msgstr "Handshake 차단" - msgid "Max Pending Connections" msgstr "최대 대기 ì¤‘ì¸ ì—°ê²° 수" @@ -343,15 +367,6 @@ msgstr "ì• ë‹ˆë©”ì´ì…˜" msgid "Easing" msgstr "ì†ë„ 완화" -msgid "Interface" -msgstr "ì¸í„°íŽ˜ì´ìŠ¤" - -msgid "Editors" -msgstr "ì—디터" - -msgid "Network" -msgstr "네트워í¬" - msgid "Remote Port" msgstr "ì›ê²© í¬íŠ¸" @@ -421,8 +436,8 @@ msgstr "확ì¸ë¨" msgid "Keying" msgstr "키 ê°’ ìƒì„±" -msgid "Main Scene" -msgstr "ë©”ì¸ ì”¬" +msgid "Interface" +msgstr "ì¸í„°íŽ˜ì´ìŠ¤" msgid "Show Update Spinner" msgstr "ì—…ë°ì´íŠ¸ 스피너 표시" @@ -724,6 +739,9 @@ msgstr "소스 í°íŠ¸ í¬ê¸° ë„우미" msgid "Help Title Font Size" msgstr "ì œëª© í°íŠ¸ í¬ê¸° ë„우미" +msgid "Editors" +msgstr "ì—디터" + msgid "Grid Map" msgstr "그리드맵" @@ -1126,6 +1144,9 @@ msgstr "비밀번호" msgid "Compress" msgstr "ì»´í”„ë ˆìŠ¤" +msgid "Transform" +msgstr "변형" + msgid "Collada" msgstr "COLLADA" @@ -1150,15 +1171,9 @@ msgstr "다ìŒì—ì„œ 만들기" msgid "Delimiter" msgstr "디리미터" -msgid "Mode" -msgstr "모드" - msgid "Lossy Quality" msgstr "ì†ì‹¤ 품질" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "밉맵" @@ -1201,6 +1216,9 @@ msgstr "오í´ë£¨ë”" msgid "Enabled" msgstr "활성화ë¨" +msgid "Normal Merge Angle" +msgstr "ì •ìƒì ì¸ ë³‘í•© ê°ë„" + msgid "Loop Mode" msgstr "루프 모드" @@ -1213,12 +1231,6 @@ msgstr "최ì í™” ë„구" msgid "Max Angular Error" msgstr "최대 ê°ë„ 오류" -msgid "Compression" -msgstr "압축" - -msgid "Page Size" -msgstr "페ì´ì§€ í¬ê¸°" - msgid "Nodes" msgstr "노드" @@ -1441,9 +1453,6 @@ msgstr "ìŠ¤ë ˆë“œ" msgid "Thread Model" msgstr "ìŠ¤ë ˆë“œ 모ë¸" -msgid "Audio" -msgstr "오디오" - msgid "Handheld" msgstr "휴대용" @@ -1474,15 +1483,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "홈 표시기 숨기기" +msgid "Input Devices" +msgstr "ìž…ë ¥ 장치" + +msgid "Pointing" +msgstr "í¬ì¸íŒ…" + msgid "Boot Splash" msgstr "부트 스플래쉬" msgid "BG Color" msgstr "배경색" -msgid "Input Devices" -msgstr "ìž…ë ¥ 장치" - msgid "Environment" msgstr "환경" @@ -1492,21 +1504,24 @@ msgstr "기본 í´ë¦¬ì–´ 컬러" msgid "Show Image" msgstr "ì´ë¯¸ì§€ 표시" +msgid "Image" +msgstr "ì˜ìƒ" + msgid "Fullsize" msgstr "ì „ì²´ í¬ê¸°" msgid "Use Filter" msgstr "í•„í„° 사용" +msgid "Icon" +msgstr "ì•„ì´ì½˜" + msgid "Buffering" msgstr "버í¼ë§" msgid "Agile Event Flushing" msgstr "ì• ìžì¼ ì´ë²¤íŠ¸ 플러싱" -msgid "Pointing" -msgstr "í¬ì¸íŒ…" - msgid "Emulate Touch From Mouse" msgstr "마우스 터치 ì—ë®¬ë ˆì´íŠ¸" @@ -1534,12 +1549,15 @@ msgstr "솔루션 ë””ë ‰í† ë¦¬" msgid "Main Loop Type" msgstr "ë©”ì¸ ë£¨í”„ ìœ í˜•" +msgid "Stretch" +msgstr "ìŠ¤íŠ¸ë ˆì¹˜" + +msgid "Aspect" +msgstr "ì–‘ìƒ" + msgid "Auto Accept Quit" msgstr "ìžë™ ìˆ˜ë½ ì¢…ë£Œ" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "글꼴" @@ -1549,6 +1567,9 @@ msgstr "ë™ì 글꼴" msgid "Use Oversampling" msgstr "ì˜¤ë²„ìƒ˜í”Œë§ ì‚¬ìš©" +msgid "Textures" +msgstr "í…스처" + msgid "Operation" msgstr "오í¼ë ˆì´ì…˜" @@ -1726,9 +1747,6 @@ msgstr "씬 ì´ë¦„" msgid "Root Nodes" msgstr "루트 노드" -msgid "Textures" -msgstr "í…스처" - msgid "Images" msgstr "ì´ë¯¸ì§€" @@ -1957,6 +1975,9 @@ msgstr "세심함" msgid "Return Type" msgstr "반환 ìœ í˜•" +msgid "Fractal Octaves" +msgstr "프랙털 옥타브" + msgid "Width" msgstr "너비" @@ -2008,9 +2029,6 @@ msgstr "IGD ìš°ë¦¬ì˜ ì£¼ì†Œ" msgid "IGD Status" msgstr "IGD ìƒíƒœ" -msgid "Limits" -msgstr "ì œí•œ" - msgid "WebRTC" msgstr "WebRTC" @@ -2056,15 +2074,9 @@ msgstr "Wi-Fi ì—°ê²°" msgid "Push Notifications" msgstr "푸시 알림" -msgid "Icon" -msgstr "ì•„ì´ì½˜" - msgid "Location" msgstr "위치" -msgid "Description" -msgstr "설명" - msgid "Algorithm" msgstr "ì•Œê³ ë¦¬ì¦˜" @@ -2128,6 +2140,12 @@ msgstr "색ìƒ" msgid "Angular Velocity" msgstr "ê°ì†ë„" +msgid "Accel Min" +msgstr "최소 ê°€ì†ë„" + +msgid "Accel Max" +msgstr "최대 ê°€ì†ë„" + msgid "Path Max Distance" msgstr "경로 최대 거리" @@ -2137,9 +2155,6 @@ msgstr "내비게ì´ì…˜ ë ˆì´ì–´" msgid "Max Speed" msgstr "최대 ì†ë„" -msgid "Transform" -msgstr "변형" - msgid "Rotation Degrees" msgstr "íšŒì „ ê°ë„" @@ -2266,6 +2281,9 @@ msgstr "버튼 그룹" msgid "Localization" msgstr "현지화" +msgid "Auto Translate" +msgstr "ìžë™ 옮기기" + msgid "Next" msgstr "다ìŒ" @@ -2290,9 +2308,6 @@ msgstr "ì•„ì´ì½˜ 모드" msgid "Step" msgstr "단계" -msgid "Stretch" -msgstr "ìŠ¤íŠ¸ë ˆì¹˜" - msgid "Syntax Highlighter" msgstr "구문 ê°•ì¡°" @@ -2323,8 +2338,11 @@ msgstr "현재 화면" msgid "Max Size" msgstr "최대 í¬ê¸°" -msgid "Aspect" -msgstr "ì–‘ìƒ" +msgid "2D Physics" +msgstr "2D 물리" + +msgid "3D Physics" +msgstr "3D 물리" msgid "Format" msgstr "형ì‹" @@ -2413,9 +2431,6 @@ msgstr "오른쪽 아래" msgid "Bottom Left" msgstr "왼쪽 아래" -msgid "Image" -msgstr "ì˜ìƒ" - msgid "Transpose" msgstr "í–‰ë ¬ 맞바꾸기" diff --git a/editor/translations/properties/pt.po b/editor/translations/properties/pt.po index caad6ec3fe..f072375d33 100644 --- a/editor/translations/properties/pt.po +++ b/editor/translations/properties/pt.po @@ -57,9 +57,15 @@ msgstr "Configurações" msgid "Name" msgstr "Nome" +msgid "Description" +msgstr "Descrição" + msgid "Run" msgstr "Executar" +msgid "Main Scene" +msgstr "Cena Principal" + msgid "Disable stdout" msgstr "Desativar stdout" @@ -87,6 +93,9 @@ msgstr "Janela" msgid "Size" msgstr "Tamanho" +msgid "Mode" +msgstr "Modo" + msgid "Resizable" msgstr "Redimensionável" @@ -102,6 +111,9 @@ msgstr "Economia de Energia" msgid "Keep Screen On" msgstr "Manter Tela Ligada" +msgid "Audio" +msgstr "Ãudio" + msgid "Editor" msgstr "Editor" @@ -123,6 +135,9 @@ msgstr "Depurar" msgid "Settings" msgstr "Configurações" +msgid "Compression" +msgstr "Compressão" + msgid "Crash Handler" msgstr "Gerenciador de Falhas" @@ -132,6 +147,12 @@ msgstr "Mensagem" msgid "Rendering" msgstr "Renderizar" +msgid "Limits" +msgstr "Limites" + +msgid "GUI" +msgstr "Interface Gráfica" + msgid "Low Processor Usage Mode" msgstr "Modo de Baixa Utilização do Processador" @@ -231,6 +252,12 @@ msgstr "Valor do Controlador" msgid "Big Endian" msgstr "Grande Endian" +msgid "Network" +msgstr "Rede" + +msgid "Page Size" +msgstr "Tamanho da Página" + msgid "Blocking Mode Enabled" msgstr "Modo de Bloqueio Ativado" @@ -267,9 +294,6 @@ msgstr "Caminho" msgid "Data Array" msgstr "Lista de dados" -msgid "Blocking Handshake" -msgstr "Bloquear Handshake" - msgid "Max Pending Connections" msgstr "Max Conexões Pendentes" @@ -342,15 +366,6 @@ msgstr "Animação" msgid "Easing" msgstr "Flexibilização" -msgid "Interface" -msgstr "Interface" - -msgid "Editors" -msgstr "Editores" - -msgid "Network" -msgstr "Rede" - msgid "Remote Port" msgstr "Porta Remota" @@ -420,8 +435,8 @@ msgstr "Item Marcado" msgid "Keying" msgstr "Executar" -msgid "Main Scene" -msgstr "Cena Principal" +msgid "Interface" +msgstr "Interface" msgid "Show Update Spinner" msgstr "Mostra Ãcone de Atualização" @@ -726,6 +741,9 @@ msgstr "Tamanho da Fonte de Código de Ajuda" msgid "Help Title Font Size" msgstr "Tamanho da Fonte do TÃtulo da Ajuda" +msgid "Editors" +msgstr "Editores" + msgid "Grid Map" msgstr "Mapa de grelha" @@ -1137,6 +1155,9 @@ msgstr "Tamanho do Contorno" msgid "Variation" msgstr "Variação" +msgid "Transform" +msgstr "Transformar" + msgid "Collada" msgstr "Collada" @@ -1164,15 +1185,9 @@ msgstr "Delimitador" msgid "Preload" msgstr "Pré-carregar" -msgid "Mode" -msgstr "Modo" - msgid "Lossy Quality" msgstr "Qualidade com Perdas" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmaps" @@ -1236,12 +1251,6 @@ msgstr "Otimizador" msgid "Max Angular Error" msgstr "Máximo de Erros Angulares" -msgid "Compression" -msgstr "Compressão" - -msgid "Page Size" -msgstr "Tamanho da Página" - msgid "Nodes" msgstr "Nós" @@ -1467,9 +1476,6 @@ msgstr "Threads" msgid "Thread Model" msgstr "Modelo de Thread" -msgid "Audio" -msgstr "Ãudio" - msgid "Handheld" msgstr "Portátil" @@ -1500,15 +1506,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Esconder Indicador de Home" +msgid "Input Devices" +msgstr "Dispositivos de Entrada" + +msgid "Pointing" +msgstr "Pontuação" + msgid "Boot Splash" msgstr "Plano de Fundo de Inicialização" msgid "BG Color" msgstr "Cor de Fundo" -msgid "Input Devices" -msgstr "Dispositivos de Entrada" - msgid "Environment" msgstr "Ambiente" @@ -1518,21 +1527,24 @@ msgstr "Cor Clara Padrão" msgid "Show Image" msgstr "Mostrar Imagem" +msgid "Image" +msgstr "Imagem" + msgid "Fullsize" msgstr "Tamanho Máximo" msgid "Use Filter" msgstr "Usar Filtro" +msgid "Icon" +msgstr "Ãcone" + msgid "Buffering" msgstr "Buffering" msgid "Agile Event Flushing" msgstr "Liberação Ãgil de Eventos" -msgid "Pointing" -msgstr "Pontuação" - msgid "Emulate Touch From Mouse" msgstr "Emular Toque do Rato" @@ -1560,12 +1572,15 @@ msgstr "Diretório da Solução" msgid "Main Loop Type" msgstr "Tipo de Loop Principal" +msgid "Stretch" +msgstr "Esticar" + +msgid "Aspect" +msgstr "Aspecto" + msgid "Auto Accept Quit" msgstr "Auto Aceitar Sair" -msgid "GUI" -msgstr "Interface Gráfica" - msgid "Fonts" msgstr "Fontes" @@ -1575,6 +1590,9 @@ msgstr "Fontes Dinâmicas" msgid "Use Oversampling" msgstr "Usar Sobreamostragem" +msgid "Textures" +msgstr "Texturas" + msgid "Operation" msgstr "Operação" @@ -1752,9 +1770,6 @@ msgstr "Nome da Cena" msgid "Root Nodes" msgstr "Nós RaÃzes" -msgid "Textures" -msgstr "Texturas" - msgid "Images" msgstr "Imagens" @@ -2043,9 +2058,6 @@ msgstr "Estado do IGD" msgid "Write Mode" msgstr "Modo de Escrita" -msgid "Limits" -msgstr "Limites" - msgid "WebRTC" msgstr "WebRTC" @@ -2100,12 +2112,6 @@ msgstr "Primeiro Plano Adaptável 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Plano de Fundo Adaptável 432 X 432" -msgid "Custom Build" -msgstr "Build Personalizada" - -msgid "Use Custom Build" -msgstr "Usar Compilação Personalizada" - msgid "Export Format" msgstr "Exportar Formato" @@ -2370,9 +2376,6 @@ msgstr "Arquitetura" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Ãcone" - msgid "Copyright" msgstr "Direitos Autorais" @@ -2475,9 +2478,6 @@ msgstr "Nome de Exibição" msgid "Short Name" msgstr "Nome Curto" -msgid "Description" -msgstr "Descrição" - msgid "Publisher" msgstr "Publicadora" @@ -2610,18 +2610,12 @@ msgstr "Descrição do Ficheiro" msgid "Trademarks" msgstr "Marca Registada (Trademarks)" -msgid "Frames" -msgstr "Quadros" - msgid "Frame" msgstr "Quadro" msgid "Speed Scale" msgstr "Escalonamento da Velocidade" -msgid "Playing" -msgstr "A executar" - msgid "Centered" msgstr "Centralizado" @@ -2652,6 +2646,9 @@ msgstr "Volume dB (decibéis)" msgid "Pitch Scale" msgstr "Escalonamento de Pitch" +msgid "Playing" +msgstr "A executar" + msgid "Autoplay" msgstr "Reproduzir automaticamente" @@ -2859,9 +2856,6 @@ msgstr "Velocidade Máxima" msgid "Estimate Radius" msgstr "Raio Estimado" -msgid "Transform" -msgstr "Transformar" - msgid "Rotation Degrees" msgstr "Graus de Rotação" @@ -3318,12 +3312,12 @@ msgstr "Atraso Aleatório" msgid "Xfade Time" msgstr "Tempo do Esmaecer Cruzado" -msgid "Reset" -msgstr "Repor" - msgid "Active" msgstr "Ativo" +msgid "Reset" +msgstr "Repor" + msgid "Switch" msgstr "Alternar" @@ -3423,9 +3417,6 @@ msgstr "Tamanho da Tabulação" msgid "Split Offset" msgstr "Deslocamento de Divisão" -msgid "Stretch" -msgstr "Esticar" - msgid "Current Tab" msgstr "Guia Atual" @@ -3528,9 +3519,6 @@ msgstr "Tamanho MÃnimo" msgid "Max Size" msgstr "Tamanho Máximo" -msgid "Aspect" -msgstr "Aspecto" - msgid "Format" msgstr "Formato" @@ -3780,9 +3768,6 @@ msgstr "Fundo Direita" msgid "Bottom Left" msgstr "Fundo Esquerda" -msgid "Image" -msgstr "Imagem" - msgid "Atlas" msgstr "Atlas" @@ -3795,6 +3780,9 @@ msgstr "Usar HDR" msgid "From" msgstr "À Partir de" +msgid "Frames" +msgstr "Quadros" + msgid "Transpose" msgstr "Transpor" @@ -3807,9 +3795,6 @@ msgstr "Função" msgid "Canvas" msgstr "Tela" -msgid "Default Gravity" -msgstr "Gravidade Padrão" - msgid "Plane" msgstr "Plano" @@ -3867,6 +3852,9 @@ msgstr "Excluir" msgid "Collide With Areas" msgstr "Colidir com Ãreas" +msgid "Default Gravity" +msgstr "Gravidade Padrão" + msgid "Vertex" msgstr "Vértice" diff --git a/editor/translations/properties/pt_BR.po b/editor/translations/properties/pt_BR.po index bc6daf1f10..d971a31648 100644 --- a/editor/translations/properties/pt_BR.po +++ b/editor/translations/properties/pt_BR.po @@ -162,16 +162,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2023-01-14 00:01+0000\n" -"Last-Translator: Levi Ferreira <leviferreiramorais@gmail.com>\n" +"PO-Revision-Date: 2023-02-08 18:01+0000\n" +"Last-Translator: Leonardo <leotada523@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" -"godot-engine/godot/pt_BR/>\n" +"godot-engine/godot-properties/pt_BR/>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Aplicação" @@ -182,9 +182,15 @@ msgstr "Configuração" msgid "Name" msgstr "Nome" +msgid "Description" +msgstr "Descrição" + msgid "Run" msgstr "Rodar" +msgid "Main Scene" +msgstr "Cena Principal" + msgid "Disable stdout" msgstr "Desativar stdout" @@ -212,6 +218,9 @@ msgstr "Janela" msgid "Size" msgstr "Tamanho" +msgid "Mode" +msgstr "Modo" + msgid "Resizable" msgstr "Redimensionável" @@ -227,6 +236,9 @@ msgstr "Economia de Energia" msgid "Keep Screen On" msgstr "Manter a Tela Ligada" +msgid "Audio" +msgstr "Ãudio" + msgid "Editor" msgstr "Editor" @@ -248,6 +260,9 @@ msgstr "Depuração" msgid "Settings" msgstr "Configurações" +msgid "Compression" +msgstr "Compressão" + msgid "Crash Handler" msgstr "Gerenciador de Falhas" @@ -257,6 +272,12 @@ msgstr "Mensagem" msgid "Rendering" msgstr "Renderização" +msgid "Limits" +msgstr "Limites" + +msgid "GUI" +msgstr "GUI (Interface Gráfica de Usuário)" + msgid "Low Processor Usage Mode" msgstr "Modo de Baixo Uso de Processador" @@ -305,6 +326,9 @@ msgstr "Fator" msgid "Button Index" msgstr "Ãndice do Botão" +msgid "Double Click" +msgstr "Clique Duplo" + msgid "Tilt" msgstr "Inclinar" @@ -356,6 +380,12 @@ msgstr "Valor do Controlador" msgid "Big Endian" msgstr "Big Endian" +msgid "Network" +msgstr "Rede" + +msgid "Page Size" +msgstr "Tamanho da Página" + msgid "Blocking Mode Enabled" msgstr "Modo de bloqueio Ativado" @@ -392,9 +422,6 @@ msgstr "Caminho" msgid "Data Array" msgstr "Matriz de Dados" -msgid "Blocking Handshake" -msgstr "Handshake bloqueante" - msgid "Max Pending Connections" msgstr "Conexões Pendentes Máximas" @@ -467,15 +494,6 @@ msgstr "Animação" msgid "Easing" msgstr "Suavização" -msgid "Interface" -msgstr "Interface" - -msgid "Editors" -msgstr "Editores" - -msgid "Network" -msgstr "Rede" - msgid "Remote Port" msgstr "Porta Remota" @@ -545,8 +563,8 @@ msgstr "Checado" msgid "Keying" msgstr "Chaveamento" -msgid "Main Scene" -msgstr "Cena Principal" +msgid "Interface" +msgstr "Interface" msgid "Show Update Spinner" msgstr "Mostrar Spinner de Atualização" @@ -851,6 +869,9 @@ msgstr "Tamanho da Fonte de Ajuda Principal" msgid "Help Title Font Size" msgstr "Tamanho da Fonte de Ajuda para TÃtulos" +msgid "Editors" +msgstr "Editores" + msgid "Grid Map" msgstr "Mapa de Grade" @@ -1262,6 +1283,9 @@ msgstr "Tamanho do Contorno" msgid "Variation" msgstr "Variação" +msgid "Transform" +msgstr "Transformação" + msgid "Collada" msgstr "Collada" @@ -1289,15 +1313,9 @@ msgstr "Delimitador" msgid "Preload" msgstr "Pré Carregar" -msgid "Mode" -msgstr "Modo" - msgid "Lossy Quality" msgstr "Com Perda de Qualidade" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmaps" @@ -1361,12 +1379,6 @@ msgstr "Otimizador" msgid "Max Angular Error" msgstr "Erro Angular Máximo" -msgid "Compression" -msgstr "Compressão" - -msgid "Page Size" -msgstr "Tamanho da Página" - msgid "Nodes" msgstr "Nós" @@ -1592,9 +1604,6 @@ msgstr "Threads" msgid "Thread Model" msgstr "Modelo de Thread" -msgid "Audio" -msgstr "Ãudio" - msgid "Handheld" msgstr "Portátil (Handheld)" @@ -1625,15 +1634,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Esconder Indicador de Home" +msgid "Input Devices" +msgstr "Dispositivos de Entrada" + +msgid "Pointing" +msgstr "Apontando" + msgid "Boot Splash" msgstr "Imagem de Exibição ao Iniciar" msgid "BG Color" msgstr "Cor do Plano de Fundo" -msgid "Input Devices" -msgstr "Dispositivos de Entrada" - msgid "Environment" msgstr "Ambiente" @@ -1643,21 +1655,24 @@ msgstr "Cor Limpa Padrão" msgid "Show Image" msgstr "Mostrar Imagem" +msgid "Image" +msgstr "Imagem" + msgid "Fullsize" msgstr "Tamanho Inteiro" msgid "Use Filter" msgstr "Usar Filtro" +msgid "Icon" +msgstr "Ãcone" + msgid "Buffering" msgstr "Buffering" msgid "Agile Event Flushing" msgstr "Limpeza de Eventos Agil" -msgid "Pointing" -msgstr "Apontando" - msgid "Emulate Touch From Mouse" msgstr "Simular Toque à Partir do Mouse" @@ -1685,12 +1700,15 @@ msgstr "Diretório da Solução" msgid "Main Loop Type" msgstr "Tipo de Loop Principal" +msgid "Stretch" +msgstr "Esticar" + +msgid "Aspect" +msgstr "Aspecto" + msgid "Auto Accept Quit" msgstr "Aceitar Sair Automaticamente" -msgid "GUI" -msgstr "GUI (Interface Gráfica de Usuário)" - msgid "Fonts" msgstr "Fontes" @@ -1700,6 +1718,9 @@ msgstr "Fontes Dinâmicas" msgid "Use Oversampling" msgstr "Utilizar Oversampling" +msgid "Textures" +msgstr "Texturas" + msgid "Operation" msgstr "Operação" @@ -1877,9 +1898,6 @@ msgstr "Nome da Cena" msgid "Root Nodes" msgstr "Nós RaÃzes" -msgid "Textures" -msgstr "Texturas" - msgid "Images" msgstr "Imagens" @@ -2165,9 +2183,6 @@ msgstr "Estado do IGD" msgid "Write Mode" msgstr "Modo de Escrita" -msgid "Limits" -msgstr "Limites" - msgid "WebRTC" msgstr "WebRTC" @@ -2222,12 +2237,6 @@ msgstr "Primeiro Plano Adaptável 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Fundo Adaptável 432 X 432" -msgid "Custom Build" -msgstr "Build Personalizada" - -msgid "Use Custom Build" -msgstr "Usar Build Personalizada" - msgid "Export Format" msgstr "Exportar Formato" @@ -2423,9 +2432,6 @@ msgstr "Arquitetura" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Ãcone" - msgid "Copyright" msgstr "Direitos Autorais" @@ -2522,9 +2528,6 @@ msgstr "Nome de Exibição" msgid "Short Name" msgstr "Nome Curto" -msgid "Description" -msgstr "Descrição" - msgid "Publisher" msgstr "Publicadora" @@ -2648,18 +2651,12 @@ msgstr "Descrição do Arquivo" msgid "Trademarks" msgstr "Marca Registrada (Trademarks)" -msgid "Frames" -msgstr "Quadros" - msgid "Frame" msgstr "Quadro" msgid "Speed Scale" msgstr "Escalonamento da Velocidade" -msgid "Playing" -msgstr "Rodando" - msgid "Centered" msgstr "Centralizado" @@ -2690,6 +2687,9 @@ msgstr "Volume dB (decibéis)" msgid "Pitch Scale" msgstr "Escalonamento de Pitch" +msgid "Playing" +msgstr "Rodando" + msgid "Autoplay" msgstr "Rodar automaticamente" @@ -2897,9 +2897,6 @@ msgstr "Velocidade Máxima" msgid "Estimate Radius" msgstr "Raio Estimado" -msgid "Transform" -msgstr "Transformação" - msgid "Rotation Degrees" msgstr "Graus de Rotação" @@ -3356,12 +3353,12 @@ msgstr "Atraso Aleatório" msgid "Xfade Time" msgstr "Tempo do Esmaecer Cruzado" -msgid "Reset" -msgstr "Recompor" - msgid "Active" msgstr "Ativo" +msgid "Reset" +msgstr "Recompor" + msgid "Switch" msgstr "Switch" @@ -3461,9 +3458,6 @@ msgstr "Tamanho da Tabulação" msgid "Split Offset" msgstr "Deslocamento de Divisão" -msgid "Stretch" -msgstr "Esticar" - msgid "Current Tab" msgstr "Aba Atual" @@ -3566,9 +3560,6 @@ msgstr "Tamanho MÃnimo" msgid "Max Size" msgstr "Tamanho Máximo" -msgid "Aspect" -msgstr "Aspecto" - msgid "Format" msgstr "Formato" @@ -3818,9 +3809,6 @@ msgstr "Inferior direita" msgid "Bottom Left" msgstr "Inferior Esquerda" -msgid "Image" -msgstr "Imagem" - msgid "Atlas" msgstr "Atlas" @@ -3833,6 +3821,9 @@ msgstr "Usar HDR" msgid "From" msgstr "À Partir de" +msgid "Frames" +msgstr "Quadros" + msgid "Transpose" msgstr "Transpor" @@ -3845,9 +3836,6 @@ msgstr "Função" msgid "Canvas" msgstr "Tela" -msgid "Default Gravity" -msgstr "Gravidade Padrão" - msgid "Plane" msgstr "Plano" @@ -3905,6 +3893,9 @@ msgstr "Excluir" msgid "Collide With Areas" msgstr "Colidir com Ãreas" +msgid "Default Gravity" +msgstr "Gravidade Padrão" + msgid "Vertex" msgstr "Vértice" diff --git a/editor/translations/properties/ru.po b/editor/translations/properties/ru.po index 29e6563d92..f792cd0b43 100644 --- a/editor/translations/properties/ru.po +++ b/editor/translations/properties/ru.po @@ -132,17 +132,17 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-11-25 12:13+0000\n" -"Last-Translator: Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 10:44+0000\n" +"Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" -"godot/ru/>\n" +"godot-properties/ru/>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Приложение" @@ -153,9 +153,15 @@ msgstr "КонфигурациÑ" msgid "Name" msgstr "Ðазвание" +msgid "Description" +msgstr "ОпиÑание" + msgid "Run" msgstr "ЗапуÑтить" +msgid "Main Scene" +msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена" + msgid "Disable stdout" msgstr "Отключить Ñтандартный вывод" @@ -183,6 +189,9 @@ msgstr "Окно" msgid "Size" msgstr "Размер" +msgid "Mode" +msgstr "Режим" + msgid "Resizable" msgstr "ИзменÑемый размер" @@ -198,6 +207,9 @@ msgstr "ÐнергоÑбережение" msgid "Keep Screen On" msgstr "Ðе выключать Ñкран" +msgid "Audio" +msgstr "Ðудио" + msgid "Editor" msgstr "Редактор" @@ -219,6 +231,9 @@ msgstr "Отладка" msgid "Settings" msgstr "ÐаÑтройки" +msgid "Compression" +msgstr "Сжатие" + msgid "Crash Handler" msgstr "Обработчик падений" @@ -228,6 +243,15 @@ msgstr "Сообщение" msgid "Rendering" msgstr "Рендеринг" +msgid "Limits" +msgstr "Лимиты" + +msgid "GUI" +msgstr "GUI" + +msgid "Vulkan" +msgstr "Vulkan" + msgid "Low Processor Usage Mode" msgstr "Режим низкой нагрузки процеÑÑора" @@ -276,6 +300,9 @@ msgstr "Множитель" msgid "Button Index" msgstr "Ð˜Ð½Ð´ÐµÐºÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸" +msgid "Double Click" +msgstr "Двойной щелчок" + msgid "Tilt" msgstr "Ðаклон" @@ -330,6 +357,12 @@ msgstr "Ярлык" msgid "Big Endian" msgstr "ПрÑмой порÑдок байтов" +msgid "Network" +msgstr "Сеть" + +msgid "Page Size" +msgstr "Размер Ñтраницы" + msgid "Blocking Mode Enabled" msgstr "Блокирующий режим включён" @@ -366,9 +399,6 @@ msgstr "Путь" msgid "Data Array" msgstr "МаÑÑив данных" -msgid "Blocking Handshake" -msgstr "Блокировать Handshake" - msgid "Max Pending Connections" msgstr "МакÑимальное количеÑтво ожидающих подключений" @@ -441,15 +471,6 @@ msgstr "ÐнимациÑ" msgid "Easing" msgstr "Облегчение" -msgid "Interface" -msgstr "ИнтерфейÑ" - -msgid "Editors" -msgstr "Редакторы" - -msgid "Network" -msgstr "Сеть" - msgid "Remote Port" msgstr "Удалённый порт" @@ -519,8 +540,8 @@ msgstr "Отмеченный" msgid "Keying" msgstr "Ð’Ñтавка ключей" -msgid "Main Scene" -msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñцена" +msgid "Interface" +msgstr "ИнтерфейÑ" msgid "Show Update Spinner" msgstr "Показывать индикатор обновлениÑ" @@ -825,6 +846,9 @@ msgstr "Размер шрифта иÑходного кода в Ñправке" msgid "Help Title Font Size" msgstr "Размер шрифта заголовков Ñправки" +msgid "Editors" +msgstr "Редакторы" + msgid "Grid Map" msgstr "Ð¡ÐµÑ‚Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°" @@ -1227,9 +1251,15 @@ msgstr "Пароль" msgid "Compress" msgstr "Сжатие" +msgid "Language" +msgstr "Язык" + msgid "Variation" msgstr "ВариациÑ" +msgid "Transform" +msgstr "Преобразование" + msgid "Collada" msgstr "ColladA" @@ -1260,15 +1290,9 @@ msgstr "Предзагрузить" msgid "Columns" msgstr "Колонки" -msgid "Mode" -msgstr "Режим" - msgid "Lossy Quality" msgstr "КачеÑтво Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñми" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Мип-карты" @@ -1332,12 +1356,6 @@ msgstr "Оптимизировать" msgid "Max Angular Error" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ³Ð»Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð³Ñ€ÐµÑˆÐ½Ð¾ÑÑ‚ÑŒ" -msgid "Compression" -msgstr "Сжатие" - -msgid "Page Size" -msgstr "Размер Ñтраницы" - msgid "Nodes" msgstr "Узлы" @@ -1443,6 +1461,9 @@ msgstr "ИÑпользовать потоки" msgid "Available URLs" msgstr "ДоÑтупные URL" +msgid "Unset" +msgstr "СброÑить" + msgid "Error" msgstr "Ошибка" @@ -1560,9 +1581,6 @@ msgstr "Потоки" msgid "Thread Model" msgstr "Модель потоков" -msgid "Audio" -msgstr "Ðудио" - msgid "Handheld" msgstr "Портативный" @@ -1593,15 +1611,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Скрыть индикатор «Домой»" +msgid "Input Devices" +msgstr "УÑтройÑтва ввода" + +msgid "Pointing" +msgstr "Указывающие" + msgid "Boot Splash" msgstr "Ð—Ð°Ð³Ñ€ÑƒÐ·Ð¾Ñ‡Ð½Ð°Ñ Ð·Ð°Ñтавка" msgid "BG Color" msgstr "Цвет фона" -msgid "Input Devices" -msgstr "УÑтройÑтва ввода" - msgid "Environment" msgstr "Окружение" @@ -1611,21 +1632,24 @@ msgstr "ЧиÑтый цвет по умолчанию" msgid "Show Image" msgstr "Показать изображение" +msgid "Image" +msgstr "Изображение" + msgid "Fullsize" msgstr "Полноразмерный" msgid "Use Filter" msgstr "ИÑпользовать фильтр" +msgid "Icon" +msgstr "Иконка" + msgid "Buffering" msgstr "БуферизациÑ" msgid "Agile Event Flushing" msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ° Ñобытий" -msgid "Pointing" -msgstr "Указывающие" - msgid "Emulate Touch From Mouse" msgstr "Ðмулировать ÑенÑорный ввод мышью" @@ -1647,12 +1671,15 @@ msgstr "Проект" msgid "Main Loop Type" msgstr "Тип оÑновного цикла" +msgid "Stretch" +msgstr "РаÑÑ‚Ñжение" + +msgid "Aspect" +msgstr "Соотношение" + msgid "Auto Accept Quit" msgstr "Ðвтоподтверждение выхода" -msgid "GUI" -msgstr "GUI" - msgid "Fonts" msgstr "Шрифты" @@ -1662,6 +1689,9 @@ msgstr "ДинамичеÑкие шрифты" msgid "Use Oversampling" msgstr "ИÑпользовать передиÑкретизацию" +msgid "Textures" +msgstr "ТекÑтуры" + msgid "Operation" msgstr "ОперациÑ" @@ -1830,9 +1860,6 @@ msgstr "Ð˜Ð¼Ñ Ñцены" msgid "Root Nodes" msgstr "Корневые узлы" -msgid "Textures" -msgstr "ТекÑтуры" - msgid "Images" msgstr "ИзображениÑ" @@ -2088,9 +2115,6 @@ msgstr "IGD СтатуÑ" msgid "Write Mode" msgstr "Режим запиÑи" -msgid "Limits" -msgstr "Лимиты" - msgid "WebRTC" msgstr "WebRTC" @@ -2124,12 +2148,6 @@ msgstr "Ðдаптивный Передний Фон 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "Ðдаптивный Задний Фон 432 X 432" -msgid "Custom Build" -msgstr "ÐаÑÑ‚Ñ€Ð°Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¡Ð±Ð¾Ñ€ÐºÐ°" - -msgid "Use Custom Build" -msgstr "ИÑпользовать ÐаÑтраиваемую Сборку" - msgid "Export Format" msgstr "Формат ÐкÑпорта" @@ -2256,9 +2274,6 @@ msgstr "Ðрхитектура" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Иконка" - msgid "Copyright" msgstr "ÐвторÑкие права" @@ -2358,9 +2373,6 @@ msgstr "Ðлгоритм отладчика" msgid "Short Name" msgstr "Короткое имÑ" -msgid "Description" -msgstr "ОпиÑание" - msgid "Publisher" msgstr "Издатель" @@ -2412,6 +2424,9 @@ msgstr "HTTP-хоÑÑ‚" msgid "HTTP Port" msgstr "HTTP-порт" +msgid "Variant" +msgstr "Вариант" + msgid "VRAM Texture Compression" msgstr "VRAM компреÑÑÐ¸Ñ Ñ‚ÐµÐºÑтуры" @@ -2469,18 +2484,12 @@ msgstr "ОпиÑание файла" msgid "Trademarks" msgstr "Торговые марки" -msgid "Frames" -msgstr "Кадры" - msgid "Frame" msgstr "Кадр" msgid "Speed Scale" msgstr "МаÑштаб ÑкороÑти" -msgid "Playing" -msgstr "ПроигрываетÑÑ" - msgid "Centered" msgstr "Центрированный" @@ -2511,6 +2520,9 @@ msgstr "ТекущаÑ" msgid "Volume dB" msgstr "ГромкоÑÑ‚ÑŒ dB" +msgid "Playing" +msgstr "ПроигрываетÑÑ" + msgid "Autoplay" msgstr "ÐвтовоÑпроизведение" @@ -2539,13 +2551,13 @@ msgid "Custom Viewport" msgstr "ПользовательÑкое окно проÑмотра" msgid "Left" -msgstr "Лево" +msgstr "Влево" msgid "Top" msgstr "Верх" msgid "Right" -msgstr "Право" +msgstr "Вправо" msgid "Bottom" msgstr "Внизу" @@ -2748,9 +2760,6 @@ msgstr "Включить уклонение" msgid "Max Speed" msgstr "ÐœÐ°ÐºÑ ÑкороÑÑ‚ÑŒ" -msgid "Transform" -msgstr "Преобразование" - msgid "Global Rotation" msgstr "Глобальный поворот" @@ -2848,7 +2857,7 @@ msgid "Use Global Coordinates" msgstr "ИÑпользовать глобальные координаты" msgid "Update" -msgstr "Обновление" +msgstr "Обновить" msgid "Margin" msgstr "ОтÑтуп" @@ -3252,9 +3261,6 @@ msgstr "Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ°" msgid "Xfade Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Xfade" -msgid "Reset" -msgstr "СброÑить" - msgid "Active" msgstr "Ðктивный" @@ -3264,6 +3270,9 @@ msgstr "Добавить количеÑтво" msgid "Blend Amount" msgstr "КоличеÑтво ÑмешиваниÑ" +msgid "Reset" +msgstr "СброÑить" + msgid "Switch" msgstr "МножеÑтвенный выбор" @@ -3489,9 +3498,6 @@ msgstr "Среда" msgid "Relative Index" msgstr "ОтноÑительный индекÑ" -msgid "Fit Content Height" -msgstr "ВмеÑтить по выÑоте контента" - msgid "Scroll Active" msgstr "ÐÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ°" @@ -3516,9 +3522,6 @@ msgstr "Счетчик галочек" msgid "Collapsed" msgstr "Свернуто" -msgid "Stretch" -msgstr "РаÑÑ‚Ñжение" - msgid "Stretch Shrink" msgstr "РаÑÑ‚Ñнуть Ñжать" @@ -3531,6 +3534,9 @@ msgstr "ВидимоÑÑ‚ÑŒ вкладок" msgid "Syntax Highlighter" msgstr "ПодÑветка ÑинтакÑиÑа" +msgid "Fit Content Height" +msgstr "ВмеÑтить по выÑоте контента" + msgid "Focused" msgstr "СфокуÑировано" @@ -3678,9 +3684,6 @@ msgstr "Минимальный размер" msgid "Max Size" msgstr "МакÑимальный размер" -msgid "Aspect" -msgstr "Соотношение" - msgid "Layer Names" msgstr "Имена ÑлоÑ" @@ -4086,9 +4089,6 @@ msgstr "Справа внизу" msgid "Bottom Left" msgstr "Слева внизу" -msgid "Image" -msgstr "Изображение" - msgid "Load Path" msgstr "Загрузить путь" @@ -4110,6 +4110,9 @@ msgstr "От" msgid "To" msgstr "До" +msgid "Frames" +msgstr "Кадры" + msgid "Current Frame" msgstr "Текущий кадр" @@ -4155,15 +4158,6 @@ msgstr "ХолÑÑ‚" msgid "Navigation Map" msgstr "Карта навигации" -msgid "Default Gravity" -msgstr "Ð“Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию" - -msgid "Default Gravity Vector" -msgstr "Вектор гравитации по умолчанию" - -msgid "Default Cell Size" -msgstr "Размер Ñчейки по умолчанию" - msgid "Plane" msgstr "ПлоÑкоÑÑ‚ÑŒ" @@ -4212,12 +4206,12 @@ msgstr "Порог ÐžÑ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐšÐ°Ð½Ð°Ð»Ð°, дБ" msgid "Video Delay Compensation (ms)" msgstr "КомпенÑÐ°Ñ†Ð¸Ñ Ð—Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ Видео (мÑ)" -msgid "Capture Device" -msgstr "УÑтройÑтво захвата" - msgid "Is Active" msgstr "Ðктивен" +msgid "Default Cell Size" +msgstr "Размер Ñчейки по умолчанию" + msgid "Inverse Mass" msgstr "Ð˜Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¼Ð°ÑÑа" @@ -4236,6 +4230,12 @@ msgstr "Сталкивать Ñ Ñ‚ÐµÐ»Ð°Ð¼Ð¸" msgid "Collide With Areas" msgstr "Сталкивать Ñ Ð¾Ð±Ð»Ð°ÑÑ‚Ñми" +msgid "Default Gravity" +msgstr "Ð“Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð¿Ð¾ умолчанию" + +msgid "Default Gravity Vector" +msgstr "Вектор гравитации по умолчанию" + msgid "Physics Engine" msgstr "ФизичеÑкий движек" @@ -4251,18 +4251,6 @@ msgstr "Включить цикл рендера" msgid "VRAM Compression" msgstr "Сжатие VRAM" -msgid "Import BPTC" -msgstr "Импорт BPTC" - -msgid "Import S3TC" -msgstr "Импорт S3TC" - -msgid "Import ETC" -msgstr "Импортировать ETC" - -msgid "Import ETC2" -msgstr "Импортировать ETC2" - msgid "Lossless Compression" msgstr "Сжатие без потерь" diff --git a/editor/translations/properties/uk.po b/editor/translations/properties/uk.po index 43ebc97bf7..cce1dbb94c 100644 --- a/editor/translations/properties/uk.po +++ b/editor/translations/properties/uk.po @@ -32,17 +32,17 @@ msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-08 09:47+0000\n" -"Last-Translator: KazanskiyMaks <kazanskiy.maks@gmail.com>\n" +"PO-Revision-Date: 2023-02-09 01:12+0000\n" +"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" -"godot/uk/>\n" +"godot-properties/uk/>\n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "Програма" @@ -53,9 +53,15 @@ msgstr "ÐалаштуваннÑ" msgid "Name" msgstr "Ðазва" +msgid "Description" +msgstr "ОпиÑ" + msgid "Run" msgstr "ЗапуÑтити" +msgid "Main Scene" +msgstr "Головна Ñцена" + msgid "Disable stdout" msgstr "Вимкнути stdout" @@ -83,6 +89,9 @@ msgstr "Вікно" msgid "Size" msgstr "Розмір" +msgid "Mode" +msgstr "Режим" + msgid "Resizable" msgstr "Зі зміною розміру" @@ -98,6 +107,9 @@ msgstr "Ð—Ð°Ð¾Ñ‰Ð°Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ½ÐµÑ€Ð³Ñ–Ñ—" msgid "Keep Screen On" msgstr "Ðе вимикати екран" +msgid "Audio" +msgstr "Ðудіо" + msgid "Editor" msgstr "Редактор" @@ -119,6 +131,9 @@ msgstr "ДіагноÑтика" msgid "Settings" msgstr "Параметри" +msgid "Compression" +msgstr "СтиÑненнÑ" + msgid "Crash Handler" msgstr "Обробник аварій" @@ -128,6 +143,15 @@ msgstr "ПовідомленнÑ" msgid "Rendering" msgstr "Обробка" +msgid "Occlusion Culling" +msgstr "ПереглÑнути Ð²Ñ–Ð´Ð±Ñ€Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ" + +msgid "Limits" +msgstr "ОбмеженнÑ" + +msgid "GUI" +msgstr "ІнтерфейÑ" + msgid "Low Processor Usage Mode" msgstr "Режим низького викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑора" @@ -230,6 +254,12 @@ msgstr "СкороченнÑ" msgid "Big Endian" msgstr "Зворотний" +msgid "Network" +msgstr "Мережа" + +msgid "Page Size" +msgstr "Розмір Ñторінки" + msgid "Blocking Mode Enabled" msgstr "Увімкнено режим блокуваннÑ" @@ -266,9 +296,6 @@ msgstr "ШлÑÑ…" msgid "Data Array" msgstr "МаÑив даних" -msgid "Blocking Handshake" -msgstr "Ð£Ð·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ" - msgid "Max Pending Connections" msgstr "МакÑ. к-Ñ‚ÑŒ з'єднань у черзі" @@ -344,15 +371,6 @@ msgstr "ÐнімаціÑ" msgid "Easing" msgstr "Пом'ÑкшеннÑ" -msgid "Interface" -msgstr "ІнтерфейÑ" - -msgid "Editors" -msgstr "Редактори" - -msgid "Network" -msgstr "Мережа" - msgid "Remote Port" msgstr "Віддалений порт" @@ -422,8 +440,8 @@ msgstr "Позначено" msgid "Keying" msgstr "Ðабір" -msgid "Main Scene" -msgstr "Головна Ñцена" +msgid "Interface" +msgstr "ІнтерфейÑ" msgid "Show Update Spinner" msgstr "Показувати індикатор оновленнÑ" @@ -733,6 +751,9 @@ msgstr "Розмір шрифту коду у довідці" msgid "Help Title Font Size" msgstr "Розмір шрифту заголовків у довідці" +msgid "Editors" +msgstr "Редактори" + msgid "Grid Map" msgstr "Карта Ñітки" @@ -1147,6 +1168,9 @@ msgstr "Розмір обведеннÑ" msgid "Variation" msgstr "ДиÑперÑÑ–Ñ" +msgid "Transform" +msgstr "ПеретвореннÑ" + msgid "Collada" msgstr "Collada" @@ -1177,15 +1201,9 @@ msgstr "Попередньо завантажити" msgid "Columns" msgstr "Стовпчики" -msgid "Mode" -msgstr "Режим" - msgid "Lossy Quality" msgstr "Із втратою ÑкоÑÑ‚Ñ–" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Множинне відтвореннÑ" @@ -1252,12 +1270,6 @@ msgstr "Optimizer (Оптимізатор)" msgid "Max Angular Error" msgstr "МакÑ. кутова похибка" -msgid "Compression" -msgstr "СтиÑненнÑ" - -msgid "Page Size" -msgstr "Розмір Ñторінки" - msgid "Nodes" msgstr "Вузли" @@ -1483,9 +1495,6 @@ msgstr "Потоки" msgid "Thread Model" msgstr "Модель потоків" -msgid "Audio" -msgstr "Ðудіо" - msgid "Handheld" msgstr "Кишеньковий приÑтрій" @@ -1516,15 +1525,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "Приховати індикатор домівки" +msgid "Input Devices" +msgstr "ПриÑтрої вводу" + +msgid "Pointing" +msgstr "ФокуÑ" + msgid "Boot Splash" msgstr "Ð’Ñ–Ñ‚Ð°Ð½Ð½Ñ ÑиÑтеми" msgid "BG Color" msgstr "Колір тла" -msgid "Input Devices" -msgstr "ПриÑтрої вводу" - msgid "Environment" msgstr "Середовище" @@ -1534,21 +1546,24 @@ msgstr "Типовий чиÑтий колір" msgid "Show Image" msgstr "Показати зображеннÑ" +msgid "Image" +msgstr "ЗображеннÑ" + msgid "Fullsize" msgstr "Повний розмір" msgid "Use Filter" msgstr "ФільтруваннÑ" +msgid "Icon" +msgstr "Піктограма" + msgid "Buffering" msgstr "БуферизаціÑ" msgid "Agile Event Flushing" msgstr "Зріле Ð²Ð¸Ñ‚Ð¸Ñ€Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð¹" -msgid "Pointing" -msgstr "ФокуÑ" - msgid "Emulate Touch From Mouse" msgstr "Емулювати дотик з миші" @@ -1576,12 +1591,15 @@ msgstr "Каталог проєкту" msgid "Main Loop Type" msgstr "Знайти тип вузла" +msgid "Stretch" +msgstr "РозтÑгнути" + +msgid "Aspect" +msgstr "ÐÑпект" + msgid "Auto Accept Quit" msgstr "Ðвтоматично виходити" -msgid "GUI" -msgstr "ІнтерфейÑ" - msgid "Fonts" msgstr "Шрифти" @@ -1591,6 +1609,9 @@ msgstr "Динамічні шрифти" msgid "Use Oversampling" msgstr "ПередиÑкретизаціÑ" +msgid "Textures" +msgstr "ТекÑтури" + msgid "Operation" msgstr "ДіÑ" @@ -1768,9 +1789,6 @@ msgstr "Базовий шлÑÑ…" msgid "Root Nodes" msgstr "Кореневі вузли" -msgid "Textures" -msgstr "ТекÑтури" - msgid "Images" msgstr "ЗображеннÑ" @@ -2056,9 +2074,6 @@ msgstr "Стан IGD" msgid "Write Mode" msgstr "Режим пріоритетноÑÑ‚Ñ–" -msgid "Limits" -msgstr "ОбмеженнÑ" - msgid "WebRTC" msgstr "WebRTC" @@ -2086,9 +2101,6 @@ msgstr "ШлÑÑ… Android SDK" msgid "Debug Keystore" msgstr "Зневаджувач" -msgid "Use Custom Build" -msgstr "Ðетипова збірка" - msgid "Export Format" msgstr "Формат екÑпортуваннÑ" @@ -2287,9 +2299,6 @@ msgstr "Ðрхітектура" msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "Піктограма" - msgid "Copyright" msgstr "ÐвторÑькі права" @@ -2413,9 +2422,6 @@ msgstr "Показана назва" msgid "Short Name" msgstr "Коротка назва" -msgid "Description" -msgstr "ОпиÑ" - msgid "Publisher" msgstr "Видавець" @@ -2551,18 +2557,12 @@ msgstr "ÐžÐ¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" msgid "Trademarks" msgstr "Торгівельні марки" -msgid "Frames" -msgstr "Кадри" - msgid "Frame" msgstr "Кадр" msgid "Speed Scale" msgstr "МаÑштаб" -msgid "Playing" -msgstr "ВідтвореннÑ" - msgid "Centered" msgstr "За центром" @@ -2608,6 +2608,9 @@ msgstr "ГучніÑÑ‚ÑŒ (дБ)" msgid "Pitch Scale" msgstr "МаÑштаб" +msgid "Playing" +msgstr "ВідтвореннÑ" + msgid "Autoplay" msgstr "Перемкнути автовідтвореннÑ" @@ -2938,9 +2941,6 @@ msgstr "МакÑ. швидкіÑÑ‚ÑŒ" msgid "Estimate Radius" msgstr "Оцінка радіуÑа" -msgid "Transform" -msgstr "ПеретвореннÑ" - msgid "Rotation Degrees" msgstr "ГрудуÑи обертаннÑ" @@ -3193,9 +3193,6 @@ msgstr "Вимкнути Z" msgid "Flatness" msgstr "ПлаÑкіÑÑ‚ÑŒ" -msgid "Extents" -msgstr "Розміри" - msgid "Albedo" msgstr "Ðльбедо" @@ -3350,7 +3347,7 @@ msgid "Opacity" msgstr "ÐепрозоріÑÑ‚ÑŒ" msgid "Blur" -msgstr "РозмиваннÑ" +msgstr "РозмиттÑ" msgid "Directional Shadow" msgstr "СпрÑмована тінь" @@ -3592,12 +3589,12 @@ msgstr "Випадкова затримка" msgid "Xfade Time" msgstr "Ð§Ð°Ñ X-Fade" -msgid "Reset" -msgstr "Скинути" - msgid "Active" msgstr "Ðктивний" +msgid "Reset" +msgstr "Скинути" + msgid "Switch" msgstr "ПеремкнутиÑÑ" @@ -3910,9 +3907,6 @@ msgstr "Сер." msgid "Relative Index" msgstr "ВідноÑний індекÑ" -msgid "Fit Content Height" -msgstr "ВиÑота Ð¿Ñ–Ð´Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð·Ð° вміÑтом" - msgid "Scroll Active" msgstr "Ðктивне гортаннÑ" @@ -3949,9 +3943,6 @@ msgstr "Згорнуто" msgid "Dragger Visibility" msgstr "Перемкнути видиміÑÑ‚ÑŒ" -msgid "Stretch" -msgstr "РозтÑгнути" - msgid "Stretch Shrink" msgstr "СтÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ñ‚ÑгуваннÑ" @@ -3970,6 +3961,9 @@ msgstr "Вкладки видимі" msgid "Syntax Highlighter" msgstr "ЗаÑіб підÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу" +msgid "Fit Content Height" +msgstr "ВиÑота Ð¿Ñ–Ð´Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð·Ð° вміÑтом" + msgid "Draw" msgstr "КреÑленнÑ" @@ -4126,9 +4120,6 @@ msgstr "Створити контур" msgid "Anti Aliasing" msgstr "ЗгладжуваннÑ" -msgid "Occlusion Culling" -msgstr "ПереглÑнути Ð²Ñ–Ð´Ð±Ñ€Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ" - msgid "Atlas Size" msgstr "Розмір атлаÑу" @@ -4195,9 +4186,6 @@ msgstr "Мін. розмір" msgid "Max Size" msgstr "МакÑ. розмір" -msgid "Aspect" -msgstr "ÐÑпект" - msgid "Layer Names" msgstr "Ðазви шарів" @@ -4876,9 +4864,6 @@ msgstr "Внизу праворуч" msgid "Bottom Left" msgstr "Внизу ліворуч" -msgid "Image" -msgstr "ЗображеннÑ" - msgid "Load Path" msgstr "Завантажити шаблон" @@ -4897,6 +4882,9 @@ msgstr "Розмір зображеннÑ" msgid "Use HDR" msgstr "HDR" +msgid "Frames" +msgstr "Кадри" + msgid "Current Frame" msgstr "Поточний кадр" @@ -4939,12 +4927,6 @@ msgstr "Завантажити типовий" msgid "Canvas" msgstr "Полотно" -msgid "Default Gravity" -msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду" - -msgid "Default Gravity Vector" -msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду" - msgid "Fallback Environment" msgstr "ПереглÑд Ñередовища" @@ -5029,9 +5011,6 @@ msgstr "Результат" msgid "Bus Count" msgstr "КількіÑÑ‚ÑŒ шин" -msgid "Capture Device" -msgstr "ПриÑтрій захопленнÑ" - msgid "Feed" msgstr "Подача" @@ -5056,6 +5035,12 @@ msgstr "Режим перешкоди" msgid "Shape RID" msgstr "RID форми" +msgid "Default Gravity" +msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду" + +msgid "Default Gravity Vector" +msgstr "Типове Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду" + msgid "Principal Inertia Axes" msgstr "Головні віÑÑ– інерції" @@ -5077,18 +5062,6 @@ msgstr "Увімкнено цикл обробки" msgid "VRAM Compression" msgstr "Вираз" -msgid "Import BPTC" -msgstr "Імпорт" - -msgid "Import S3TC" -msgstr "Імпорт" - -msgid "Import ETC" -msgstr "Імпорт" - -msgid "Import ETC2" -msgstr "Імпорт" - msgid "Lossless Compression" msgstr "СтиÑÐºÐ°Ð½Ð½Ñ Ð±ÐµÐ· втрат" diff --git a/editor/translations/properties/zh_CN.po b/editor/translations/properties/zh_CN.po index 941f112094..d623c3ba30 100644 --- a/editor/translations/properties/zh_CN.po +++ b/editor/translations/properties/zh_CN.po @@ -92,16 +92,16 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-12-28 00:54+0000\n" -"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" +"PO-Revision-Date: 2023-02-10 10:44+0000\n" +"Last-Translator: 风é’å±± <idleman@yeah.net>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" -"godot-engine/godot/zh_Hans/>\n" +"godot-engine/godot-properties/zh_Hans/>\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "应用" @@ -112,9 +112,15 @@ msgstr "é…ç½®" msgid "Name" msgstr "å称" +msgid "Description" +msgstr "æè¿°" + msgid "Run" msgstr "è¿è¡Œ" +msgid "Main Scene" +msgstr "主场景" + msgid "Disable stdout" msgstr "ç¦ç”¨æ ‡å‡†è¾“出" @@ -142,33 +148,63 @@ msgstr "窗å£" msgid "Size" msgstr "大å°" +msgid "Mode" +msgstr "模å¼" + +msgid "Initial Position" +msgstr "åˆå§‹ä½ç½®" + msgid "Resizable" msgstr "å¯è°ƒæ•´å¤§å°" msgid "Borderless" msgstr "æ— è¾¹æ¡†" +msgid "Always on Top" +msgstr "置顶" + msgid "Transparent" msgstr "é€æ˜Ž" +msgid "Extend to Title" +msgstr "å»¶ä¼¸è‡³æ ‡é¢˜" + +msgid "No Focus" +msgstr "å…³é—èšç„¦" + msgid "Energy Saving" msgstr "节能" msgid "Keep Screen On" msgstr "å±å¹•å¸¸äº®" +msgid "Audio" +msgstr "音频" + +msgid "Buses" +msgstr "总线" + msgid "Editor" msgstr "编辑器" msgid "Main Run Args" msgstr "主è¿è¡Œå‚æ•°" +msgid "Default Signal Callback Name" +msgstr "默认信å·å›žè°ƒå称" + +msgid "Default Signal Callback to Self Name" +msgstr "默认信å·å›žè°ƒä¸ºè‡ªèº«å称" + msgid "Physics" msgstr "物ç†" msgid "2D" msgstr "2D" +msgid "Run on Separate Thread" +msgstr "在独立的线程上è¿è¡Œ" + msgid "3D" msgstr "3D" @@ -178,6 +214,9 @@ msgstr "调试" msgid "Settings" msgstr "设置" +msgid "Compression" +msgstr "压缩" + msgid "Crash Handler" msgstr "崩溃处ç†å™¨" @@ -187,6 +226,42 @@ msgstr "消æ¯" msgid "Rendering" msgstr "渲染" +msgid "Occlusion Culling" +msgstr "é®æŒ¡å‰”除" + +msgid "Limits" +msgstr "é™åˆ¶" + +msgid "Internationalization" +msgstr "国际化" + +msgid "Force Right to Left Layout Direction" +msgstr "强制从å³è‡³å·¦çš„布局方å‘" + +msgid "GUI" +msgstr "GUI" + +msgid "Rendering Device" +msgstr "渲染设备" + +msgid "Staging Buffer" +msgstr "æš‚å˜ç¼“冲区" + +msgid "Block Size (KB)" +msgstr "å—大å°ï¼ˆKB)" + +msgid "Max Size (MB)" +msgstr "最大大å°ï¼ˆMB)" + +msgid "Texture Upload Region Size Px" +msgstr "纹ç†ä¸Šä¼ 区域åƒç´ 大å°" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Max Descriptors per Pool" +msgstr "å„æ± æœ€å¤§æ述符数" + msgid "Low Processor Usage Mode" msgstr "低处ç†å™¨ä½¿ç”¨æ¨¡å¼" @@ -196,6 +271,15 @@ msgstr "低处ç†å™¨ä½¿ç”¨æ¨¡å¼ç¡çœ (微秒)" msgid "Print Error Messages" msgstr "打å°é”™è¯¯æ¶ˆæ¯" +msgid "Physics Ticks per Second" +msgstr "æ¯ç§’物ç†å‘¨æœŸæ•°" + +msgid "Max Physics Steps per Frame" +msgstr "æ¯å¸§æœ€å¤§ç‰©ç†è¿ä»£æ•°" + +msgid "Max FPS" +msgstr "最大 FPS" + msgid "Time Scale" msgstr "时间缩放" @@ -211,9 +295,36 @@ msgstr "使用累积输入" msgid "Device" msgstr "设备" +msgid "Window ID" +msgstr "çª—å£ ID" + +msgid "Command or Control Autoremap" +msgstr "自动é‡æ˜ å°„ Command å’Œ Ctrl" + +msgid "Alt Pressed" +msgstr "按下 Alt" + +msgid "Shift Pressed" +msgstr "按下 Shift" + +msgid "Ctrl Pressed" +msgstr "按下 Ctrl" + +msgid "Meta Pressed" +msgstr "按下 Meta" + msgid "Pressed" msgstr "按下" +msgid "Keycode" +msgstr "é”®ç " + +msgid "Physical Keycode" +msgstr "物ç†é”®ç " + +msgid "Key Label" +msgstr "æŒ‰é”®æ ‡ç¾" + msgid "Unicode" msgstr "Unicode" @@ -230,11 +341,14 @@ msgid "Global Position" msgstr "全局ä½ç½®" msgid "Factor" -msgstr "å› ç´ " +msgstr "系数" msgid "Button Index" msgstr "按钮索引" +msgid "Double Click" +msgstr "åŒå‡»" + msgid "Tilt" msgstr "倾斜" @@ -259,6 +373,9 @@ msgstr "轴值" msgid "Index" msgstr "索引" +msgid "Double Tap" +msgstr "åŒå‡»" + msgid "Action" msgstr "动作" @@ -286,9 +403,24 @@ msgstr "控制器值" msgid "Shortcut" msgstr "å¿«æ·é”®" +msgid "Events" +msgstr "事件" + +msgid "Include Navigational" +msgstr "包å«å¯¼èˆªæ–‡ä»¶" + +msgid "Include Hidden" +msgstr "包å«éšè—文件" + msgid "Big Endian" msgstr "大端åº" +msgid "Network" +msgstr "网络" + +msgid "Page Size" +msgstr "页大å°" + msgid "Blocking Mode Enabled" msgstr "å¯ç”¨é˜»å¡žæ¨¡å¼" @@ -296,7 +428,7 @@ msgid "Connection" msgstr "连接" msgid "Read Chunk Size" -msgstr "åŠ è½½å—大å°" +msgstr "读å–å—大å°" msgid "Data" msgstr "æ•°æ®" @@ -304,14 +436,20 @@ msgstr "æ•°æ®" msgid "Object ID" msgstr "对象 ID" +msgid "Original Class" +msgstr "原始类" + +msgid "Recording Properties" +msgstr "记录属性" + msgid "Encode Buffer Max Size" -msgstr "ç¼–ç 缓冲区大å°ä¸Šé™" +msgstr "ç¼–ç 缓冲区最大大å°" msgid "Input Buffer Max Size" -msgstr "输入缓冲区大å°ä¸Šé™" +msgstr "输入缓冲区最大大å°" msgid "Output Buffer Max Size" -msgstr "输出缓冲区大å°ä¸Šé™" +msgstr "输出缓冲区最大大å°" msgid "Stream Peer" msgstr "æµå¯¹ç‰ä½“" @@ -319,15 +457,15 @@ msgstr "æµå¯¹ç‰ä½“" msgid "Resource" msgstr "资æº" +msgid "Local to Scene" +msgstr "本地于场景" + msgid "Path" msgstr "路径" msgid "Data Array" msgstr "æ•°æ®æ•°ç»„" -msgid "Blocking Handshake" -msgstr "阻塞æ¡æ‰‹" - msgid "Max Pending Connections" msgstr "最大挂起连接数" @@ -337,6 +475,18 @@ msgstr "å移" msgid "Cell Size" msgstr "å•å…ƒæ ¼å¤§å°" +msgid "Jumping Enabled" +msgstr "å¯ç”¨è·³è·ƒ" + +msgid "Default Compute Heuristic" +msgstr "默认计算å¯å‘" + +msgid "Default Estimate Heuristic" +msgstr "默认预估å¯å‘" + +msgid "Diagonal Mode" +msgstr "对角模å¼" + msgid "Seed" msgstr "ç§å" @@ -346,6 +496,24 @@ msgstr "状æ€" msgid "Source Code" msgstr "æºä»£ç " +msgid "TLS" +msgstr "TLS" + +msgid "Threading" +msgstr "多线程" + +msgid "Worker Pool" +msgstr "å·¥ä½œæ± " + +msgid "Max Threads" +msgstr "最大线程数" + +msgid "Use System Threads for Low Priority Tasks" +msgstr "将系统线程用于低优先级任务" + +msgid "Low Priority Thread Ratio" +msgstr "低优先级线程比率" + msgid "Locale" msgstr "区域" @@ -355,15 +523,36 @@ msgstr "测试" msgid "Fallback" msgstr "回退" +msgid "Pseudolocalization" +msgstr "伪本地化" + +msgid "Use Pseudolocalization" +msgstr "使用伪本地化" + +msgid "Replace With Accents" +msgstr "使用é‡éŸ³ç¬¦æ›¿æ¢" + +msgid "Double Vowels" +msgstr "元音åŒå†™" + +msgid "Fake BiDi" +msgstr "伪 BiDi" + msgid "Override" msgstr "覆盖" +msgid "Expansion Ratio" +msgstr "扩展比" + msgid "Prefix" msgstr "å‰ç¼€" msgid "Suffix" msgstr "åŽç¼€" +msgid "Skip Placeholders" +msgstr "跳过å ä½ç¬¦" + msgid "Rotation" msgstr "旋转" @@ -388,6 +577,9 @@ msgstr "入点手柄" msgid "Out Handle" msgstr "出点手柄" +msgid "Handle Mode" +msgstr "手柄模å¼" + msgid "Stream" msgstr "æµ" @@ -403,21 +595,24 @@ msgstr "动画" msgid "Easing" msgstr "缓入缓出" -msgid "Interface" -msgstr "ç•Œé¢" - -msgid "Editors" -msgstr "å„编辑器" - -msgid "Network" -msgstr "网络" +msgid "Debug Adapter" +msgstr "调试适é…器" msgid "Remote Port" msgstr "远程端å£" +msgid "Request Timeout" +msgstr "请求超时" + +msgid "Sync Breakpoints" +msgstr "åŒæ¥æ–点" + msgid "Debugger" msgstr "调试器" +msgid "Auto Switch to Remote Scene Tree" +msgstr "自动切æ¢åˆ°è¿œç¨‹åœºæ™¯æ ‘" + msgid "Remote Scene Tree Refresh Interval" msgstr "è¿œç¨‹åœºæ™¯æ ‘åˆ·æ–°é—´éš”" @@ -436,6 +631,9 @@ msgstr "访问" msgid "Display Mode" msgstr "显示模å¼" +msgid "File Mode" +msgstr "文件模å¼" + msgid "Current Dir" msgstr "当å‰ç›®å½•" @@ -457,6 +655,9 @@ msgstr "导入" msgid "Reimport Missing Imported Files" msgstr "é‡æ–°å¯¼å…¥ç¼ºå¤±çš„已导入文件" +msgid "Use Multiple Threads" +msgstr "使用多线程" + msgid "Text Editor" msgstr "文本编辑器" @@ -478,11 +679,20 @@ msgstr "å¯å‹¾é€‰" msgid "Checked" msgstr "已勾选" +msgid "Draw Warning" +msgstr "绘制è¦å‘Š" + msgid "Keying" msgstr "制作关键帧" -msgid "Main Scene" -msgstr "主场景" +msgid "Deletable" +msgstr "å¯åˆ 除" + +msgid "Interface" +msgstr "ç•Œé¢" + +msgid "Save on Focus Loss" +msgstr "焦点丢失时ä¿å˜" msgid "Show Update Spinner" msgstr "显示更新旋转图" @@ -496,6 +706,9 @@ msgstr "设置本地化" msgid "Scene Tabs" msgstr "场景选项å¡" +msgid "Restore Scenes on Load" +msgstr "åŠ è½½æ—¶æ¢å¤åœºæ™¯" + msgid "Inspector" msgstr "检查器" @@ -517,9 +730,18 @@ msgstr "横å‘编辑 Vector2" msgid "Horizontal Vector Types Editing" msgstr "横å‘编辑 Vector 类型" +msgid "Open Resources in Current Inspector" +msgstr "在当å‰æ£€æŸ¥å™¨ä¸æ‰“开资æº" + +msgid "Resources to Open in New Inspector" +msgstr "在新检查器ä¸æ‰“开的资æº" + msgid "Default Color Picker Mode" msgstr "默认å–色器模å¼" +msgid "Default Color Picker Shape" +msgstr "默认å–色器形状" + msgid "Distraction Free Mode" msgstr "专注模å¼" @@ -544,6 +766,15 @@ msgstr "编辑器è¯è¨€" msgid "Display Scale" msgstr "显示缩放" +msgid "Enable Pseudolocalization" +msgstr "å¯ç”¨ä¼ªæœ¬åœ°åŒ–" + +msgid "Use Embedded Menu" +msgstr "使用嵌入å¼èœå•" + +msgid "Expand to Title" +msgstr "æ‰©å±•è‡³æ ‡é¢˜æ " + msgid "Custom Display Scale" msgstr "自定义显示缩放" @@ -553,9 +784,24 @@ msgstr "主å—体大å°" msgid "Code Font Size" msgstr "代ç å—体大å°" +msgid "Code Font Contextual Ligatures" +msgstr "代ç å—体上下文连å—" + +msgid "Code Font Custom OpenType Features" +msgstr "代ç å—体自定义 OpenType 功能" + +msgid "Code Font Custom Variations" +msgstr "代ç å—体自定义å˜ä½“" + +msgid "Font Antialiasing" +msgstr "å—体抗锯齿" + msgid "Font Hinting" msgstr "å—体微调" +msgid "Font Subpixel Positioning" +msgstr "å—体次åƒç´ 定ä½" + msgid "Main Font" msgstr "主å—体" @@ -577,15 +823,36 @@ msgstr "å•ç‹¬çš„专注模å¼" msgid "Automatically Open Screenshots" msgstr "自动打开截图" +msgid "Single Window Mode" +msgstr "å•çª—å£æ¨¡å¼" + msgid "Mouse Extra Buttons Navigate History" msgstr "ä½¿ç”¨ä¸“é—¨é¼ æ ‡æŒ‰é”®æŸ¥çœ‹åŽ†å²" +msgid "Save Each Scene on Quit" +msgstr "退出时ä¿å˜å„场景" + +msgid "Accept Dialog Cancel OK Buttons" +msgstr "接å—对è¯æ¡†å–消/确定按钮" + +msgid "Show Internal Errors in Toast Notifications" +msgstr "在 Toast 通知ä¸æ˜¾ç¤ºå†…部错误" + +msgid "Max Array Dictionary Items per Page" +msgstr "æ¯é¡µæœ€å¤§æ•°ç»„å—å…¸æ¡ç›®æ•°" + +msgid "Show Low Level OpenType Features" +msgstr "显示低级 OpenType 功能" + msgid "Theme" msgstr "主题" msgid "Preset" msgstr "预设" +msgid "Icon and Font Color" +msgstr "å›¾æ ‡ä¸Žå—体颜色" + msgid "Base Color" msgstr "基础颜色" @@ -595,6 +862,12 @@ msgstr "强调颜色" msgid "Contrast" msgstr "对比度" +msgid "Draw Extra Borders" +msgstr "绘制é¢å¤–边框" + +msgid "Icon Saturation" +msgstr "å›¾æ ‡é¥±å’Œåº¦" + msgid "Relationship Line Opacity" msgstr "关系线ä¸é€æ˜Žåº¦" @@ -610,12 +883,36 @@ msgstr "é¢å¤–é—´è·" msgid "Custom Theme" msgstr "自定义主题" +msgid "Display Close Button" +msgstr "显示关é—按钮" + +msgid "Show Thumbnail on Hover" +msgstr "悬åœæ—¶æ˜¾ç¤ºç¼©ç•¥å›¾" + +msgid "Maximum Width" +msgstr "最大宽度" + msgid "Show Script Button" msgstr "显示脚本按钮" msgid "FileSystem" msgstr "文件系统" +msgid "External Programs" +msgstr "外部程åº" + +msgid "Raster Image Editor" +msgstr "æ …æ ¼å›¾ç¼–è¾‘å™¨" + +msgid "Vector Image Editor" +msgstr "矢é‡å›¾ç¼–辑器" + +msgid "Audio Editor" +msgstr "音频编辑器" + +msgid "3D Model Editor" +msgstr "3D 模型编辑器" + msgid "Directories" msgstr "目录" @@ -631,6 +928,9 @@ msgstr "ä¿å˜æ—¶" msgid "Compress Binary Resources" msgstr "压缩二进制资æº" +msgid "Safe Save on Backup then Rename" +msgstr "安全ä¿å˜å¤‡ä»½åŽé‡å‘½å" + msgid "File Dialog" msgstr "文件对è¯æ¡†" @@ -644,19 +944,25 @@ msgid "Scene Tree" msgstr "åœºæ™¯æ ‘" msgid "Start Create Dialog Fully Expanded" -msgstr "默认完全展开创建对è¯æ¡†" +msgstr "打开创建对è¯æ¡†æ—¶å®Œå…¨å±•å¼€" + +msgid "Auto Expand to Selected" +msgstr "自动展开至选定项" msgid "Always Show Folders" msgstr "总是显示文件夹" +msgid "Textfile Extensions" +msgstr "文本文件扩展å" + msgid "Property Editor" msgstr "属性编辑器" msgid "Auto Refresh Interval" -msgstr "自动刷新频率" +msgstr "自动刷新间隔" msgid "Subresource Hue Tint" -msgstr "å资æºå½©è‰²æ˜¾ç¤º" +msgstr "å资æºè‰²ç›¸è°ƒæ•´" msgid "Color Theme" msgstr "颜色主题" @@ -670,20 +976,29 @@ msgstr "å…‰æ ‡" msgid "Caret Blink" msgstr "å…‰æ ‡é—ªçƒ" +msgid "Caret Blink Interval" +msgstr "å…‰æ ‡é—ªçƒé—´éš”" + msgid "Highlight Current Line" msgstr "高亮当å‰è¡Œ" msgid "Highlight All Occurrences" msgstr "高亮所有匹é…项" +msgid "Guidelines" +msgstr "辅助线" + msgid "Show Line Length Guidelines" msgstr "显示行长度å‚考线" msgid "Line Length Guideline Soft Column" -msgstr "行长度å‚考线软列数" +msgstr "行长度软å‚考线列数" msgid "Line Length Guideline Hard Column" -msgstr "行长度å‚考线硬列数" +msgstr "行长度硬å‚考线列数" + +msgid "Gutters" +msgstr "装订线" msgid "Show Line Numbers" msgstr "显示行å·" @@ -709,12 +1024,18 @@ msgstr "显示å°åœ°å›¾" msgid "Minimap Width" msgstr "å°åœ°å›¾å®½åº¦" +msgid "Lines" +msgstr "è¡Œ" + msgid "Code Folding" msgstr "代ç 折å " msgid "Word Wrap" msgstr "自动æ¢è¡Œ" +msgid "Whitespace" +msgstr "ç©ºæ ¼" + msgid "Draw Tabs" msgstr "绘制制表符" @@ -724,15 +1045,30 @@ msgstr "ç»˜åˆ¶ç©ºæ ¼" msgid "Line Spacing" msgstr "行间è·" +msgid "Behavior" +msgstr "行为" + msgid "Navigation" msgstr "导航" +msgid "Move Caret on Right Click" +msgstr "在å³é”®å•å‡»æ—¶ç§»åŠ¨å…‰æ ‡" + +msgid "Scroll Past End of File" +msgstr "滚动越过文件末尾" + msgid "Smooth Scrolling" msgstr "平滑滚动" msgid "V Scroll Speed" msgstr "垂直滚动速度" +msgid "Drag and Drop Selection" +msgstr "拖放选区" + +msgid "Stay in Script Editor on Node Selected" +msgstr "选择节点时åœç•™åœ¨è„šæœ¬ç¼–辑器" + msgid "Indent" msgstr "缩进" @@ -742,9 +1078,21 @@ msgstr "自动缩进" msgid "Files" msgstr "文件" +msgid "Trim Trailing Whitespace on Save" +msgstr "ä¿å˜æ—¶ç§»é™¤è¡Œå°¾ç©ºæ ¼" + msgid "Autosave Interval Secs" msgstr "自动ä¿å˜é—´éš”秒数" +msgid "Restore Scripts on Load" +msgstr "åŠ è½½æ—¶æ¢å¤è„šæœ¬" + +msgid "Convert Indent on Save" +msgstr "ä¿å˜æ—¶è½¬æ¢ç¼©è¿›" + +msgid "Auto Reload Scripts on External Change" +msgstr "外部修改时自动é‡æ–°åŠ 载脚本" + msgid "Script List" msgstr "脚本列表" @@ -790,17 +1138,23 @@ msgstr "帮助æºç å—体大å°" msgid "Help Title Font Size" msgstr "å¸®åŠ©æ ‡é¢˜å—体大å°" +msgid "Class Reference Examples" +msgstr "ç±»å‚考示例" + +msgid "Editors" +msgstr "å„编辑器" + msgid "Grid Map" -msgstr "ç½‘æ ¼åœ°å›¾" +msgstr "æ …æ ¼åœ°å›¾" msgid "Pick Distance" msgstr "拾å–è·ç¦»" msgid "Primary Grid Color" -msgstr "ä¸»ç½‘æ ¼é¢œè‰²" +msgstr "ä¸»æ …æ ¼é¢œè‰²" msgid "Secondary Grid Color" -msgstr "æ¬¡ç½‘æ ¼é¢œè‰²" +msgstr "æ¬¡æ …æ ¼é¢œè‰²" msgid "Selection Box Color" msgstr "选择框颜色" @@ -811,6 +1165,9 @@ msgstr "3D å°å·¥å…·" msgid "Gizmo Colors" msgstr "å°å·¥å…·é¢œè‰²" +msgid "Instantiated" +msgstr "实例化的" + msgid "Joint" msgstr "关节" @@ -818,28 +1175,28 @@ msgid "Shape" msgstr "形状" msgid "Primary Grid Steps" -msgstr "ä¸»ç½‘æ ¼æ¥é•¿" +msgstr "ä¸»æ …æ ¼æ¥é•¿" msgid "Grid Size" -msgstr "ç½‘æ ¼å¤§å°" +msgstr "æ …æ ¼å¤§å°" msgid "Grid Division Level Max" -msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«ä¸Šé™" +msgstr "æ …æ ¼ç»†åˆ†çº§åˆ«ä¸Šé™" msgid "Grid Division Level Min" -msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«ä¸‹é™" +msgstr "æ …æ ¼ç»†åˆ†çº§åˆ«ä¸‹é™" msgid "Grid Division Level Bias" -msgstr "ç½‘æ ¼ç»†åˆ†çº§åˆ«åç½®" +msgstr "æ …æ ¼ç»†åˆ†çº§åˆ«åç½®" msgid "Grid XZ Plane" -msgstr "ç½‘æ ¼ XZ å¹³é¢" +msgstr "æ …æ ¼ XZ å¹³é¢" msgid "Grid XY Plane" -msgstr "ç½‘æ ¼ XY å¹³é¢" +msgstr "æ …æ ¼ XY å¹³é¢" msgid "Grid YZ Plane" -msgstr "ç½‘æ ¼ YZ å¹³é¢" +msgstr "æ …æ ¼ YZ å¹³é¢" msgid "Default FOV" msgstr "默认 FOV" @@ -878,7 +1235,7 @@ msgid "Zoom Modifier" msgstr "缩放修饰键" msgid "Warped Mouse Panning" -msgstr "é¼ æ ‡å¹³ç§»è·³è·ƒ" +msgstr "é¼ æ ‡æŒç»å¹³ç§»" msgid "Navigation Feel" msgstr "导航体验" @@ -892,9 +1249,6 @@ msgstr "环绕惯性" msgid "Translation Inertia" msgstr "平移惯性" -msgid "Zoom Inertia" -msgstr "缩放关心" - msgid "Freelook" msgstr "自由观看" @@ -917,7 +1271,7 @@ msgid "Freelook Speed Zoom Link" msgstr "自由观看速度缩放关è”" msgid "Grid Color" -msgstr "ç½‘æ ¼é¢œè‰²" +msgstr "æ …æ ¼é¢œè‰²" msgid "Guides Color" msgstr "å‚考线颜色" @@ -944,7 +1298,7 @@ msgid "Bone Outline Color" msgstr "骨骼轮廓颜色" msgid "Bone Outline Size" -msgstr "骨骼轮廓颜色" +msgstr "骨骼轮廓大å°" msgid "Viewport Border Color" msgstr "视å£è¾¹æ¡†é¢œè‰²" @@ -952,14 +1306,35 @@ msgstr "视å£è¾¹æ¡†é¢œè‰²" msgid "Constrain Editor View" msgstr "é™åˆ¶ç¼–辑器视图" +msgid "Panning" +msgstr "平移" + +msgid "2D Editor Panning Scheme" +msgstr "2D 编辑器平移方案" + +msgid "Sub Editors Panning Scheme" +msgstr "å编辑器平移方案" + +msgid "Animation Editors Panning Scheme" +msgstr "动画编辑器平移方案" + msgid "Simple Panning" msgstr "简å•å¹³ç§»" +msgid "2D Editor Pan Speed" +msgstr "2D 编辑器平移速度" + +msgid "Tiles Editor" +msgstr "图å—编辑器" + msgid "Display Grid" -msgstr "æ˜¾ç¤ºç½‘æ ¼" +msgstr "æ˜¾ç¤ºæ …æ ¼" + +msgid "Polygon Editor" +msgstr "多边形编辑器" msgid "Point Grab Radius" -msgstr "å¥æŸ„点åŠå¾„" +msgstr "点抓å–åŠå¾„" msgid "Show Previous Outline" msgstr "显示旧有轮廓" @@ -988,6 +1363,15 @@ msgstr "å¯è§†åŒ–编辑器" msgid "Minimap Opacity" msgstr "å°åœ°å›¾ä¸é€æ˜Žåº¦" +msgid "Lines Curvature" +msgstr "线æ¡æ›²çŽ‡" + +msgid "Visual Shader" +msgstr "å¯è§†åŒ–ç€è‰²å™¨" + +msgid "Port Preview Size" +msgstr "端å£é¢„览大å°" + msgid "Window Placement" msgstr "窗å£æ”¾ç½®" @@ -1012,9 +1396,21 @@ msgstr "输出" msgid "Font Size" msgstr "å—体大å°" +msgid "Always Clear Output on Play" +msgstr "è¿è¡Œæ—¶æ¸…空输出" + +msgid "Always Open Output on Play" +msgstr "è¿è¡Œæ—¶æ‰“开输出" + +msgid "Always Close Output on Stop" +msgstr "åœæ¢æ—¶å…³é—输出" + msgid "Remote Host" msgstr "远程主机" +msgid "Editor TLS Certificates" +msgstr "编辑器 TLS è¯ä¹¦" + msgid "Profiler Frame History Size" msgstr "性能分æžå™¨å¸§åŽ†å²å¤§å°" @@ -1033,6 +1429,9 @@ msgstr "项目管ç†å™¨" msgid "Sorting Order" msgstr "排åºæ–¹å¼" +msgid "Default Renderer" +msgstr "默认渲染器" + msgid "Highlighting" msgstr "高亮" @@ -1075,6 +1474,9 @@ msgstr "补全å˜åœ¨é¢œè‰²" msgid "Completion Scroll Color" msgstr "补全滚动æ¡é¢œè‰²" +msgid "Completion Scroll Hovered Color" +msgstr "补全滚动æ¡æ‚¬åœé¢œè‰²" + msgid "Completion Font Color" msgstr "补全å—体颜色" @@ -1097,7 +1499,7 @@ msgid "Text Selected Color" msgstr "文本选ä¸é¢œè‰²" msgid "Selection Color" -msgstr "选ä¸é¢œè‰²" +msgstr "选区颜色" msgid "Brace Mismatch Color" msgstr "括å·ä¸åŒ¹é…颜色" @@ -1153,12 +1555,18 @@ msgstr "缩放" msgid "Export" msgstr "导出" +msgid "Convert Text Resources to Binary" +msgstr "将文本资æºè½¬æ¢ä¸ºäºŒè¿›åˆ¶" + msgid "Custom Template" msgstr "自定义模æ¿" msgid "Release" msgstr "å‘布" +msgid "Export Console Script" +msgstr "导出命令行脚本" + msgid "Binary Format" msgstr "äºŒè¿›åˆ¶æ ¼å¼" @@ -1183,6 +1591,12 @@ msgstr "ETC2" msgid "No BPTC Fallbacks" msgstr "æ— BPTC 回退" +msgid "SSH" +msgstr "SSH" + +msgid "SCP" +msgstr "SCP" + msgid "Export Path" msgstr "导出路径" @@ -1192,20 +1606,74 @@ msgstr "文件æœåŠ¡å™¨" msgid "Password" msgstr "密ç " +msgid "Antialiasing" +msgstr "抗锯齿" + +msgid "Generate Mipmaps" +msgstr "ç”Ÿæˆ Mipmap" + +msgid "Multichannel Signed Distance Field" +msgstr "多通é“带符å·è·ç¦»åœº" + +msgid "MSDF Pixel Range" +msgstr "MSDF åƒç´ 范围" + +msgid "MSDF Size" +msgstr "MSDF 大å°" + +msgid "Allow System Fallback" +msgstr "å…许系统回退" + +msgid "Force Autohinter" +msgstr "强制自动微调" + msgid "Hinting" msgstr "微调" +msgid "Subpixel Positioning" +msgstr "次åƒç´ 定ä½" + msgid "Oversampling" msgstr "è¿‡é‡‡æ ·" +msgid "Metadata Overrides" +msgstr "元数æ®è¦†ç›–" + +msgid "Language Support" +msgstr "è¯è¨€æ”¯æŒ" + +msgid "Script Support" +msgstr "脚本支æŒ" + +msgid "OpenType Features" +msgstr "OpenType 特性" + +msgid "Fallbacks" +msgstr "回退" + msgid "Compress" msgstr "压缩" +msgid "Language" +msgstr "è¯è¨€" + msgid "Outline Size" msgstr "轮廓大å°" msgid "Variation" -msgstr "å˜åŒ–" +msgstr "å˜ä½“" + +msgid "OpenType" +msgstr "OpenType" + +msgid "Embolden" +msgstr "åŠ ç²—" + +msgid "Face Index" +msgstr "å—é¢ç´¢å¼•" + +msgid "Transform" +msgstr "å˜æ¢" msgid "Collada" msgstr "Collada" @@ -1213,9 +1681,39 @@ msgstr "Collada" msgid "Use Ambient" msgstr "使用环境光" +msgid "Retarget" +msgstr "é‡å®šå‘" + +msgid "Bone Renamer" +msgstr "骨骼命å器" + +msgid "Rename Bones" +msgstr "é‡å‘½å骨骼" + +msgid "Unique Node" +msgstr "唯一节点" + msgid "Make Unique" msgstr "唯一化" +msgid "Skeleton Name" +msgstr "骨架å称" + +msgid "Rest Fixer" +msgstr "放æ¾ä¿®å¤å™¨" + +msgid "Apply Node Transforms" +msgstr "应用节点å˜æ¢" + +msgid "Normalize Position Tracks" +msgstr "归一化ä½ç½®è½¨é“" + +msgid "Overwrite Axis" +msgstr "覆盖轴" + +msgid "Fix Silhouette" +msgstr "ä¿®å¤å‰ªå½±" + msgid "Enable" msgstr "å¯ç”¨" @@ -1225,6 +1723,21 @@ msgstr "过滤" msgid "Threshold" msgstr "阈值" +msgid "Base Height Adjustment" +msgstr "基础高度调整" + +msgid "Remove Tracks" +msgstr "移除轨é“" + +msgid "Except Bone Transform" +msgstr "排除骨骼å˜æ¢" + +msgid "Unimportant Positions" +msgstr "éžé‡è¦ä½ç½®" + +msgid "Unmapped Bones" +msgstr "æœªæ˜ å°„éª¨éª¼" + msgid "Create From" msgstr "创建自" @@ -1234,17 +1747,29 @@ msgstr "分隔符" msgid "Preload" msgstr "é¢„åŠ è½½" +msgid "Character Ranges" +msgstr "å—符范围" + msgid "Columns" msgstr "列数" -msgid "Mode" -msgstr "模å¼" +msgid "Rows" +msgstr "行数" + +msgid "Image Margin" +msgstr "图片边è·" + +msgid "Character Margin" +msgstr "å—符边è·" msgid "Lossy Quality" msgstr "有æŸè´¨é‡" -msgid "BPTC LDR" -msgstr "BPTC LDR" +msgid "HDR Compression" +msgstr "HDR 压缩" + +msgid "Channel Pack" +msgstr "通é“打包" msgid "Mipmaps" msgstr "Mipmap" @@ -1264,6 +1789,9 @@ msgstr "æ°´å¹³" msgid "Vertical" msgstr "åž‚ç›´" +msgid "Arrangement" +msgstr "排列" + msgid "Layout" msgstr "布局" @@ -1279,15 +1807,36 @@ msgstr "ç¼©æ”¾ç½‘æ ¼" msgid "Offset Mesh" msgstr "åç§»ç½‘æ ¼" +msgid "Optimize Mesh" +msgstr "ä¼˜åŒ–ç½‘æ ¼" + +msgid "Skip Import" +msgstr "跳过导入" + msgid "NavMesh" msgstr "å¯¼èˆªç½‘æ ¼" +msgid "Body Type" +msgstr "实体类型" + +msgid "Shape Type" +msgstr "形状类型" + +msgid "Decomposition" +msgstr "拆分" + msgid "Advanced" msgstr "高级" msgid "Precision" msgstr "精度" +msgid "Symmetry Planes Clipping Bias" +msgstr "对称平é¢è£å‰ªåç½®" + +msgid "Normalize Mesh" +msgstr "å½’ä¸€åŒ–ç½‘æ ¼" + msgid "Height" msgstr "高度" @@ -1297,11 +1846,35 @@ msgstr "åŠå¾„" msgid "Occluder" msgstr "é®æŒ¡å™¨" +msgid "Simplification Distance" +msgstr "化简è·ç¦»" + +msgid "Save to File" +msgstr "ä¿å˜ä¸ºæ–‡ä»¶" + msgid "Enabled" msgstr "å¯ç”¨" +msgid "Shadow Meshes" +msgstr "é˜´å½±ç½‘æ ¼" + +msgid "Lightmap UV" +msgstr "光照贴图 UV" + +msgid "Lods" +msgstr "LOD" + +msgid "Normal Split Angle" +msgstr "法线拆分角度" + +msgid "Normal Merge Angle" +msgstr "法线åˆå¹¶è§’度" + +msgid "Use External" +msgstr "使用外部" + msgid "Loop Mode" -msgstr "æ··æ¢æ¨¡å¼" +msgstr "循环模å¼" msgid "Keep Custom Tracks" msgstr "ä¿ç•™è‡ªå®šä¹‰è½¨é“" @@ -1309,14 +1882,20 @@ msgstr "ä¿ç•™è‡ªå®šä¹‰è½¨é“" msgid "Optimizer" msgstr "优化器" +msgid "Max Velocity Error" +msgstr "最大速度误差" + msgid "Max Angular Error" msgstr "最大角度误差" -msgid "Compression" -msgstr "压缩" +msgid "Max Precision Error" +msgstr "最大精度误差" -msgid "Page Size" -msgstr "页大å°" +msgid "Import Tracks" +msgstr "导入轨é“" + +msgid "Bone Map" +msgstr "éª¨éª¼æ˜ å°„" msgid "Nodes" msgstr "节点" @@ -1327,6 +1906,9 @@ msgstr "æ ¹ç±»åž‹" msgid "Root Name" msgstr "æ ¹å称" +msgid "Apply Root Scale" +msgstr "åº”ç”¨æ ¹ç¼©æ”¾" + msgid "Root Scale" msgstr "æ ¹ç¼©æ”¾" @@ -1336,6 +1918,12 @@ msgstr "ç½‘æ ¼" msgid "Ensure Tangents" msgstr "ç¡®ä¿åˆ‡çº¿" +msgid "Generate Lods" +msgstr "ç”Ÿæˆ LOD" + +msgid "Create Shadow Meshes" +msgstr "åˆ›å»ºé˜´å½±ç½‘æ ¼" + msgid "Light Baking" msgstr "光照烘焙" @@ -1351,12 +1939,18 @@ msgstr "使用具å蒙皮" msgid "FPS" msgstr "FPS" +msgid "Import Script" +msgstr "导入脚本" + msgid "Normal Map" msgstr "法线贴图" msgid "Roughness" msgstr "粗糙度" +msgid "Src Normal" +msgstr "原法线" + msgid "Process" msgstr "处ç†" @@ -1369,21 +1963,39 @@ msgstr "预乘 Alpha" msgid "Normal Map Invert Y" msgstr "法线贴图å转 Y" +msgid "HDR as sRGB" +msgstr "HDR 作为 sRGB" + +msgid "HDR Clamp Exposure" +msgstr "HDR é™åˆ¶æ›å…‰" + msgid "Size Limit" msgstr "大å°é™åˆ¶" msgid "Detect 3D" msgstr "检测 3D" +msgid "Compress To" +msgstr "压缩至" + msgid "SVG" msgstr "SVG" +msgid "Scale With Editor Scale" +msgstr "ä¾ç…§ç¼–辑器比例缩放" + +msgid "Convert Colors With Editor Theme" +msgstr "ä¾ç…§ç¼–辑器主题转æ¢é¢œè‰²" + msgid "Atlas File" msgstr "图集文件" msgid "Import Mode" msgstr "导入模å¼" +msgid "Crop to Region" +msgstr "è£å‰ªè‡³åŒºåŸŸ" + msgid "Trim Alpha Border From Region" msgstr "从区域修剪 Alpha 边框" @@ -1418,7 +2030,7 @@ msgid "Loop End" msgstr "循环终点" msgid "Asset Library" -msgstr "ç´ æ库" +msgstr "资产库" msgid "Use Threads" msgstr "使用线程" @@ -1426,6 +2038,15 @@ msgstr "使用线程" msgid "Available URLs" msgstr "å¯ç”¨ URL" +msgid "Unset" +msgstr "未设置" + +msgid "Set" +msgstr "设置" + +msgid "Missing" +msgstr "缺失" + msgid "Error" msgstr "错误" @@ -1441,15 +2062,30 @@ msgstr "VisibilityNotifier" msgid "Particles" msgstr "ç²’å" +msgid "Particle Attractor" +msgstr "ç²’åå¸å¼•å™¨" + +msgid "Particle Collision" +msgstr "ç²’å碰撞" + msgid "Reflection Probe" msgstr "å射探针" +msgid "Decal" +msgstr "贴花" + +msgid "Voxel GI" +msgstr "ä½“ç´ GI" + msgid "Joint Body A" msgstr "关节实体 A" msgid "Joint Body B" msgstr "关节实体 B" +msgid "Fog Volume" +msgstr "雾体积" + msgid "Manipulator Gizmo Size" msgstr "æ“作å°å·¥å…·å¤§å°" @@ -1459,6 +2095,12 @@ msgstr "æ“作å°å·¥å…·ä¸é€æ˜Žåº¦" msgid "Show Viewport Rotation Gizmo" msgstr "显示视å£æ—‹è½¬å°å·¥å…·" +msgid "Show Viewport Navigation Gizmo" +msgstr "显示视å£å¯¼èˆªå°å·¥å…·" + +msgid "Auto Reload and Parse Scripts on Save" +msgstr "ä¿å˜æ—¶è‡ªåŠ¨é‡æ–°åŠ 载并解æžè„šæœ¬" + msgid "External" msgstr "外部" @@ -1469,16 +2111,16 @@ msgid "Exec Path" msgstr "å¯æ‰§è¡Œæ–‡ä»¶è·¯å¾„" msgid "Script Temperature Enabled" -msgstr "å¯ç”¨è„šæœ¬æ¸©åº¦" +msgstr "å¯ç”¨è„šæœ¬çƒåº¦" msgid "Script Temperature History Size" -msgstr "脚本温度历å²å¤§å°" +msgstr "脚本çƒåº¦åŽ†å²å¤§å°" msgid "Group Help Pages" msgstr "帮助页分组" msgid "Sort Scripts By" -msgstr "脚本排åº" +msgstr "脚本排åºæ–¹å¼" msgid "List Script Names As" msgstr "列表ä¸çš„脚本å称" @@ -1487,17 +2129,38 @@ msgid "Exec Flags" msgstr "执行å‚æ•°" msgid "Skeleton" -msgstr "Skeleton" +msgstr "骨架" + +msgid "Selected Bone" +msgstr "选ä¸éª¨éª¼" + +msgid "Gizmo Settings" +msgstr "å°å·¥å…·è®¾ç½®" + +msgid "Bone Shape" +msgstr "骨骼形状" + +msgid "Shader Language" +msgstr "ç€è‰²å™¨è¯è¨€" msgid "Warnings" msgstr "è¦å‘Š" +msgid "Treat Warnings as Errors" +msgstr "å°†è¦å‘Šå½“作错误" + msgid "ID" msgstr "ID" msgid "Version Control" msgstr "版本控制" +msgid "Plugin Name" +msgstr "æ’件å" + +msgid "Autoload on Startup" +msgstr "å¯åŠ¨æ—¶è‡ªåŠ¨åŠ è½½" + msgid "Username" msgstr "用户å" @@ -1507,12 +2170,21 @@ msgstr "SSH 公钥路径" msgid "SSH Private Key Path" msgstr "SSH ç§é’¥è·¯å¾„" +msgid "Edited Property" +msgstr "编辑的属性" + msgid "Show Scene Tree Root Selection" msgstr "æ˜¾ç¤ºåœºæ™¯æ ‘æ ¹é€‰æ‹©" +msgid "Derive Script Globals by Name" +msgstr "按全局脚本å称派生" + msgid "Use Favorites Root Selection" msgstr "使用收è—æ ¹é€‰æ‹©" +msgid "Flush stdout on Print" +msgstr "打å°æ—¶æ¸…ç©ºæ ‡å‡†è¾“å‡º" + msgid "File Logging" msgstr "文件日志" @@ -1525,6 +2197,18 @@ msgstr "日志路径" msgid "Driver" msgstr "驱动" +msgid "GL Compatibility" +msgstr "GL 兼容性" + +msgid "Renderer" +msgstr "渲染器" + +msgid "Rendering Method" +msgstr "渲染方法" + +msgid "Include Text Server Data" +msgstr "包括文本æœåŠ¡å™¨æ•°æ®" + msgid "DPI" msgstr "DPI" @@ -1543,9 +2227,6 @@ msgstr "线程" msgid "Thread Model" msgstr "线程模型" -msgid "Audio" -msgstr "音频" - msgid "Handheld" msgstr "手æŒè®¾å¤‡" @@ -1555,6 +2236,9 @@ msgstr "æœå‘" msgid "V-Sync" msgstr "åž‚ç›´åŒæ¥" +msgid "V-Sync Mode" +msgstr "åž‚ç›´åŒæ¥æ¨¡å¼" + msgid "Common" msgstr "通用" @@ -1564,6 +2248,9 @@ msgstr "æ ‡å‡†è¾“å‡º" msgid "Print FPS" msgstr "æ‰“å° FPS" +msgid "Print GPU Profile" +msgstr "输出 GPU é…ç½®" + msgid "Verbose stdout" msgstr "å†—é•¿æ ‡å‡†è¾“å‡º" @@ -1573,48 +2260,78 @@ msgstr "低处ç†å™¨æ¨¡å¼" msgid "iOS" msgstr "iOS" +msgid "Allow High Refresh Rate" +msgstr "å…许高刷新率" + msgid "Hide Home Indicator" msgstr "éšè— Home 指示æ¡" +msgid "Hide Status Bar" +msgstr "éšè—状æ€æ " + +msgid "Input Devices" +msgstr "输入设备" + +msgid "Pointing" +msgstr "指点" + +msgid "XR" +msgstr "XR" + +msgid "OpenXR" +msgstr "OpenXR" + +msgid "Submit Depth Buffer" +msgstr "æ交深度缓冲区" + msgid "Boot Splash" msgstr "å¯åŠ¨é¡µ" msgid "BG Color" msgstr "背景色" -msgid "Input Devices" -msgstr "输入设备" +msgid "Pen Tablet" +msgstr "æ•°ä½æ¿" msgid "Environment" msgstr "环境" +msgid "Defaults" +msgstr "默认" + msgid "Default Clear Color" msgstr "默认清å±é¢œè‰²" msgid "Show Image" msgstr "显示图åƒ" +msgid "Image" +msgstr "图åƒ" + msgid "Fullsize" msgstr "完整大å°" msgid "Use Filter" msgstr "使用过滤" +msgid "Icon" +msgstr "å›¾æ ‡" + msgid "Buffering" msgstr "缓冲" msgid "Agile Event Flushing" msgstr "æ•æ·äº‹ä»¶å¤„ç†" -msgid "Pointing" -msgstr "指点" - msgid "Emulate Touch From Mouse" msgstr "ç”¨é¼ æ ‡æ¨¡æ‹Ÿè§¦æ‘¸" msgid "Emulate Mouse From Touch" msgstr "ç”¨è§¦æ‘¸æ¨¡æ‹Ÿé¼ æ ‡" +msgid "Text Driver" +msgstr "文本驱动" + msgid "Mouse Cursor" msgstr "é¼ æ ‡å…‰æ ‡" @@ -1624,6 +2341,9 @@ msgstr "自定义图åƒçƒåŒº" msgid "Tooltip Position Offset" msgstr "工具æ示ä½ç½®å移" +msgid "Dotnet" +msgstr ".NET" + msgid "Project" msgstr "项目" @@ -1636,11 +2356,26 @@ msgstr "解决方案目录" msgid "Main Loop Type" msgstr "主循环类型" +msgid "Subwindows" +msgstr "å窗å£" + +msgid "Embed Subwindows" +msgstr "嵌入å¼å窗å£" + +msgid "Stretch" +msgstr "拉伸" + +msgid "Aspect" +msgstr "比例" + msgid "Auto Accept Quit" msgstr "自动接å—退出" -msgid "GUI" -msgstr "GUI" +msgid "Quit on Go Back" +msgstr "返回时退出" + +msgid "Snap Controls to Pixels" +msgstr "控件åƒç´ å¸é™„" msgid "Fonts" msgstr "å—体" @@ -1651,6 +2386,15 @@ msgstr "动æ€å—体" msgid "Use Oversampling" msgstr "ä½¿ç”¨è¿‡é‡‡æ ·" +msgid "Textures" +msgstr "纹ç†" + +msgid "Default Texture Filter" +msgstr "默认纹ç†è¿‡æ»¤å™¨" + +msgid "Default Texture Repeat" +msgstr "默认纹ç†é‡å¤" + msgid "Operation" msgstr "æ“作" @@ -1672,6 +2416,9 @@ msgstr "碰撞层" msgid "Collision Mask" msgstr "碰撞é®ç½©" +msgid "Collision Priority" +msgstr "碰撞优先级" + msgid "Flip Faces" msgstr "翻转表é¢" @@ -1753,9 +2500,21 @@ msgstr "GDScript" msgid "Function Definition Color" msgstr "函数定义颜色" +msgid "Global Function Color" +msgstr "全局函数颜色" + msgid "Node Path Color" msgstr "节点路径颜色" +msgid "Node Reference Color" +msgstr "节点引用颜色" + +msgid "Annotation Color" +msgstr "注解颜色" + +msgid "String Name Color" +msgstr "StringName 颜色" + msgid "Exclude Addons" msgstr "排除æ’件" @@ -1765,6 +2524,9 @@ msgstr "è¯è¨€æœåŠ¡å™¨" msgid "Enable Smart Resolve" msgstr "å¯ç”¨æ™ºèƒ½è§£æž" +msgid "Show Native Symbols in Editor" +msgstr "编辑器ä¸æ˜¾ç¤ºåŽŸç”Ÿç¬¦å·" + msgid "Use Thread" msgstr "使用线程" @@ -1774,6 +2536,9 @@ msgstr "颜色" msgid "Intensity" msgstr "强度" +msgid "Light Type" +msgstr "å…‰æºç±»åž‹" + msgid "Range" msgstr "范围" @@ -1834,8 +2599,8 @@ msgstr "基础路径" msgid "Root Nodes" msgstr "æ ¹èŠ‚ç‚¹" -msgid "Textures" -msgstr "纹ç†" +msgid "Texture Samplers" +msgstr "纹ç†é‡‡æ ·å™¨" msgid "Images" msgstr "图åƒ" @@ -1855,12 +2620,24 @@ msgstr "唯一动画å称" msgid "Skeletons" msgstr "骨架" +msgid "Create Animations" +msgstr "创建动画" + msgid "Animations" msgstr "动画" +msgid "Blender" +msgstr "Blender" + +msgid "Blender 3 Path" +msgstr "Blender 3 路径" + msgid "FBX" msgstr "FBX" +msgid "FBX2glTF Path" +msgstr "FBX2glTF 路径" + msgid "Buffer View" msgstr "缓冲视图" @@ -1970,7 +2747,13 @@ msgid "Src Image" msgstr "æ¥æºå›¾åƒ" msgid "Sampler" -msgstr "é‡‡æ · Sampler" +msgstr "é‡‡æ ·å™¨" + +msgid "Mag Filter" +msgstr "放大过滤器" + +msgid "Min Filter" +msgstr "缩å°è¿‡æ»¤å™¨" msgid "Palette Min Width" msgstr "调色æ¿æœ€å°å®½åº¦" @@ -2017,6 +2800,9 @@ msgstr "烘焙导航" msgid "Lightmapping" msgstr "光照贴图" +msgid "Bake Quality" +msgstr "烘焙质é‡" + msgid "Low Quality Ray Count" msgstr "低ç‰è´¨é‡å°„线数" @@ -2029,6 +2815,45 @@ msgstr "高ç‰è´¨é‡å°„线数" msgid "Ultra Quality Ray Count" msgstr "超级质é‡å°„线数" +msgid "Bake Performance" +msgstr "烘焙性能" + +msgid "Max Rays per Pass" +msgstr "æ¯ä¸ªé€šé“的最大射线数" + +msgid "Region Size" +msgstr "区å—大å°" + +msgid "Low Quality Probe Ray Count" +msgstr "低ç‰è´¨é‡æŽ¢é’ˆå°„线计数" + +msgid "Medium Quality Probe Ray Count" +msgstr "ä¸ç‰è´¨é‡æŽ¢é’ˆå°„线计数" + +msgid "High Quality Probe Ray Count" +msgstr "高ç‰è´¨é‡æŽ¢é’ˆå°„线计数" + +msgid "Ultra Quality Probe Ray Count" +msgstr "超高质é‡æŽ¢é’ˆå°„线计数" + +msgid "Max Rays per Probe Pass" +msgstr "探针æ¯ä¸ªé˜¶æ®µçš„最大射线数" + +msgid "Primitive Meshes" +msgstr "åŸºæœ¬ç½‘æ ¼" + +msgid "Texel Size" +msgstr "çº¹ç´ å¤§å°" + +msgid "BPM" +msgstr "BPM" + +msgid "Beat Count" +msgstr "节æ‹è®¡æ•°" + +msgid "Bar Beats" +msgstr "节æ‹" + msgid "Loop Offset" msgstr "循环å移" @@ -2050,6 +2875,33 @@ msgstr "K1" msgid "K2" msgstr "K2" +msgid "Spawnable Scenes" +msgstr "å¯å‡ºç”Ÿåœºæ™¯" + +msgid "Spawn Path" +msgstr "出生路径" + +msgid "Spawn Limit" +msgstr "出生é™åˆ¶" + +msgid "Root Path" +msgstr "æ ¹è·¯å¾„" + +msgid "Replication Interval" +msgstr "å¤åˆ¶é—´éš”" + +msgid "Visibility Update Mode" +msgstr "å¯è§æ€§æ›´æ–°æ¨¡å¼" + +msgid "Public Visibility" +msgstr "公共å¯è§æ€§" + +msgid "Auth Callback" +msgstr "认è¯å›žè°ƒ" + +msgid "Auth Timeout" +msgstr "认è¯è¶…æ—¶" + msgid "Allow Object Decoding" msgstr "å…许解ç 对象" @@ -2059,18 +2911,39 @@ msgstr "æ‹’ç»æ–°è¿žæŽ¥" msgid "Server Relay" msgstr "æœåŠ¡å™¨æŽ¥åŠ›" +msgid "Noise Type" +msgstr "噪声类型" + +msgid "Frequency" +msgstr "频率" + +msgid "Fractal" +msgstr "分形" + msgid "Octaves" msgstr "å€é¢‘" msgid "Lacunarity" -msgstr "缺项性" +msgstr "空隙度" msgid "Gain" msgstr "增益" +msgid "Ping Pong Strength" +msgstr "乒乓强度" + +msgid "Distance Function" +msgstr "è·ç¦»å‡½æ•°" + +msgid "Jitter" +msgstr "抖动" + msgid "Return Type" msgstr "返回类型" +msgid "Fractal Type" +msgstr "分形类型" + msgid "Width" msgstr "宽度" @@ -2092,6 +2965,15 @@ msgstr "é¢œè‰²æ˜ å°„" msgid "Noise" msgstr "噪声" +msgid "Localized Name" +msgstr "本地化å称" + +msgid "Action Type" +msgstr "动作类型" + +msgid "Interaction Profile Path" +msgstr "交互é…置路径" + msgid "Subject" msgstr "对象" @@ -2131,15 +3013,30 @@ msgstr "IGD 状æ€" msgid "Write Mode" msgstr "写模å¼" -msgid "Limits" -msgstr "é™åˆ¶" - msgid "WebRTC" msgstr "WebRTC" +msgid "Max Channel in Buffer (KB)" +msgstr "通é“最大缓冲区大å°ï¼ˆKB)" + +msgid "Supported Protocols" +msgstr "支æŒçš„åè®®" + +msgid "Handshake Headers" +msgstr "æ¡æ‰‹æ ‡å¤´" + +msgid "Inbound Buffer Size" +msgstr "入站缓冲区大å°" + +msgid "Outbound Buffer Size" +msgstr "出站缓冲区大å°" + msgid "Handshake Timeout" msgstr "æ¡æ‰‹è¶…æ—¶" +msgid "Max Queued Packets" +msgstr "最大排队数æ®åŒ…æ•°" + msgid "Session Mode" msgstr "会è¯æ¨¡å¼" @@ -2176,6 +3073,12 @@ msgstr "调试密钥库密ç " msgid "Force System User" msgstr "强制系统用户" +msgid "Shutdown ADB on Exit" +msgstr "é€€å‡ºæ—¶å…³é— ADB" + +msgid "One Click Deploy Clear Previous Install" +msgstr "一键部署并清除先å‰å®‰è£…" + msgid "Launcher Icons" msgstr "å¯åŠ¨å™¨å›¾æ ‡" @@ -2188,12 +3091,6 @@ msgstr "自适应å‰æ™¯ 432×432" msgid "Adaptive Background 432 X 432" msgstr "自适应背景 432×432" -msgid "Custom Build" -msgstr "自定义构建" - -msgid "Use Custom Build" -msgstr "使用自定义构建" - msgid "Export Format" msgstr "å¯¼å‡ºæ ¼å¼" @@ -2242,6 +3139,9 @@ msgstr "ç¾å" msgid "App Category" msgstr "App 分类" +msgid "Retain Data on Uninstall" +msgstr "å¸è½½æ—¶ä¿ç•™æ•°æ®" + msgid "Exclude From Recents" msgstr "从最近列表ä¸æŽ’除" @@ -2335,6 +3235,18 @@ msgstr "Spotlight 40×40" msgid "Spotlight 80 X 80" msgstr "Spotlight 80×80" +msgid "Settings 58 X 58" +msgstr "设置 58 X 58" + +msgid "Settings 87 X 87" +msgstr "设置 87 X 87" + +msgid "Notification 40 X 40" +msgstr "通知 40 X 40" + +msgid "Notification 60 X 60" +msgstr "通知 60 X 60" + msgid "Landscape Launch Screens" msgstr "横å±å¯åŠ¨ç”»é¢" @@ -2398,12 +3310,21 @@ msgstr "å‘布导出方法" msgid "Targeted Device Family" msgstr "ç›®æ ‡è®¾å¤‡æ—" +msgid "Bundle Identifier" +msgstr "æ†ç»‘åŒ…æ ‡è¯†ç¬¦" + msgid "Signature" msgstr "ç¾å" msgid "Short Version" msgstr "çŸç‰ˆæœ¬" +msgid "Icon Interpolation" +msgstr "å›¾æ ‡æ’值" + +msgid "Launch Screens Interpolation" +msgstr "å¯åŠ¨å±å¹•æ’值" + msgid "Capabilities" msgstr "能力" @@ -2428,12 +3349,21 @@ msgstr "éšç§" msgid "Camera Usage Description" msgstr "相机使用æè¿°" +msgid "Camera Usage Description Localized" +msgstr "相机使用æ述本地化" + msgid "Microphone Usage Description" msgstr "麦克风使用æè¿°" +msgid "Microphone Usage Description Localized" +msgstr "麦克风使用æ述本地化" + msgid "Photolibrary Usage Description" msgstr "照片图库使用æè¿°" +msgid "Photolibrary Usage Description Localized" +msgstr "照片图库使用æ述本地化" + msgid "Storyboard" msgstr "Storyboard" @@ -2458,15 +3388,33 @@ msgstr "自定义背景色" msgid "Architecture" msgstr "架构" +msgid "SSH Remote Deploy" +msgstr "SSH 远程部署" + +msgid "Extra Args SSH" +msgstr "é¢å¤– SSH å‚æ•°" + +msgid "Extra Args SCP" +msgstr "é¢å¤– SCP å‚æ•°" + +msgid "Run Script" +msgstr "è¿è¡Œè„šæœ¬" + +msgid "Cleanup Script" +msgstr "清ç†è„šæœ¬" + msgid "macOS" msgstr "macOS" -msgid "Icon" -msgstr "å›¾æ ‡" +msgid "rcodesign" +msgstr "rcodesign" msgid "Copyright" msgstr "版æƒ" +msgid "Copyright Localized" +msgstr "版æƒæœ¬åœ°åŒ–" + msgid "High Res" msgstr "高分辨率" @@ -2476,6 +3424,12 @@ msgstr "代ç ç¾å" msgid "Identity" msgstr "身份" +msgid "Certificate File" +msgstr "è¯ä¹¦æ–‡ä»¶" + +msgid "Certificate Password" +msgstr "è¯ä¹¦å¯†ç " + msgid "Entitlements" msgstr "授æƒ" @@ -2542,6 +3496,9 @@ msgstr "文件音ä¹" msgid "Files Movies" msgstr "文件影片" +msgid "Helper Executables" +msgstr "帮助程åº" + msgid "Custom Options" msgstr "自定义选项" @@ -2557,36 +3514,75 @@ msgstr "Apple ID 密ç " msgid "Apple Team ID" msgstr "Apple 团队 ID" +msgid "API UUID" +msgstr "API UUID" + +msgid "API Key" +msgstr "API 密钥" + +msgid "API Key ID" +msgstr "API 密钥 ID" + msgid "Location Usage Description" msgstr "ä½ç½®ä½¿ç”¨æè¿°" +msgid "Location Usage Description Localized" +msgstr "ä½ç½®ä½¿ç”¨æ述本地化" + msgid "Address Book Usage Description" msgstr "地å€ç°¿ä½¿ç”¨æè¿°" +msgid "Address Book Usage Description Localized" +msgstr "地å€ç°¿ä½¿ç”¨æ述本地化" + msgid "Calendar Usage Description" msgstr "日历使用æè¿°" +msgid "Calendar Usage Description Localized" +msgstr "日历使用æ述本地化" + msgid "Photos Library Usage Description" msgstr "照片图库使用æè¿°" +msgid "Photos Library Usage Description Localized" +msgstr "照片图库使用æ述本地化" + msgid "Desktop Folder Usage Description" msgstr "æ¡Œé¢æ–‡ä»¶å¤¹ä½¿ç”¨æè¿°" +msgid "Desktop Folder Usage Description Localized" +msgstr "æ¡Œé¢æ–‡ä»¶å¤¹ä½¿ç”¨æ述本地化" + msgid "Documents Folder Usage Description" msgstr "文档文件夹使用æè¿°" +msgid "Documents Folder Usage Description Localized" +msgstr "文档文件夹使用æ述本地化" + msgid "Downloads Folder Usage Description" msgstr "下载文件夹使用æè¿°" +msgid "Downloads Folder Usage Description Localized" +msgstr "下载文件夹使用æ述本地化" + msgid "Network Volumes Usage Description" msgstr "网络å·ä½¿ç”¨æè¿°" +msgid "Network Volumes Usage Description Localized" +msgstr "网络å·ä½¿ç”¨æ述本地化" + msgid "Removable Volumes Usage Description" -msgstr "å¯ç§»åŠ¨å·ä½¿ç”¨æè¿°" +msgstr "å¯ç§»é™¤å·ä½¿ç”¨æè¿°" + +msgid "Removable Volumes Usage Description Localized" +msgstr "å¯ç§»é™¤å·ä½¿ç”¨æ述本地化" msgid "UWP" msgstr "UWP" +msgid "signtool" +msgstr "signtool" + msgid "Debug Certificate" msgstr "调试è¯ä¹¦" @@ -2599,9 +3595,6 @@ msgstr "显示å称" msgid "Short Name" msgstr "çŸå称" -msgid "Description" -msgstr "æè¿°" - msgid "Publisher" msgstr "å‘行商" @@ -2669,7 +3662,16 @@ msgid "Splash Screen" msgstr "å¯åŠ¨å±å¹•" msgid "Tiles" -msgstr "ç£è´´" +msgstr "图å—" + +msgid "Show Name on Square 150 X 150" +msgstr "在æ£æ–¹å½¢ 150×150 上显示å称" + +msgid "Show Name on Wide 310 X 150" +msgstr "在长方形 310×150 上显示å称" + +msgid "Show Name on Square 310 X 310" +msgstr "在æ£æ–¹å½¢ 310×310 上显示å称" msgid "Web" msgstr "Web" @@ -2680,9 +3682,21 @@ msgstr "HTTP 主机" msgid "HTTP Port" msgstr "HTTP 端å£" +msgid "Use TLS" +msgstr "使用 TLS" + +msgid "TLS Key" +msgstr "TLS 密钥" + +msgid "TLS Certificate" +msgstr "TLS è¯ä¹¦" + msgid "Variant" msgstr "å˜ä½“" +msgid "Extensions Support" +msgstr "扩展支æŒ" + msgid "VRAM Texture Compression" msgstr "VRAM 纹ç†åŽ‹ç¼©" @@ -2707,6 +3721,9 @@ msgstr "头部包å«" msgid "Canvas Resize Policy" msgstr "画布大å°æ”¹å˜ç–ç•¥" +msgid "Focus Canvas on Start" +msgstr "å¯åŠ¨æ—¶èšç„¦ç”»å¸ƒ" + msgid "Experimental Virtual Keyboard" msgstr "实验性虚拟键盘" @@ -2728,6 +3745,15 @@ msgstr "å›¾æ ‡ 512×512" msgid "Windows" msgstr "Windows" +msgid "rcedit" +msgstr "rcedit" + +msgid "osslsigncode" +msgstr "osslsigncode" + +msgid "wine" +msgstr "wine" + msgid "Identity Type" msgstr "身份类型" @@ -2743,6 +3769,9 @@ msgstr "摘è¦ç®—法" msgid "Modify Resources" msgstr "修改资æº" +msgid "Console Wrapper Icon" +msgstr "控制å°å°è£…å›¾æ ‡" + msgid "File Version" msgstr "文件版本" @@ -2761,18 +3790,12 @@ msgstr "文件æè¿°" msgid "Trademarks" msgstr "å•†æ ‡" -msgid "Frames" -msgstr "帧" - msgid "Frame" msgstr "帧å·" msgid "Speed Scale" msgstr "速度缩放" -msgid "Playing" -msgstr "æ£åœ¨æ’放" - msgid "Centered" msgstr "å±…ä¸" @@ -2797,6 +3820,9 @@ msgstr "空间覆盖" msgid "Point" msgstr "点" +msgid "Point Center" +msgstr "点ä¸å¿ƒ" + msgid "Direction" msgstr "æ–¹å‘" @@ -2818,6 +3844,9 @@ msgstr "音é‡åˆ†è´" msgid "Pitch Scale" msgstr "音高缩放" +msgid "Playing" +msgstr "æ£åœ¨æ’放" + msgid "Autoplay" msgstr "自动æ’放" @@ -2830,6 +3859,12 @@ msgstr "最大è·ç¦»" msgid "Attenuation" msgstr "è¡°å‡" +msgid "Max Polyphony" +msgstr "最大å¤éŸ³æ•°" + +msgid "Panning Strength" +msgstr "平移强度" + msgid "Bus" msgstr "总线" @@ -2842,17 +3877,23 @@ msgstr "å¤åˆ¶æ¨¡å¼" msgid "Anchor Mode" msgstr "锚点模å¼" +msgid "Ignore Rotation" +msgstr "忽略旋转" + msgid "Custom Viewport" msgstr "自定义视å£" +msgid "Process Callback" +msgstr "处ç†å›žè°ƒ" + msgid "Left" -msgstr "左侧" +msgstr "å·¦" msgid "Top" msgstr "顶部" msgid "Right" -msgstr "å³ä¾§" +msgstr "å³" msgid "Bottom" msgstr "底部" @@ -2860,18 +3901,48 @@ msgstr "底部" msgid "Smoothed" msgstr "平滑" +msgid "Follow Smoothing" +msgstr "è·Ÿéšå¹³æ»‘" + +msgid "Position Smoothing Enabled" +msgstr "å¯ç”¨ä½ç½®å¹³æ»‘" + +msgid "Position Smoothing Speed" +msgstr "ä½ç½®å¹³æ»‘速度" + +msgid "Rotation Smoothing" +msgstr "旋转平滑" + msgid "Speed" msgstr "速度" +msgid "Drag" +msgstr "拖动" + msgid "Horizontal Enabled" msgstr "å¯ç”¨æ°´å¹³" msgid "Vertical Enabled" msgstr "å¯ç”¨åž‚ç›´" +msgid "Horizontal Offset" +msgstr "æ°´å¹³å移" + +msgid "Vertical Offset" +msgstr "åž‚ç›´å移" + +msgid "Left Margin" +msgstr "左边è·" + msgid "Top Margin" msgstr "顶边è·" +msgid "Right Margin" +msgstr "å³è¾¹è·" + +msgid "Bottom Margin" +msgstr "底边è·" + msgid "Draw Screen" msgstr "绘制å±å¹•" @@ -2884,9 +3955,18 @@ msgstr "绘制拖拽边è·" msgid "Tweaks" msgstr "调整" +msgid "Fit Margin" +msgstr "适åˆè¾¹è·" + +msgid "Clear Margin" +msgstr "清除边è·" + msgid "Use Mipmaps" msgstr "使用 Mipmap" +msgid "Disable Mode" +msgstr "ç¦ç”¨æ¨¡å¼" + msgid "Input" msgstr "输入" @@ -2905,6 +3985,9 @@ msgstr "å•å‘碰撞" msgid "One Way Collision Margin" msgstr "å•å‘碰撞边è·" +msgid "Debug Color" +msgstr "调试颜色" + msgid "Emitting" msgstr "å‘å°„" @@ -2965,6 +4048,9 @@ msgstr "法线" msgid "Colors" msgstr "颜色" +msgid "Particle Flags" +msgstr "ç²’åæ ‡å¿—" + msgid "Align Y" msgstr "å¯¹é½ Y" @@ -2974,6 +4060,12 @@ msgstr "å‘æ•£" msgid "Initial Velocity" msgstr "åˆé€Ÿåº¦" +msgid "Velocity Min" +msgstr "最å°é€Ÿåº¦" + +msgid "Velocity Max" +msgstr "最大速度" + msgid "Angular Velocity" msgstr "角速度" @@ -2986,6 +4078,12 @@ msgstr "环绕速度" msgid "Linear Accel" msgstr "çº¿æ€§åŠ é€Ÿåº¦" +msgid "Accel Min" +msgstr "最å°åŠ 速度" + +msgid "Accel Max" +msgstr "æœ€å¤§åŠ é€Ÿåº¦" + msgid "Accel Curve" msgstr "åŠ é€Ÿåº¦æ›²çº¿" @@ -2998,6 +4096,12 @@ msgstr "切å‘åŠ é€Ÿåº¦" msgid "Damping" msgstr "阻尼" +msgid "Damping Min" +msgstr "最å°é˜»å°¼" + +msgid "Damping Max" +msgstr "最大阻尼" + msgid "Damping Curve" msgstr "阻尼曲线" @@ -3013,30 +4117,75 @@ msgstr "最大角度" msgid "Angle Curve" msgstr "角度曲线" +msgid "Scale Amount Min" +msgstr "最å°ç¼©æ”¾é‡" + +msgid "Scale Amount Max" +msgstr "最大缩放é‡" + msgid "Scale Amount Curve" msgstr "缩放é‡æ›²çº¿" +msgid "Split Scale" +msgstr "拆分缩放" + +msgid "Scale Curve X" +msgstr "缩放曲线 X" + +msgid "Scale Curve Y" +msgstr "缩放曲线 Y" + msgid "Color Initial Ramp" msgstr "颜色åˆå§‹æ˜ å°„" msgid "Hue Variation" msgstr "色相å˜åŒ–" +msgid "Variation Min" +msgstr "最å°å˜åŒ–" + +msgid "Variation Max" +msgstr "最大å˜åŒ–" + msgid "Variation Curve" msgstr "å˜åŒ–曲线" +msgid "Speed Min" +msgstr "最å°é€Ÿåº¦" + +msgid "Speed Max" +msgstr "最大速度" + msgid "Speed Curve" msgstr "速度曲线" +msgid "Offset Min" +msgstr "最å°å移" + +msgid "Offset Max" +msgstr "最大å移" + msgid "Offset Curve" msgstr "å移曲线" +msgid "Sub Emitter" +msgstr "åå‘射器" + msgid "Process Material" msgstr "处ç†æè´¨" +msgid "Interpolate" +msgstr "æ’值" + +msgid "Base Size" +msgstr "基本大å°" + msgid "Visibility Rect" msgstr "å¯è§çŸ©å½¢" +msgid "Trails" +msgstr "尾迹" + msgid "Node A" msgstr "节点 A" @@ -3103,6 +4252,12 @@ msgstr "å…³é—" msgid "Cull Mode" msgstr "剔除模å¼" +msgid "SDF Collision" +msgstr "SDF 碰撞" + +msgid "Occluder Light Mask" +msgstr "é®æŒ¡å™¨å…‰ç…§æŽ©ç " + msgid "Width Curve" msgstr "宽度曲线" @@ -3163,6 +4318,9 @@ msgstr "路径最大è·ç¦»" msgid "Navigation Layers" msgstr "导航层" +msgid "Path Metadata Flags" +msgstr "路径元数æ®æ ‡å¿—" + msgid "Avoidance" msgstr "é¿éšœ" @@ -3178,6 +4336,12 @@ msgstr "时间下é™" msgid "Max Speed" msgstr "最大速度" +msgid "Bidirectional" +msgstr "åŒå‘çš„" + +msgid "Start Position" +msgstr "开始ä½ç½®" + msgid "Enter Cost" msgstr "进入消耗" @@ -3187,8 +4351,8 @@ msgstr "移动消耗" msgid "Estimate Radius" msgstr "ä¼°ç®—åŠå¾„" -msgid "Transform" -msgstr "å˜æ¢" +msgid "Navigation Polygon" +msgstr "导航多边形" msgid "Rotation Degrees" msgstr "旋转角度" @@ -3205,6 +4369,9 @@ msgstr "全局旋转角度" msgid "Global Scale" msgstr "全局缩放" +msgid "Global Skew" +msgstr "全局倾斜" + msgid "Global Transform" msgstr "全局å˜æ¢" @@ -3238,18 +4405,39 @@ msgstr "曲线" msgid "Progress" msgstr "进度" +msgid "Progress Ratio" +msgstr "进度比率" + msgid "H Offset" msgstr "æ°´å¹³å移" msgid "V Offset" msgstr "åž‚ç›´å移" +msgid "Rotates" +msgstr "旋转" + msgid "Cubic Interp" msgstr "三次æ’值" msgid "Lookahead" msgstr "æå‰é‡" +msgid "Bone 2D Nodepath" +msgstr "骨骼 2D 节点路径" + +msgid "Bone 2D Index" +msgstr "骨骼 2D 索引" + +msgid "Auto Configure Joint" +msgstr "自动é…置关节" + +msgid "Simulate Physics" +msgstr "模拟物ç†" + +msgid "Follow Bone When Simulating" +msgstr "模拟时跟éšéª¨éª¼" + msgid "Physics Material Override" msgstr "物ç†æ质覆盖" @@ -3259,12 +4447,21 @@ msgstr "常线速度" msgid "Constant Angular Velocity" msgstr "常角速度" +msgid "Sync to Physics" +msgstr "åŒæ¥åˆ°ç‰©ç†" + msgid "Mass" msgstr "è´¨é‡" msgid "Inertia" msgstr "惯性" +msgid "Center of Mass Mode" +msgstr "质心模å¼" + +msgid "Center of Mass" +msgstr "质心" + msgid "Gravity Scale" msgstr "é‡åŠ›ç¼©æ”¾" @@ -3274,6 +4471,9 @@ msgstr "自定义集æˆå™¨" msgid "Continuous CD" msgstr "è¿žç»ç¢°æ’žæ£€æµ‹" +msgid "Max Contacts Reported" +msgstr "报告的最大接触" + msgid "Contact Monitor" msgstr "接触监视器" @@ -3283,24 +4483,75 @@ msgstr "ç¡çœ " msgid "Can Sleep" msgstr "å¯ä»¥ç¡çœ " +msgid "Lock Rotation" +msgstr "é”定旋转" + +msgid "Freeze" +msgstr "冻结" + +msgid "Freeze Mode" +msgstr "冻结模å¼" + msgid "Linear" msgstr "线性" +msgid "Damp Mode" +msgstr "阻尼模å¼" + msgid "Damp" msgstr "阻尼" msgid "Angular" msgstr "角" +msgid "Constant Forces" +msgstr "æ’力" + msgid "Torque" msgstr "力矩" +msgid "Motion Mode" +msgstr "è¿åŠ¨æ¨¡å¼" + +msgid "Up Direction" +msgstr "å‘上方å‘" + +msgid "Slide on Ceiling" +msgstr "在天花æ¿ä¸Šæ»‘动" + +msgid "Wall Min Slide Angle" +msgstr "墙体最å°æ»‘动角度" + +msgid "Floor" +msgstr "地é¢" + +msgid "Stop on Slope" +msgstr "在斜å¡ä¸Šåœæ¢" + +msgid "Constant Speed" +msgstr "æ’定速度" + +msgid "Block on Wall" +msgstr "阻æ¢ä¸Šå¢™" + msgid "Max Angle" msgstr "最大角" +msgid "Snap Length" +msgstr "å¸é™„长度" + msgid "Moving Platform" msgstr "å¯ç§»åŠ¨å¹³å°" +msgid "On Leave" +msgstr "离开时" + +msgid "Floor Layers" +msgstr "地é¢å±‚" + +msgid "Wall Layers" +msgstr "墙体层" + msgid "Safe Margin" msgstr "安全边è·" @@ -3319,6 +4570,9 @@ msgstr "内部顶点数" msgid "Exclude Parent" msgstr "排除父节点" +msgid "Target Position" +msgstr "ç›®æ ‡ä½ç½®" + msgid "Collide With" msgstr "å‚与碰撞" @@ -3340,12 +4594,27 @@ msgstr "æ›´æ–°" msgid "Margin" msgstr "è¾¹è·" +msgid "Max Results" +msgstr "最大结果" + +msgid "Auto Calculate Length and Angle" +msgstr "自动计算长度和角度" + +msgid "Bone Angle" +msgstr "骨骼角度" + msgid "Editor Settings" msgstr "编辑器设置" +msgid "Show Bone Gizmo" +msgstr "显示骨骼å°å·¥å…·" + msgid "Rest" msgstr "放æ¾" +msgid "Modification Stack" +msgstr "ä¿®æ”¹å †æ ˆ" + msgid "Hframes" msgstr "水平帧数" @@ -3358,12 +4627,33 @@ msgstr "帧åæ ‡" msgid "Region" msgstr "区域" +msgid "Filter Clip Enabled" +msgstr "å¯ç”¨è¿‡æ»¤è£å‰ª" + msgid "Tile Set" msgstr "图å—集" +msgid "Cell Quadrant Size" +msgstr "å•å…ƒæ ¼è±¡é™å¤§å°" + +msgid "Collision Animatable" +msgstr "碰撞å¯åŠ¨ç”»åŒ–" + +msgid "Collision Visibility Mode" +msgstr "碰撞å¯è§æ€§æ¨¡å¼" + +msgid "Navigation Visibility Mode" +msgstr "导航å¯è§æ€§æ¨¡å¼" + msgid "Layers" msgstr "层" +msgid "Texture Normal" +msgstr "法线纹ç†" + +msgid "Texture Pressed" +msgstr "按下纹ç†" + msgid "Bitmask" msgstr "掩ç " @@ -3382,6 +4672,18 @@ msgstr "å¯è§æ¨¡å¼" msgid "Node Path" msgstr "节点路径" +msgid "Wind" +msgstr "风" + +msgid "Force Magnitude" +msgstr "力é‡å¤§å°" + +msgid "Attenuation Factor" +msgstr "è¡°å‡ç³»æ•°" + +msgid "Source Path" +msgstr "æ¥æºè·¯å¾„" + msgid "Reverb Bus" msgstr "æ··å“总线" @@ -3424,12 +4726,21 @@ msgstr "跟踪" msgid "Bone Name" msgstr "骨骼å称" +msgid "Bone Idx" +msgstr "骨骼索引" + +msgid "Override Pose" +msgstr "覆盖姿势" + msgid "Keep Aspect" msgstr "ä¿æŒé•¿å®½æ¯”" msgid "Cull Mask" msgstr "剔除é®ç½©" +msgid "Attributes" +msgstr "属性" + msgid "Doppler Tracking" msgstr "多普勒跟踪" @@ -3448,6 +4759,9 @@ msgstr "Far" msgid "Ray Pickable" msgstr "射线å¯æ‹¾å–" +msgid "Capture on Drag" +msgstr "拖拽时æ•èŽ·" + msgid "Box Extents" msgstr "ç›’å范围" @@ -3472,14 +4786,17 @@ msgstr "ç¦ç”¨ Z" msgid "Flatness" msgstr "æ‰å¹³åº¦" -msgid "Extents" -msgstr "范围" +msgid "Scale Curve Z" +msgstr "缩放曲线 Z" msgid "Albedo" msgstr "å照率" msgid "Normal" -msgstr "æ£å¸¸" +msgstr "法线" + +msgid "Orm" +msgstr "Orm" msgid "Emission" msgstr "自å‘å…‰" @@ -3487,15 +4804,33 @@ msgstr "自å‘å…‰" msgid "Parameters" msgstr "å‚æ•°" +msgid "Emission Energy" +msgstr "自å‘光能é‡" + msgid "Modulate" msgstr "调制" +msgid "Albedo Mix" +msgstr "å照率混åˆ" + +msgid "Normal Fade" +msgstr "法线淡化" + +msgid "Vertical Fade" +msgstr "垂直淡化" + msgid "Distance Fade" msgstr "è·ç¦»æ·¡å‡º" +msgid "Begin" +msgstr "起点" + msgid "Visibility AABB" msgstr "å¯è§æ€§ AABB" +msgid "Transform Align" +msgstr "å˜æ¢å¯¹é½" + msgid "Draw Passes" msgstr "绘制阶段" @@ -3505,9 +4840,24 @@ msgstr "阶段" msgid "Thickness" msgstr "粗细" +msgid "Bake Mask" +msgstr "烘焙é®ç½©" + msgid "Update Mode" msgstr "更新模å¼" +msgid "Follow Camera Enabled" +msgstr "å¯ç”¨è·Ÿéšç›¸æœº" + +msgid "Directionality" +msgstr "æ–¹å‘性" + +msgid "Skeleton Path" +msgstr "骨架路径" + +msgid "Solver Priority" +msgstr "求解器优先级" + msgid "Params" msgstr "å‚æ•°" @@ -3580,15 +4930,27 @@ msgstr "Y" msgid "Z" msgstr "Z" +msgid "Linear Motor" +msgstr "线性马达" + msgid "Force Limit" msgstr "力度é™åˆ¶" +msgid "Linear Spring" +msgstr "线性弹簧" + msgid "Equilibrium Point" msgstr "平衡点" msgid "ERP" msgstr "ERP" +msgid "Angular Motor" +msgstr "角度马达" + +msgid "Angular Spring" +msgstr "角度弹簧" + msgid "Pixel Size" msgstr "åƒç´ 大å°" @@ -3616,6 +4978,15 @@ msgstr "Alpha 切除" msgid "Alpha Scissor Threshold" msgstr "Alpha è£å‰ªé˜ˆå€¼" +msgid "Alpha Antialiasing Mode" +msgstr "Alpha 抗锯齿模å¼" + +msgid "Alpha Antialiasing Edge" +msgstr "边缘 Alpha 抗锯齿" + +msgid "Texture Filter" +msgstr "纹ç†è¿‡æ»¤å™¨" + msgid "Render Priority" msgstr "渲染优先级" @@ -3640,9 +5011,42 @@ msgstr "垂直对é½" msgid "Uppercase" msgstr "大写" +msgid "Autowrap Mode" +msgstr "自动æ¢è¡Œæ¨¡å¼" + +msgid "BiDi" +msgstr "BiDi" + +msgid "Text Direction" +msgstr "文本方å‘" + +msgid "Structured Text BiDi Override" +msgstr "结构化文本 BiDi 覆盖" + +msgid "Structured Text BiDi Override Options" +msgstr "结构化文本 BiDi 覆盖选项" + +msgid "Intensity Lumens" +msgstr "强度æµæ˜Ž" + +msgid "Intensity Lux" +msgstr "强度勒克斯" + +msgid "Temperature" +msgstr "温度" + msgid "Indirect Energy" msgstr "间接能é‡" +msgid "Volumetric Fog Energy" +msgstr "体积雾能é‡" + +msgid "Projector" +msgstr "投影" + +msgid "Angular Distance" +msgstr "角度è·ç¦»" + msgid "Negative" msgstr "逆转" @@ -3679,6 +5083,15 @@ msgstr "拆分 3" msgid "Blend Splits" msgstr "æ··åˆæ‹†åˆ†" +msgid "Fade Start" +msgstr "淡化起点" + +msgid "Pancake Size" +msgstr "Pancake 大å°" + +msgid "Sky Mode" +msgstr "天空模å¼" + msgid "Omni" msgstr "å…¨å‘" @@ -3691,18 +5104,27 @@ msgstr "èšå…‰" msgid "Angle Attenuation" msgstr "角度衰å‡" +msgid "Light Texture" +msgstr "ç¯å…‰çº¹ç†" + msgid "Quality" msgstr "è´¨é‡" msgid "Bounces" msgstr "弹射" +msgid "Directional" +msgstr "定å‘" + msgid "Interior" msgstr "内部" msgid "Use Denoiser" msgstr "使用é™å™ªå™¨" +msgid "Max Texture Size" +msgstr "最大纹ç†å¤§å°" + msgid "Custom Sky" msgstr "自定义天空" @@ -3712,27 +5134,60 @@ msgstr "自定义颜色" msgid "Custom Energy" msgstr "自定义能é‡" +msgid "Camera Attributes" +msgstr "相机属性" + msgid "Subdiv" msgstr "细分" msgid "Light Data" msgstr "光照数æ®" +msgid "Surface Material Override" +msgstr "表é¢æ质覆盖" + msgid "Agent Height Offset" msgstr "代ç†é«˜åº¦å移" msgid "Ignore Y" msgstr "忽略 Y" +msgid "Navigation Mesh" +msgstr "å¯¼èˆªç½‘æ ¼" + +msgid "Quaternion" +msgstr "四元数" + +msgid "Basis" +msgstr "基" + +msgid "Rotation Edit Mode" +msgstr "旋转编辑模å¼" + +msgid "Rotation Order" +msgstr "旋转顺åº" + +msgid "Top Level" +msgstr "顶层" + msgid "Visibility" msgstr "å¯è§æ€§" msgid "Visible" msgstr "å¯è§" +msgid "Visibility Parent" +msgstr "å¯è§æ€§çˆ¶çº§" + +msgid "Bake" +msgstr "烘焙" + msgid "Rotation Mode" msgstr "旋转模å¼" +msgid "Tilt Enabled" +msgstr "å¯ç”¨å€¾æ–œ" + msgid "Axis Lock" msgstr "è½´é”定" @@ -3844,6 +5299,12 @@ msgstr "摩擦" msgid "Bounce" msgstr "åå¼¹" +msgid "Linear Damp Mode" +msgstr "线性阻尼模å¼" + +msgid "Angular Damp Mode" +msgstr "角度阻尼模å¼" + msgid "Linear Velocity" msgstr "线性速度" @@ -3859,9 +5320,24 @@ msgstr "盒投影" msgid "Enable Shadows" msgstr "å¯ç”¨é˜´å½±" +msgid "Mesh LOD Threshold" +msgstr "ç½‘æ ¼ LOD 阈值" + +msgid "Ambient" +msgstr "环境" + +msgid "Color Energy" +msgstr "色彩能é‡" + msgid "Bones" msgstr "骨骼" +msgid "Show Rest Only" +msgstr "仅显示放æ¾" + +msgid "Animate Physical Bones" +msgstr "动画物ç†éª¨éª¼" + msgid "Root Bone" msgstr "æ ¹éª¨éª¼" @@ -3940,6 +5416,15 @@ msgstr "刹车" msgid "Steering" msgstr "æ–¹å‘控制" +msgid "VehicleBody3D Motion" +msgstr "VehicleBody3D è¿åŠ¨" + +msgid "Use as Traction" +msgstr "用作牵引" + +msgid "Use as Steering" +msgstr "用作转å‘" + msgid "Wheel" msgstr "车轮" @@ -3979,6 +5464,9 @@ msgstr "æ质覆盖" msgid "Material Overlay" msgstr "æ质覆盖层" +msgid "Transparency" +msgstr "é€æ˜Ž" + msgid "Cast Shadow" msgstr "投射阴影" @@ -3988,11 +5476,32 @@ msgstr "é¢å¤–剔除边è·" msgid "Custom AABB" msgstr "自定义 AABB" +msgid "LOD Bias" +msgstr "LOD åå·®" + +msgid "Ignore Occlusion Culling" +msgstr "忽略é®æŒ¡å‰”除" + +msgid "Global Illumination" +msgstr "全局照明" + msgid "Lightmap Scale" msgstr "光照贴图缩放" +msgid "Visibility Range" +msgstr "能è§åº¦èŒƒå›´" + +msgid "Begin Margin" +msgstr "起始边è·" + msgid "End" -msgstr "结æŸ" +msgstr "行尾" + +msgid "End Margin" +msgstr "结æŸè¾¹è·" + +msgid "Fade Mode" +msgstr "淡化模å¼" msgid "Dynamic Range" msgstr "动æ€èŒƒå›´" @@ -4000,12 +5509,21 @@ msgstr "动æ€èŒƒå›´" msgid "Propagation" msgstr "ä¼ æ’" +msgid "Use Two Bounces" +msgstr "使用二次åå¼¹" + +msgid "Tracker" +msgstr "追踪器" + msgid "Pose" msgstr "姿势" msgid "World Scale" msgstr "世界缩放" +msgid "Play Mode" +msgstr "æ’放模å¼" + msgid "Sync" msgstr "åŒæ¥" @@ -4033,8 +5551,11 @@ msgstr "éšæœºå»¶è¿Ÿ" msgid "Xfade Time" msgstr "淡入淡出时间" -msgid "Reset" -msgstr "é‡ç½®" +msgid "Xfade Curve" +msgstr "淡入淡出曲线" + +msgid "Request" +msgstr "请求" msgid "Active" msgstr "激活" @@ -4045,8 +5566,17 @@ msgstr "å åŠ é‡" msgid "Blend Amount" msgstr "æ··åˆé‡" -msgid "Seek Position" -msgstr "寻é“ä½ç½®" +msgid "Current Index" +msgstr "当å‰ç´¢å¼•" + +msgid "Current State" +msgstr "当å‰çŠ¶æ€" + +msgid "Transition Request" +msgstr "过渡请求" + +msgid "Reset" +msgstr "é‡ç½®" msgid "Switch" msgstr "切æ¢" @@ -4054,6 +5584,9 @@ msgstr "切æ¢" msgid "Switch Mode" msgstr "切æ¢æ¨¡å¼" +msgid "Advance" +msgstr "å‰è¿›" + msgid "Condition" msgstr "æ¡ä»¶" @@ -4069,6 +5602,9 @@ msgstr "当å‰åŠ¨ç”»" msgid "Assigned Animation" msgstr "分é…动画" +msgid "Reset on Save" +msgstr "ä¿å˜æ—¶é‡ç½®" + msgid "Current Animation Length" msgstr "当å‰åŠ¨ç”»é•¿åº¦" @@ -4087,12 +5623,18 @@ msgstr "默认混åˆæ—¶é—´" msgid "Method Call Mode" msgstr "方法调用模å¼" +msgid "Movie Quit on Finish" +msgstr "结æŸæ—¶é€€å‡ºç”µå½±" + msgid "Tree Root" msgstr "æ ‘æ ¹" msgid "Anim Player" msgstr "动画æ’放器" +msgid "Advance Expression Base Node" +msgstr "å‰è¿›è¡¨è¾¾å¼åŸºç¡€èŠ‚点" + msgid "Root Motion" msgstr "æ ¹è¿åŠ¨" @@ -4129,42 +5671,177 @@ msgstr "外部ä¿æŒæŒ‰ä¸‹" msgid "Button Group" msgstr "按钮组" +msgid "Shortcut Feedback" +msgstr "å¿«æ·é”®å馈" + +msgid "Shortcut in Tooltip" +msgstr "工具æ示显示快æ·é”®" + +msgid "Text Overrun Behavior" +msgstr "文本超é™è¡Œä¸º" + msgid "Clip Text" msgstr "è£å‰ªæ–‡æœ¬" +msgid "Icon Alignment" +msgstr "å›¾æ ‡å¯¹é½" + msgid "Expand Icon" msgstr "æ‰©å±•å›¾æ ‡" msgid "Use Top Left" msgstr "使用左上角" +msgid "Symbol Lookup on Click" +msgstr "点击查询符å·" + +msgid "Line Folding" +msgstr "折å è¡Œ" + +msgid "Line Length Guidelines" +msgstr "行长度å‚考线" + +msgid "Draw Breakpoints Gutter" +msgstr "绘制æ–点æ " + +msgid "Draw Bookmarks" +msgstr "绘制书ç¾" + +msgid "Draw Executing Lines" +msgstr "绘制执行行" + +msgid "Draw Line Numbers" +msgstr "绘制行å·" + +msgid "Zero Pad Line Numbers" +msgstr "è¡Œå·ç”¨é›¶å¡«å……" + +msgid "Draw Fold Gutter" +msgstr "绘制折å æ " + +msgid "Delimiters" +msgstr "分隔符" + +msgid "Comments" +msgstr "注释" + +msgid "Code Completion" +msgstr "代ç 补全" + +msgid "Prefixes" +msgstr "å‰ç¼€" + +msgid "Indentation" +msgstr "缩进" + +msgid "Use Spaces" +msgstr "ä½¿ç”¨ç©ºæ ¼" + +msgid "Automatic" +msgstr "自动" + +msgid "Automatic Prefixes" +msgstr "自动å‰ç¼€" + +msgid "Auto Brace Completion" +msgstr "自动补全大括å·" + +msgid "Highlight Matching" +msgstr "高亮匹é…项" + msgid "Edit Alpha" msgstr "编辑 Alpha" +msgid "Color Mode" +msgstr "颜色模å¼" + msgid "Deferred Mode" msgstr "延迟模å¼" +msgid "Picker Shape" +msgstr "拾å–器形状" + +msgid "Can Add Swatches" +msgstr "å¯æ·»åŠ 色æ¿" + +msgid "Customization" +msgstr "自定义" + +msgid "Sampler Visible" +msgstr "é‡‡æ ·å™¨å¯è§" + +msgid "Color Modes Visible" +msgstr "颜色模å¼å¯è§" + +msgid "Sliders Visible" +msgstr "滑动æ¡å¯è§" + +msgid "Hex Visible" +msgstr "åå…进制å¯è§" + msgid "Presets Visible" msgstr "预设å¯è§" +msgid "Clip Contents" +msgstr "è£å‰ªå†…容" + +msgid "Custom Minimum Size" +msgstr "自定义最å°å°ºå¯¸" + +msgid "Layout Direction" +msgstr "布局方å‘" + +msgid "Layout Mode" +msgstr "布局模å¼" + +msgid "Anchors Preset" +msgstr "锚点预设" + +msgid "Anchor Points" +msgstr "锚点" + +msgid "Anchor Offsets" +msgstr "锚点å移" + msgid "Grow Direction" msgstr "伸长方å‘" msgid "Pivot Offset" msgstr "轴心å移" +msgid "Container Sizing" +msgstr "容器大å°" + msgid "Stretch Ratio" msgstr "拉伸比例" msgid "Localization" msgstr "本地化" +msgid "Auto Translate" +msgstr "自动翻译" + +msgid "Localize Numeral System" +msgstr "本地化数å—系统" + msgid "Tooltip" msgstr "工具æ示" msgid "Focus" msgstr "èšç„¦" +msgid "Neighbor Left" +msgstr "左邻" + +msgid "Neighbor Top" +msgstr "上邻" + +msgid "Neighbor Right" +msgstr "å³é‚»" + +msgid "Neighbor Bottom" +msgstr "下邻" + msgid "Next" msgstr "下一个" @@ -4174,18 +5851,42 @@ msgstr "上一个" msgid "Mouse" msgstr "é¼ æ ‡" +msgid "Force Pass Scroll Events" +msgstr "å¼ºåˆ¶ä¼ é€’æ»šåŠ¨äº‹ä»¶" + msgid "Default Cursor Shape" msgstr "é»˜è®¤å…‰æ ‡å½¢çŠ¶" +msgid "Shortcut Context" +msgstr "å¿«æ·é”®ä¸Šä¸‹æ–‡" + +msgid "Type Variation" +msgstr "类型å˜ç§" + +msgid "OK Button Text" +msgstr "确定按钮文本" + msgid "Dialog" msgstr "对è¯æ¡†" +msgid "Hide on OK" +msgstr "确定时éšè—" + +msgid "Close on Escape" +msgstr "ESC 时关é—" + msgid "Autowrap" msgstr "自动æ¢è¡Œ" +msgid "Cancel Button Text" +msgstr "å–消按钮文本" + msgid "Mode Overrides Title" msgstr "模å¼è¦†ç›–æ ‡é¢˜" +msgid "Root Subfolder" +msgstr "æ ¹éƒ¨å文件夹" + msgid "Filters" msgstr "过滤" @@ -4201,6 +5902,15 @@ msgstr "å¸é™„è·ç¦»" msgid "Use Snap" msgstr "使用å¸é™„" +msgid "Panning Scheme" +msgstr "平移方案" + +msgid "Connection Lines" +msgstr "连接线" + +msgid "Curvature" +msgstr "曲率" + msgid "Zoom Min" msgstr "缩放下é™" @@ -4213,12 +5923,27 @@ msgstr "缩放æ¥é•¿" msgid "Show Zoom Label" msgstr "æ˜¾ç¤ºç¼©æ”¾æ ‡ç¾" +msgid "UI" +msgstr "UI" + +msgid "Arrange Nodes Button Hidden" +msgstr "éšè—排列节点按钮" + msgid "Title" msgstr "æ ‡é¢˜" +msgid "Position Offset" +msgstr "ä½ç½®å移" + msgid "Show Close" msgstr "显示关é—" +msgid "Draggable" +msgstr "å¯æ‹–动" + +msgid "Selectable" +msgstr "å¯é€‰æ‹©" + msgid "Selected" msgstr "选ä¸" @@ -4264,6 +5989,12 @@ msgstr "å›¾æ ‡ç¼©æ”¾" msgid "Fixed Icon Size" msgstr "å›ºå®šå›¾æ ‡å¤§å°" +msgid "Label Settings" +msgstr "æ ‡ç¾è®¾ç½®" + +msgid "Displayed Text" +msgstr "文本显示" + msgid "Lines Skipped" msgstr "跳过行数" @@ -4273,6 +6004,15 @@ msgstr "最大å¯è§è¡Œæ•°" msgid "Visible Characters" msgstr "å¯è§å—符" +msgid "Visible Characters Behavior" +msgstr "å¯è§å—符行为" + +msgid "Visible Ratio" +msgstr "å¯è§æ¯”例" + +msgid "Placeholder Text" +msgstr "å ä½ç¬¦æ–‡æœ¬" + msgid "Max Length" msgstr "最大长度" @@ -4282,12 +6022,18 @@ msgstr "秘密" msgid "Secret Character" msgstr "秘密å—符" +msgid "Expand to Text Length" +msgstr "扩展至文本长度" + msgid "Context Menu Enabled" msgstr "上下文èœå•å¯ç”¨" msgid "Virtual Keyboard Enabled" msgstr "虚拟键盘å¯ç”¨" +msgid "Virtual Keyboard Type" +msgstr "虚拟键盘类型" + msgid "Clear Button Enabled" msgstr "清除按钮å¯ç”¨" @@ -4300,15 +6046,48 @@ msgstr "é¼ æ ‡ä¸é”®ç²˜è´´å¯ç”¨" msgid "Selecting Enabled" msgstr "选择å¯ç”¨" +msgid "Deselect on Focus Loss Enabled" +msgstr "焦点丢失时å–消选择å¯ç”¨" + msgid "Right Icon" msgstr "å³ä¾§å›¾æ ‡" +msgid "Draw Control Chars" +msgstr "绘制控制å—符" + +msgid "Select All on Focus" +msgstr "èšç„¦æ—¶å…¨é€‰" + msgid "Blink" msgstr "é—ªçƒ" +msgid "Blink Interval" +msgstr "é—ªçƒé—´éš”" + +msgid "Column" +msgstr "列数" + +msgid "Force Displayed" +msgstr "强制显示" + +msgid "Mid Grapheme" +msgstr "å—ç´ å†…éƒ¨" + msgid "Underline" msgstr "下划线" +msgid "URI" +msgstr "URI" + +msgid "Start Index" +msgstr "起始索引" + +msgid "Switch on Hover" +msgstr "悬åœæ—¶åˆ‡æ¢" + +msgid "Prefer Global Menu" +msgstr "首选全局èœå•" + msgid "Draw Center" msgstr "绘制ä¸å¿ƒ" @@ -4321,6 +6100,18 @@ msgstr "å®«æ ¼è¾¹è·" msgid "Axis Stretch" msgstr "轴拉伸" +msgid "Fit to Longest Item" +msgstr "适é…最长项" + +msgid "Hide on Item Selection" +msgstr "项目选择时éšè—" + +msgid "Hide on Checkable Item Selection" +msgstr "项目勾选时éšè—" + +msgid "Hide on State Item Selection" +msgstr "选择状æ€é¡¹ç›®æ—¶éšè—" + msgid "Submenu Popup Delay" msgstr "åèœå•å¼¹å‡ºå»¶è¿Ÿ" @@ -4330,6 +6121,9 @@ msgstr "å…许æœç´¢" msgid "Fill Mode" msgstr "填充模å¼" +msgid "Show Percentage" +msgstr "显示百分比" + msgid "Min Value" msgstr "最å°å€¼" @@ -4363,14 +6157,26 @@ msgstr "边框宽度" msgid "Elapsed Time" msgstr "å·²ç»è¿‡æ—¶é—´" +msgid "Outline" +msgstr "轮廓" + msgid "Env" msgstr "环境" +msgid "Glyph Index" +msgstr "å—形索引" + +msgid "Glyph Count" +msgstr "å—形计数" + +msgid "Glyph Flags" +msgstr "å—å½¢æ ‡å¿—" + msgid "Relative Index" msgstr "相对索引" -msgid "Fit Content Height" -msgstr "适é…内容高度" +msgid "Bbcode Enabled" +msgstr "å¯ç”¨ Bbcode" msgid "Scroll Active" msgstr "滚动激活" @@ -4381,12 +6187,27 @@ msgstr "滚动跟éš" msgid "Tab Size" msgstr "制表符大å°" +msgid "Markup" +msgstr "æ ‡è®°" + msgid "Custom Effects" msgstr "自定义特效" msgid "Meta Underlined" msgstr "元数æ®ä¸‹åˆ’线" +msgid "Hint Underlined" +msgstr "下划线æ示" + +msgid "Threaded" +msgstr "多线程" + +msgid "Progress Bar Delay" +msgstr "进度æ¡å»¶è¿Ÿ" + +msgid "Text Selection" +msgstr "文本选区" + msgid "Selection Enabled" msgstr "å¯ç”¨é€‰æ‹©" @@ -4396,6 +6217,15 @@ msgstr "自定义æ¥é•¿" msgid "Follow Focus" msgstr "è·Ÿéšç„¦ç‚¹" +msgid "Horizontal Scroll Mode" +msgstr "水平滚动模å¼" + +msgid "Vertical Scroll Mode" +msgstr "垂直滚动模å¼" + +msgid "Scroll Deadzone" +msgstr "滚动æ»åŒº" + msgid "Default Scroll Deadzone" msgstr "默认滚动æ»åŒº" @@ -4405,6 +6235,15 @@ msgstr "å¯æ»šåŠ¨" msgid "Tick Count" msgstr "刻度数é‡" +msgid "Ticks on Borders" +msgstr "边界刻度" + +msgid "Update on Text Changed" +msgstr "文本更改时更新" + +msgid "Custom Arrow Step" +msgstr "自定义ç®å¤´æ¥é•¿" + msgid "Split Offset" msgstr "拆分å移" @@ -4414,30 +6253,75 @@ msgstr "折å " msgid "Dragger Visibility" msgstr "拖动器å¯è§æ€§" -msgid "Stretch" -msgstr "拉伸" - msgid "Stretch Shrink" msgstr "拉伸收缩" msgid "Current Tab" msgstr "当å‰é€‰é¡¹å¡" +msgid "Tab Alignment" +msgstr "选项å¡å¯¹é½" + +msgid "Clip Tabs" +msgstr "è£å‰ªé€‰é¡¹å¡" + msgid "Tab Close Display Policy" msgstr "选项å¡å…³é—显示ç–ç•¥" +msgid "Max Tab Width" +msgstr "最大选项å¡å®½åº¦" + msgid "Scrolling Enabled" msgstr "å¯ç”¨æ»šåŠ¨" +msgid "Drag to Rearrange Enabled" +msgstr "å¯ç”¨æ‹–放é‡æŽ’" + +msgid "Tabs Rearrange Group" +msgstr "选项å¡é‡æ–°æŽ’列组" + +msgid "Scroll to Selected" +msgstr "滚动到选定" + +msgid "Select With RMB" +msgstr "å³é”®é€‰æ‹©" + +msgid "Tabs" +msgstr "选项å¡" + msgid "Tabs Visible" msgstr "选项å¡å¯è§" +msgid "Use Hidden Tabs for Min Size" +msgstr "最å°å¤§å°è€ƒè™‘éšè—选项å¡" + +msgid "Drag and Drop Selection Enabled" +msgstr "å¯ç”¨æ‹–放选择" + +msgid "Wrap Mode" +msgstr "包裹模å¼" + msgid "Syntax Highlighter" msgstr "è¯æ³•é«˜äº®å™¨" +msgid "Smooth" +msgstr "平滑" + +msgid "Past End of File" +msgstr "超过文件末尾" + +msgid "Fit Content Height" +msgstr "适é…内容高度" + msgid "Draw" msgstr "绘制" +msgid "Move on Right Click" +msgstr "å³é”®ç‚¹å‡»æ—¶ç§»åŠ¨" + +msgid "Multiple" +msgstr "多个" + msgid "Hover" msgstr "悬åœ" @@ -4447,9 +6331,15 @@ msgstr "èšç„¦" msgid "Click Mask" msgstr "点击é®ç½©" +msgid "Ignore Texture Size" +msgstr "忽略纹ç†å¤§å°" + msgid "Nine Patch Stretch" msgstr "ä¹å®«æ ¼æ‹‰ä¼¸" +msgid "Stretch Margin" +msgstr "拉伸边è·" + msgid "Under" msgstr "下方" @@ -4474,6 +6364,9 @@ msgstr "填充角度" msgid "Center Offset" msgstr "ä¸å¿ƒå移" +msgid "Expand Mode" +msgstr "扩展模å¼" + msgid "Custom Minimum Height" msgstr "自定义最å°é«˜åº¦" @@ -4483,12 +6376,21 @@ msgstr "åˆ—æ ‡é¢˜å¯è§" msgid "Hide Folding" msgstr "éšè—折å " +msgid "Enable Recursive Folding" +msgstr "å¯ç”¨é€’归折å " + msgid "Hide Root" msgstr "éšè—æ ¹" msgid "Drop Mode Flags" msgstr "拖放模å¼æ ‡å¿—" +msgid "Scroll Horizontal Enabled" +msgstr "å¯ç”¨æ°´å¹³æ»šåŠ¨" + +msgid "Scroll Vertical Enabled" +msgstr "å¯ç”¨åž‚直滚动" + msgid "Audio Track" msgstr "音频轨é“" @@ -4513,12 +6415,27 @@ msgstr "自我调制" msgid "Show Behind Parent" msgstr "显示在父级之åŽ" +msgid "Clip Children" +msgstr "è£å‰ªå项" + msgid "Light Mask" msgstr "光线é®ç½©" +msgid "Visibility Layer" +msgstr "å¯è§å±‚" + +msgid "Ordering" +msgstr "排åº" + msgid "Z Index" msgstr "Z 索引" +msgid "Z as Relative" +msgstr "Z 为相对é‡" + +msgid "Y Sort Enabled" +msgstr "å¯ç”¨ Y 排åº" + msgid "Repeat" msgstr "é‡å¤" @@ -4531,6 +6448,9 @@ msgstr "漫åå°„" msgid "NormalMap" msgstr "法线贴图" +msgid "Shininess" +msgstr "光泽度" + msgid "Follow Viewport" msgstr "è·Ÿéšè§†å£" @@ -4540,6 +6460,9 @@ msgstr "下载文件" msgid "Download Chunk Size" msgstr "下载分å—大å°" +msgid "Accept Gzip" +msgstr "接收 Gzip" + msgid "Body Size Limit" msgstr "å“应体大å°é™åˆ¶" @@ -4549,12 +6472,18 @@ msgstr "最大跳转" msgid "Timeout" msgstr "超时" +msgid "Multiplayer Peer" +msgstr "多人对ç‰ä½“" + msgid "Transfer Mode" msgstr "ä¼ è¾“æ¨¡å¼" msgid "Transfer Channel" msgstr "ä¼ è¾“é€šé“" +msgid "Scene File Path" +msgstr "场景文件路径" + msgid "Owner" msgstr "拥有者" @@ -4570,6 +6499,9 @@ msgstr "剩余时间" msgid "Debug Collisions Hint" msgstr "调试碰撞æ示" +msgid "Debug Paths Hint" +msgstr "调试路径æ示" + msgid "Debug Navigation Hint" msgstr "调试导航æ示" @@ -4597,21 +6529,63 @@ msgstr "接触颜色" msgid "Geometry Color" msgstr "å‡ ä½•ä½“é¢œè‰²" +msgid "Geometry Width" +msgstr "å‡ ä½•ä½“å®½åº¦" + msgid "Draw 2D Outlines" msgstr "绘制 2D 轮廓" msgid "Anti Aliasing" msgstr "抗锯齿" +msgid "MSAA 2D" +msgstr "MSAA 2D" + +msgid "MSAA 3D" +msgstr "MSAA 3D" + +msgid "Viewport" +msgstr "视å£" + +msgid "Transparent Background" +msgstr "é€æ˜ŽèƒŒæ™¯" + +msgid "Screen Space AA" +msgstr "å±å¹•ç©ºé—´ AA" + +msgid "Use TAA" +msgstr "使用 TAA" + msgid "Use Debanding" msgstr "使用去æ¡å¸¦" -msgid "Occlusion Culling" -msgstr "é®æŒ¡å‰”除" +msgid "Use Occlusion Culling" +msgstr "使用é®æŒ¡å‰”除" + +msgid "Snap 2D Transforms to Pixel" +msgstr "å°† 2D å˜æ¢æ•æ‰åˆ°åƒç´ " + +msgid "Snap 2D Vertices to Pixel" +msgstr "å°† 2D 顶点å¸é™„到åƒç´ " + +msgid "Lights and Shadows" +msgstr "ç¯å…‰ä¸Žé˜´å½±" + +msgid "Positional Shadow" +msgstr "ä½ç½®é˜´å½±" msgid "Atlas Size" msgstr "图集大å°" +msgid "Atlas 16 Bits" +msgstr "图集 16 ä½" + +msgid "SDF" +msgstr "SDF" + +msgid "Oversize" +msgstr "显示缩放" + msgid "Enable Object Picking" msgstr "å¯ç”¨å¯¹è±¡æ‹¾å–" @@ -4627,6 +6601,15 @@ msgstr "Viewport 路径" msgid "Disable 3D" msgstr "ç¦ç”¨ 3D" +msgid "Use XR" +msgstr "使用 XR" + +msgid "Own World 3D" +msgstr "自有 3D 世界" + +msgid "World 3D" +msgstr "3D 世界" + msgid "World 2D" msgstr "2D 世界" @@ -4639,6 +6622,27 @@ msgstr "输入本地处ç†" msgid "Debug Draw" msgstr "调试绘制" +msgid "Scaling 3D" +msgstr "缩放 3D" + +msgid "Scaling 3D Mode" +msgstr "缩放 3D 模å¼" + +msgid "Scaling 3D Scale" +msgstr "缩放 3D 比例" + +msgid "Texture Mipmap Bias" +msgstr "çº¹ç† Mipmap åç½®" + +msgid "FSR Sharpness" +msgstr "FSR é”度" + +msgid "Variable Rate Shading" +msgstr "å¯å˜é€ŸçŽ‡ç€è‰²" + +msgid "Canvas Items" +msgstr "画布项" + msgid "Audio Listener" msgstr "音频监å¬å™¨" @@ -4654,6 +6658,12 @@ msgstr "对象拾å–" msgid "Disable Input" msgstr "ç¦ç”¨è¾“å…¥" +msgid "Positional Shadow Atlas" +msgstr "ä½ç½®é˜´å½±å›¾é›†" + +msgid "16 Bits" +msgstr "16 ä½" + msgid "Quad 0" msgstr "四方形 0" @@ -4672,6 +6682,15 @@ msgstr "画布å˜æ¢" msgid "Global Canvas Transform" msgstr "全局画布å˜æ¢" +msgid "Canvas Cull Mask" +msgstr "画布剔除é®ç½©" + +msgid "Size 2D Override" +msgstr "2D 大å°è¦†ç›–" + +msgid "Size 2D Override Stretch" +msgstr "2D 大å°è¦†ç›–拉伸" + msgid "Render Target" msgstr "æ¸²æŸ“ç›®æ ‡" @@ -4681,17 +6700,41 @@ msgstr "清å±æ¨¡å¼" msgid "Current Screen" msgstr "当å‰å±å¹•" +msgid "Mouse Passthrough Polygon" +msgstr "é¼ æ ‡ç©¿é€å¤šè¾¹å½¢" + +msgid "Wrap Controls" +msgstr "包裹控件" + +msgid "Transient" +msgstr "瞬æ€" + msgid "Exclusive" msgstr "独å " +msgid "Unresizable" +msgstr "ä¸å¯è°ƒæ•´å¤§å°" + +msgid "Unfocusable" +msgstr "æ— æ³•èšç„¦" + +msgid "Popup Window" +msgstr "弹出窗å£" + +msgid "Mouse Passthrough" +msgstr "é¼ æ ‡ç©¿é€" + msgid "Min Size" msgstr "最å°å¤§å°" msgid "Max Size" msgstr "大å°ä¸Šé™" -msgid "Aspect" -msgstr "比例" +msgid "Content Scale" +msgstr "内容缩放" + +msgid "Swap Cancel OK" +msgstr "交æ¢å–消确定" msgid "Layer Names" msgstr "层å称" @@ -4714,6 +6757,9 @@ msgstr "3D 物ç†" msgid "3D Navigation" msgstr "3D 导航" +msgid "Polyphony" +msgstr "å¤éŸ³" + msgid "Format" msgstr "æ ¼å¼" @@ -4723,12 +6769,72 @@ msgstr "混音率" msgid "Stereo" msgstr "立体声" +msgid "Profile" +msgstr "é…置文件" + +msgid "Bonemap" +msgstr "éª¨éª¼æ˜ å°„" + msgid "Exposure" msgstr "æ›å…‰" +msgid "Sensitivity" +msgstr "çµæ•åº¦" + +msgid "Multiplier" +msgstr "乘数" + msgid "Auto Exposure" msgstr "自动æ›å…‰" +msgid "DOF Blur" +msgstr "景深模糊" + +msgid "Far Enabled" +msgstr "远端å¯ç”¨" + +msgid "Far Distance" +msgstr "远端è·ç¦»" + +msgid "Far Transition" +msgstr "远端过渡" + +msgid "Near Enabled" +msgstr "近端å¯ç”¨" + +msgid "Near Distance" +msgstr "近端è·ç¦»" + +msgid "Near Transition" +msgstr "近端过渡" + +msgid "Min Sensitivity" +msgstr "最å°çµæ•åº¦" + +msgid "Max Sensitivity" +msgstr "最大çµæ•åº¦" + +msgid "Frustum" +msgstr "视锥" + +msgid "Focus Distance" +msgstr "焦点è·ç¦»" + +msgid "Focal Length" +msgstr "焦è·" + +msgid "Aperture" +msgstr "光圈" + +msgid "Shutter Speed" +msgstr "快门速度" + +msgid "Min Exposure Value" +msgstr "最å°æ›å…‰å€¼" + +msgid "Max Exposure Value" +msgstr "最大æ›å…‰å€¼" + msgid "Light Mode" msgstr "光照模å¼" @@ -4747,6 +6853,9 @@ msgstr "ç²’å动画循环" msgid "Segments" msgstr "分段" +msgid "Backface Collision" +msgstr "背é¢ç¢°æ’ž" + msgid "Bake Resolution" msgstr "烘焙分辨率" @@ -4762,18 +6871,69 @@ msgstr "é¢æ¿" msgid "Font Color" msgstr "å—体颜色" +msgid "Font Pressed Color" +msgstr "å—体颜色按下" + +msgid "Font Hover Color" +msgstr "å—体颜色悬åœ" + +msgid "Font Focus Color" +msgstr "å—体颜色èšç„¦" + +msgid "Font Hover Pressed Color" +msgstr "å—体颜色悬åœä¸”按下" + +msgid "Font Disabled Color" +msgstr "å—体颜色ç¦ç”¨" + +msgid "Font Outline Color" +msgstr "å—体轮廓颜色" + +msgid "Icon Normal Color" +msgstr "å›¾æ ‡æ£å¸¸é¢œè‰²" + +msgid "Icon Pressed Color" +msgstr "å›¾æ ‡æŒ‰ä¸‹é¢œè‰²" + +msgid "Icon Hover Color" +msgstr "å›¾æ ‡æ‚¬åœé¢œè‰²" + +msgid "Icon Hover Pressed Color" +msgstr "å›¾æ ‡æ‚¬åœæŒ‰ä¸‹é¢œè‰²" + +msgid "Icon Focus Color" +msgstr "å›¾æ ‡èšç„¦é¢œè‰²" + +msgid "Icon Disabled Color" +msgstr "å›¾æ ‡ç¦ç”¨é¢œè‰²" + msgid "H Separation" msgstr "水平间è·" msgid "Underline Spacing" msgstr "下划线间è·" +msgid "Normal Mirrored" +msgstr "æ£å¸¸é•œåƒ" + +msgid "Hover Mirrored" +msgstr "悬åœé•œåƒ" + +msgid "Pressed Mirrored" +msgstr "按下镜åƒ" + +msgid "Disabled Mirrored" +msgstr "ç¦ç”¨é•œåƒ" + msgid "Arrow" msgstr "ç®å¤´" msgid "Arrow Margin" msgstr "ç®å¤´è¾¹è·" +msgid "Modulate Arrow" +msgstr "调制ç®å¤´" + msgid "Hover Pressed" msgstr "悬åœä¸”按下" @@ -4787,29 +6947,65 @@ msgid "Unchecked Disabled" msgstr "未勾选且ç¦ç”¨" msgid "Radio Checked" -msgstr "å•é€‰é€‰ä¸" +msgstr "å•é€‰å·²å‹¾é€‰" msgid "Radio Checked Disabled" -msgstr "å•é€‰é€‰ä¸ä¸”ç¦ç”¨" +msgstr "å•é€‰å·²å‹¾é€‰ä¸”ç¦ç”¨" msgid "Radio Unchecked" -msgstr "å•é€‰æœªé€‰ä¸" +msgstr "å•é€‰æœªå‹¾é€‰" msgid "Radio Unchecked Disabled" msgstr "å•é€‰æœªé€‰ä¸ä¸”ç¦ç”¨" +msgid "Check V Offset" +msgstr "å‹¾é€‰å›¾æ ‡åž‚ç›´å移" + +msgid "Checked Mirrored" +msgstr "勾选镜åƒ" + +msgid "Checked Disabled Mirrored" +msgstr "勾选ç¦ç”¨é•œåƒ" + +msgid "Unchecked Mirrored" +msgstr "未勾选镜åƒ" + +msgid "Unchecked Disabled Mirrored" +msgstr "未勾选ç¦ç”¨é•œåƒ" + +msgid "Font Shadow Color" +msgstr "å—体阴影颜色" + msgid "Shadow Offset X" msgstr "阴影 X å移" msgid "Shadow Offset Y" msgstr "阴影 Y å移" +msgid "Shadow Outline Size" +msgstr "阴影轮廓大å°" + +msgid "Font Selected Color" +msgstr "å—体颜色选ä¸" + +msgid "Font Uneditable Color" +msgstr "å—体颜色ä¸å¯ç¼–辑" + +msgid "Font Placeholder Color" +msgstr "å—体颜色å ä½ç¬¦" + msgid "Clear Button Color" msgstr "清除按钮颜色" msgid "Clear Button Color Pressed" msgstr "清除按钮颜色按下" +msgid "Minimum Character Width" +msgstr "最å°å—符宽度" + +msgid "Caret Width" +msgstr "å…‰æ ‡å®½åº¦" + msgid "Clear" msgstr "清除" @@ -4822,12 +7018,27 @@ msgstr "选项å¡" msgid "Space" msgstr "ç©ºæ ¼" +msgid "Font Readonly Color" +msgstr "å—体颜色åªè¯»" + msgid "Breakpoint" msgstr "æ–点" +msgid "Bookmark" +msgstr "书ç¾" + +msgid "Executing Line" +msgstr "执行行" + +msgid "Can Fold" +msgstr "å¯æŠ˜å " + msgid "Folded" msgstr "已折å " +msgid "Folded EOL Icon" +msgstr "折å EOL å›¾æ ‡" + msgid "Completion Lines" msgstr "补全行数" @@ -4882,30 +7093,60 @@ msgstr "手柄ç¦ç”¨" msgid "Tick" msgstr "刻度" +msgid "Grabber Offset" +msgstr "抓å–器å移" + msgid "Updown" msgstr "上下" +msgid "Embedded Border" +msgstr "嵌入å¼è¾¹æ¡†" + msgid "Title Font" msgstr "æ ‡é¢˜å—体" +msgid "Title Font Size" +msgstr "æ ‡é¢˜å—体大å°" + msgid "Title Color" msgstr "æ ‡é¢˜é¢œè‰²" +msgid "Title Outline Modulate" +msgstr "æ ‡é¢˜è½®å»“è°ƒåˆ¶" + +msgid "Title Outline Size" +msgstr "æ ‡é¢˜è½®å»“å¤§å°" + msgid "Title Height" msgstr "æ ‡é¢˜é«˜åº¦" +msgid "Resize Margin" +msgstr "调整边è·" + msgid "Close" msgstr "å…³é—" +msgid "Close Pressed" +msgstr "å…³é—按下" + msgid "Close H Offset" msgstr "å…³é—æ°´å¹³å移" msgid "Close V Offset" msgstr "å…³é—åž‚ç›´å移" +msgid "Buttons Separation" +msgstr "按钮间è·" + msgid "Parent Folder" msgstr "父文件夹" +msgid "Back Folder" +msgstr "返回文件夹" + +msgid "Forward Folder" +msgstr "å‰è¿›æ–‡ä»¶å¤¹" + msgid "Reload" msgstr "é‡æ–°åŠ è½½" @@ -4918,6 +7159,15 @@ msgstr "文件夹" msgid "File" msgstr "文件" +msgid "Folder Icon Color" +msgstr "æ–‡ä»¶å¤¹å›¾æ ‡é¢œè‰²" + +msgid "File Icon Color" +msgstr "æ–‡ä»¶å›¾æ ‡é¢œè‰²" + +msgid "File Disabled Color" +msgstr "文件ç¦ç”¨é¢œè‰²" + msgid "Panel Disabled" msgstr "é¢æ¿ç¦ç”¨" @@ -4933,18 +7183,45 @@ msgstr "带å称分隔线å³ä¾§" msgid "Submenu" msgstr "åèœå•" +msgid "Submenu Mirrored" +msgstr "åèœå•é•œåƒ" + msgid "Font Separator" -msgstr "分隔线å—体" +msgstr "分隔符å—体" + +msgid "Font Separator Size" +msgstr "分隔符å—体大å°" + +msgid "Font Accelerator Color" +msgstr "å—ä½“åŠ é€Ÿå™¨é¢œè‰²" + +msgid "Font Separator Color" +msgstr "å—体分隔符颜色" + +msgid "Font Separator Outline Color" +msgstr "å—体分隔符轮廓颜色" msgid "V Separation" msgstr "åž‚ç›´é—´è·" +msgid "Separator Outline Size" +msgstr "分隔符轮廓大å°" + +msgid "Item Start Padding" +msgstr "项目首端填充" + +msgid "Item End Padding" +msgstr "项目末端填充" + msgid "Selected Frame" msgstr "选ä¸æ¡†æž¶" msgid "Comment Focus" msgstr "注释èšç„¦" +msgid "Slot" +msgstr "æ’槽" + msgid "Resizer" msgstr "大å°è°ƒæ•´å™¨" @@ -4960,6 +7237,9 @@ msgstr "é—´è·" msgid "Title Offset" msgstr "æ ‡é¢˜å移" +msgid "Title H Offset" +msgstr "æ ‡é¢˜æ°´å¹³å移" + msgid "Close Offset" msgstr "å…³é—å移" @@ -4993,12 +7273,18 @@ msgstr "自定义按钮按下" msgid "Custom Button Hover" msgstr "自定义按钮悬åœ" +msgid "Indeterminate" +msgstr "ä¸ç¡®å®š" + msgid "Select Arrow" msgstr "选择ç®å¤´" msgid "Arrow Collapsed" msgstr "ç®å¤´æŠ˜å " +msgid "Arrow Collapsed Mirrored" +msgstr "ç®å¤´æŠ˜å é•œåƒ" + msgid "Title Button Font" msgstr "æ ‡é¢˜æŒ‰é’®å—体" @@ -5014,6 +7300,12 @@ msgstr "放置ä½ç½®é¢œè‰²" msgid "Relationship Line Color" msgstr "关系线颜色" +msgid "Parent HL Line Color" +msgstr "父 HL 线颜色" + +msgid "Children HL Line Color" +msgstr "å HL 线颜色" + msgid "Custom Button Font Highlight" msgstr "自定义按钮å—体高亮" @@ -5026,6 +7318,18 @@ msgstr "按钮边è·" msgid "Draw Relationship Lines" msgstr "绘制关系线" +msgid "Relationship Line Width" +msgstr "关系线宽度" + +msgid "Parent HL Line Width" +msgstr "父 HL 线宽度" + +msgid "Children HL Line Width" +msgstr "å HL 线宽度" + +msgid "Parent HL Line Margin" +msgstr "父 HL 线边è·" + msgid "Draw Guides" msgstr "绘制å‚考线" @@ -5041,18 +7345,42 @@ msgstr "å›¾æ ‡è¾¹è·" msgid "Line Separation" msgstr "行间è·" +msgid "Tab Selected" +msgstr "选项å¡å·²é€‰" + +msgid "Tab Unselected" +msgstr "选项å¡æœªé€‰" + msgid "Tab Disabled" msgstr "选项å¡ç¦ç”¨" +msgid "Tabbar Background" +msgstr "选项å¡æ 背景" + +msgid "Drop Mark" +msgstr "æ”¾ä¸‹æ ‡è®°" + msgid "Menu" msgstr "èœå•" msgid "Menu Highlight" msgstr "èœå•é«˜äº®" +msgid "Font Unselected Color" +msgstr "å—体颜色未选" + +msgid "Drop Mark Color" +msgstr "æ”¾ä¸‹æ ‡è®°é¢œè‰²" + msgid "Side Margin" msgstr "侧边è·" +msgid "Icon Separation" +msgstr "å›¾æ ‡é—´è·" + +msgid "Button Highlight" +msgstr "按钮高亮" + msgid "Large" msgstr "大å·" @@ -5068,18 +7396,45 @@ msgstr "H 宽度" msgid "Label Width" msgstr "æ ‡ç¾å®½åº¦" +msgid "Folded Arrow" +msgstr "折å ç®å¤´" + +msgid "Expanded Arrow" +msgstr "展开ç®å¤´" + msgid "Screen Picker" msgstr "å±å¹•å–色器" +msgid "Shape Circle" +msgstr "形状圆" + +msgid "Shape Rect" +msgstr "形状矩形" + +msgid "Shape Rect Wheel" +msgstr "形状矩形轮" + msgid "Add Preset" msgstr "æ·»åŠ é¢„è®¾" +msgid "Sample BG" +msgstr "é‡‡æ ·èƒŒæ™¯" + msgid "Overbright Indicator" msgstr "过亮指示器" +msgid "Bar Arrow" +msgstr "æ¡å½¢ç®å¤´" + +msgid "Picker Cursor" +msgstr "选å–å™¨å…‰æ ‡" + msgid "Color Hue" msgstr "颜色色相" +msgid "Color Okhsl Hue" +msgstr "颜色 Okhsl 色相" + msgid "BG" msgstr "背景" @@ -5104,12 +7459,48 @@ msgstr "åŠ ç²—æ–œä½“å—体" msgid "Mono Font" msgstr "ç‰å®½å—体" +msgid "Normal Font Size" +msgstr "æ£å¸¸å—体大å°" + +msgid "Bold Font Size" +msgstr "粗体å—体大å°" + +msgid "Italics Font Size" +msgstr "斜体å—体大å°" + +msgid "Bold Italics Font Size" +msgstr "åŠ ç²—æ–œä½“å—体大å°" + +msgid "Mono Font Size" +msgstr "ç‰å®½å—体大å°" + msgid "Table H Separation" msgstr "è¡¨æ ¼æ°´å¹³é—´è·" msgid "Table V Separation" msgstr "è¡¨æ ¼åž‚ç›´é—´è·" +msgid "Table Odd Row BG" +msgstr "è¡¨æ ¼å¥‡æ•°è¡ŒèƒŒæ™¯" + +msgid "Table Even Row BG" +msgstr "è¡¨æ ¼å¶æ•°è¡ŒèƒŒæ™¯" + +msgid "Table Border" +msgstr "è¡¨æ ¼è¾¹æ¡†" + +msgid "Text Highlight H Padding" +msgstr "文本高亮水平填充" + +msgid "Text Highlight V Padding" +msgstr "文本高亮竖直填充" + +msgid "H Grabber" +msgstr "水平抓å–器" + +msgid "V Grabber" +msgstr "竖直抓å–器" + msgid "Margin Left" msgstr "左边è·" @@ -5122,6 +7513,9 @@ msgstr "å³è¾¹è·" msgid "Margin Bottom" msgstr "下边è·" +msgid "Minimum Grab Thickness" +msgstr "最å°æŠ“å–厚度" + msgid "Autohide" msgstr "自动éšè—" @@ -5132,10 +7526,10 @@ msgid "More" msgstr "更多" msgid "Grid Minor" -msgstr "æ¬¡ç½‘æ ¼" +msgstr "æ¬¡æ …æ ¼" msgid "Grid Major" -msgstr "ä¸»ç½‘æ ¼" +msgstr "ä¸»æ …æ ¼" msgid "Selection Fill" msgstr "选ä¸é¡¹å¡«å……" @@ -5146,9 +7540,18 @@ msgstr "选ä¸é¡¹æè¾¹" msgid "Activity" msgstr "活动" +msgid "Port Hotzone Inner Extent" +msgstr "端å£çƒåŒºå†…部范围" + +msgid "Port Hotzone Outer Extent" +msgstr "端å£çƒåŒºå¤–部范围" + msgid "Node" msgstr "节点" +msgid "Energy Multiplier" +msgstr "能é‡å€å¢žå™¨" + msgid "Canvas Max Layer" msgstr "画布最大层" @@ -5158,6 +7561,9 @@ msgstr "ç›¸æœºæº ID" msgid "Sky" msgstr "天空" +msgid "Custom FOV" +msgstr "自定义 FOV" + msgid "Ambient Light" msgstr "环境光" @@ -5167,12 +7573,18 @@ msgstr "æ¥æº" msgid "Sky Contribution" msgstr "天空贡献" +msgid "Reflected Light" +msgstr "åå°„å…‰" + msgid "Tonemap" msgstr "è‰²è°ƒæ˜ å°„" msgid "White" msgstr "白点" +msgid "SSR" +msgstr "SSR" + msgid "Max Steps" msgstr "最大æ¥æ•°" @@ -5188,15 +7600,57 @@ msgstr "深度公差" msgid "SSAO" msgstr "SSAO" +msgid "Power" +msgstr "力é‡" + msgid "Detail" msgstr "细节" +msgid "Horizon" +msgstr "地平线" + +msgid "Sharpness" +msgstr "边缘é”度" + msgid "Light Affect" msgstr "光照影å“" msgid "AO Channel Affect" msgstr "AO 通é“å½±å“" +msgid "SSIL" +msgstr "SSIL" + +msgid "Normal Rejection" +msgstr "法线拒ç»" + +msgid "SDFGI" +msgstr "SDFGI" + +msgid "Use Occlusion" +msgstr "使用é®æŒ¡" + +msgid "Read Sky Light" +msgstr "读å–天空光照" + +msgid "Bounce Feedback" +msgstr "åå¼¹å馈" + +msgid "Cascades" +msgstr "级è”" + +msgid "Min Cell Size" +msgstr "最å°å•å…ƒæ ¼å¤§å°" + +msgid "Cascade 0 Distance" +msgstr "çº§è” 0 è·ç¦»" + +msgid "Y Scale" +msgstr "Y 比例" + +msgid "Probe Bias" +msgstr "探针åç½®" + msgid "Glow" msgstr "辉光" @@ -5239,12 +7693,51 @@ msgstr "HDR 缩放" msgid "HDR Luminance Cap" msgstr "HDR 亮度上é™" +msgid "Map Strength" +msgstr "æ˜ å°„å¼ºåº¦" + +msgid "Map" +msgstr "æ˜ å°„" + msgid "Fog" msgstr "雾" +msgid "Light Color" +msgstr "光线颜色" + +msgid "Light Energy" +msgstr "光线能é‡" + +msgid "Sun Scatter" +msgstr "太阳散射" + +msgid "Density" +msgstr "密度" + +msgid "Aerial Perspective" +msgstr "空气é€è§†" + +msgid "Sky Affect" +msgstr "天空影å“" + +msgid "Height Density" +msgstr "高度密度" + +msgid "Volumetric Fog" +msgstr "体积雾" + +msgid "GI Inject" +msgstr "GI 注入" + msgid "Anisotropy" msgstr "å„å‘异性" +msgid "Detail Spread" +msgstr "ç»†èŠ‚ä¼ æ’" + +msgid "Ambient Inject" +msgstr "环境光注入" + msgid "Adjustments" msgstr "调整" @@ -5257,12 +7750,51 @@ msgstr "饱和度" msgid "Color Correction" msgstr "é¢œè‰²æ ¡æ£" +msgid "Height Falloff" +msgstr "高度衰å‡" + +msgid "Edge Fade" +msgstr "边缘淡化" + +msgid "Density Texture" +msgstr "密度纹ç†" + +msgid "Font Name" +msgstr "å—体å称" + +msgid "Style Name" +msgstr "æ ·å¼å称" + +msgid "Font Style" +msgstr "å—ä½“æ ·å¼" + +msgid "Font Weight" +msgstr "å—é‡" + +msgid "Font Stretch" +msgstr "å—体拉伸" + +msgid "OpenType Feature Overrides" +msgstr "OpenType 功能覆盖" + +msgid "Base Font" +msgstr "基础å—体" + msgid "Features" msgstr "特性" msgid "Extra Spacing" msgstr "é¢å¤–é—´è·" +msgid "Glyph" +msgstr "å—å½¢" + +msgid "Font Names" +msgstr "å—体å称" + +msgid "Font Italic" +msgstr "å—体斜体" + msgid "Interpolation Mode" msgstr "æ’值模å¼" @@ -5293,6 +7825,9 @@ msgstr "深度绘制模å¼" msgid "Shading" msgstr "ç€è‰²" +msgid "Shading Mode" +msgstr "ç€è‰²æ¨¡å¼" + msgid "Diffuse Mode" msgstr "漫å射模å¼" @@ -5305,17 +7840,29 @@ msgstr "ç¦ç”¨çŽ¯å¢ƒå…‰" msgid "Vertex Color" msgstr "顶点颜色" +msgid "Use as Albedo" +msgstr "用作å照率" + msgid "Is sRGB" msgstr "是 sRGB" +msgid "Texture Force sRGB" +msgstr "纹ç†å¼ºåˆ¶ sRGB" + +msgid "Texture MSDF" +msgstr "çº¹ç† MSDF" + +msgid "ORM" +msgstr "ORM" + msgid "Metallic" -msgstr "金属性" +msgstr "金属度" msgid "Texture Channel" msgstr "纹ç†é€šé“" msgid "Operator" -msgstr "æ“作符" +msgstr "è¿ç®—" msgid "On UV2" msgstr "使用 UV2" @@ -5347,9 +7894,18 @@ msgstr "翻转切线" msgid "Flip Binormal" msgstr "翻转次法线" +msgid "Flip Texture" +msgstr "翻转纹ç†" + msgid "Subsurface Scattering" msgstr "次表é¢æ•£å°„" +msgid "Back Lighting" +msgstr "背部照明" + +msgid "Backlight" +msgstr "背光" + msgid "Refraction" msgstr "折射" @@ -5395,33 +7951,66 @@ msgstr "使用点大å°" msgid "Point Size" msgstr "点大å°" +msgid "Use Particle Trails" +msgstr "使用粒å尾迹" + msgid "Proximity Fade" msgstr "接近淡出" msgid "Distance" msgstr "è·ç¦»" +msgid "MSDF" +msgstr "MSDF" + +msgid "Pixel Range" +msgstr "åƒç´ 范围" + msgid "Lightmap Size Hint" msgstr "光照贴图大å°æ示" +msgid "Blend Shape Mode" +msgstr "æ··åˆå½¢çŠ¶æ¨¡å¼" + +msgid "Shadow Mesh" +msgstr "é˜´å½±ç½‘æ ¼" + msgid "Item" msgstr "项目" msgid "Mesh Transform" msgstr "ç½‘æ ¼å˜æ¢" +msgid "Navigation Mesh Transform" +msgstr "å¯¼èˆªç½‘æ ¼å˜æ¢" + msgid "Preview" msgstr "预览" msgid "Transform Format" msgstr "å˜æ¢æ ¼å¼" +msgid "Use Custom Data" +msgstr "使用自定义数æ®" + msgid "Instance Count" msgstr "实例数" msgid "Visible Instance Count" msgstr "å¯è§å®žä¾‹æ•°" +msgid "Transform Array" +msgstr "å˜æ¢æ•°ç»„" + +msgid "Transform 2D Array" +msgstr "å˜æ¢ 2D 数组" + +msgid "Color Array" +msgstr "颜色数组" + +msgid "Custom Data Array" +msgstr "自定义数æ®æ•°ç»„" + msgid "Partition Type" msgstr "分区类型" @@ -5497,15 +8086,48 @@ msgstr "颜色纹ç†" msgid "Point Count" msgstr "点数" +msgid "Scale Min" +msgstr "最å°ç¼©æ”¾" + +msgid "Scale Max" +msgstr "最大缩放" + msgid "Scale Curve" msgstr "缩放曲线" +msgid "Noise Strength" +msgstr "噪声强度" + +msgid "Noise Speed" +msgstr "噪声速度" + +msgid "Noise Speed Random" +msgstr "噪声速度éšæœº" + +msgid "Influence Min" +msgstr "最å°å½±å“" + +msgid "Influence Max" +msgstr "最大影å“" + +msgid "Keep Velocity" +msgstr "ä¿æŒé€Ÿåº¦" + +msgid "Use Scale" +msgstr "使用缩放" + msgid "Rough" msgstr "ç²—ç³™" msgid "Absorbent" msgstr "å¸æ”¶" +msgid "Add UV2" +msgstr "æ·»åŠ UV2" + +msgid "UV2 Padding" +msgstr "UV2 å¡«å……" + msgid "Subdivide Width" msgstr "细分宽度" @@ -5521,6 +8143,15 @@ msgstr "顶部åŠå¾„" msgid "Bottom Radius" msgstr "底部åŠå¾„" +msgid "Cap Top" +msgstr "顶盖" + +msgid "Cap Bottom" +msgstr "底盖" + +msgid "Left to Right" +msgstr "从左到å³" + msgid "Is Hemisphere" msgstr "是å¦åŠçƒ" @@ -5536,6 +8167,18 @@ msgstr "B" msgid "Custom Solver Bias" msgstr "自定义求解器åç½®" +msgid "Target Nodepath" +msgstr "ç›®æ ‡èŠ‚ç‚¹è·¯å¾„" + +msgid "Use Gravity" +msgstr "使用é‡åŠ›" + +msgid "Bone Index" +msgstr "骨骼索引" + +msgid "Bone 2D Node" +msgstr "Bone2D 节点" + msgid "Bind Count" msgstr "绑定数" @@ -5545,6 +8188,9 @@ msgstr "绑定" msgid "Bone" msgstr "骨骼" +msgid "Sky Material" +msgstr "天空æè´¨" + msgid "Radiance Size" msgstr "è¾å°„大å°" @@ -5566,6 +8212,36 @@ msgstr "太阳" msgid "Panorama" msgstr "全景" +msgid "Rayleigh" +msgstr "瑞利散射" + +msgid "Coefficient" +msgstr "系数" + +msgid "Mie" +msgstr "ç±³æ°æ•£å°„" + +msgid "Eccentricity" +msgstr "å心率" + +msgid "Turbidity" +msgstr "浊度" + +msgid "Ground Color" +msgstr "地é¢é¢œè‰²" + +msgid "Content Margins" +msgstr "内容边è·" + +msgid "Texture Margins" +msgstr "纹ç†è¾¹è·" + +msgid "Expand Margins" +msgstr "扩展边è·" + +msgid "Sub-Region" +msgstr "å区域" + msgid "Blend" msgstr "æ··åˆ" @@ -5590,8 +8266,17 @@ msgstr "å‘å‰ä¼¸é•¿" msgid "Grow End" msgstr "å‘åŽä¼¸é•¿" -msgid "Image" -msgstr "图åƒ" +msgid "Keyword Colors" +msgstr "关键è¯é¢œè‰²" + +msgid "Member Keyword Colors" +msgstr "æˆå‘˜å…³é”®è¯é¢œè‰²" + +msgid "Size Override" +msgstr "尺寸覆盖" + +msgid "Keep Compressed Buffer" +msgstr "ä¿æŒåŽ‹ç¼©ç¼“冲" msgid "Load Path" msgstr "åŠ è½½è·¯å¾„" @@ -5608,6 +8293,15 @@ msgstr "基础纹ç†" msgid "Image Size" msgstr "图åƒå¤§å°" +msgid "Curve X" +msgstr "曲线 X" + +msgid "Curve Y" +msgstr "曲线 Y" + +msgid "Curve Z" +msgstr "曲线 Z" + msgid "Use HDR" msgstr "使用 HDR" @@ -5617,6 +8311,9 @@ msgstr "起点" msgid "To" msgstr "终点" +msgid "Frames" +msgstr "帧" + msgid "Current Frame" msgstr "当å‰å¸§" @@ -5629,24 +8326,99 @@ msgstr "æº" msgid "Camera Is Active" msgstr "相机是å¦æ´»åŠ¨" +msgid "Default Base Scale" +msgstr "默认基础缩放" + msgid "Default Font" msgstr "默认å—体" +msgid "Default Font Size" +msgstr "默认å—体大å°" + +msgid "Tile Shape" +msgstr "图å—形状" + +msgid "Tile Layout" +msgstr "图å—布局" + +msgid "Tile Offset Axis" +msgstr "图å—å移轴" + +msgid "Tile Size" +msgstr "图å—大å°" + +msgid "UV Clipping" +msgstr "UV è£å‰ª" + +msgid "Occlusion Layers" +msgstr "é®æŒ¡å±‚" + +msgid "Physics Layers" +msgstr "物ç†å±‚" + +msgid "Terrain Sets" +msgstr "地形集" + +msgid "Custom Data Layers" +msgstr "自定义数æ®å±‚" + msgid "Transpose" msgstr "转置" +msgid "Y Sort Origin" +msgstr "Y 排åºåŽŸç‚¹" + +msgid "Terrains" +msgstr "地形" + +msgid "Terrain Set" +msgstr "地形集" + +msgid "Terrain" +msgstr "地形" + +msgid "Miscellaneous" +msgstr "æ‚项" + +msgid "Probability" +msgstr "概率" + +msgid "Output Port for Preview" +msgstr "预览输出端å£" + msgid "Modes" msgstr "模å¼" +msgid "Varyings" +msgstr "Varying" + msgid "Input Name" msgstr "输入å称" +msgid "Parameter Name" +msgstr "å‚æ•°å称" + +msgid "Qualifier" +msgstr "修饰符" + +msgid "Varying Name" +msgstr "Varying å称" + +msgid "Varying Type" +msgstr "Varying 类型" + +msgid "Op Type" +msgstr "æ“作类型" + msgid "Constant" msgstr "常é‡" msgid "Texture Type" msgstr "纹ç†ç±»åž‹" +msgid "Texture Array" +msgstr "纹ç†æ•°ç»„" + msgid "Cube Map" msgstr "立方体贴图" @@ -5665,6 +8437,12 @@ msgstr "默认值" msgid "Color Default" msgstr "颜色默认" +msgid "Use All Surfaces" +msgstr "使用所有表é¢" + +msgid "Surface Index" +msgstr "表é¢ç´¢å¼•" + msgid "Canvas" msgstr "画布" @@ -5674,18 +8452,6 @@ msgstr "导航地图" msgid "Direct Space State" msgstr "DirectSpaceState" -msgid "Default Gravity" -msgstr "默认é‡åŠ›" - -msgid "Default Gravity Vector" -msgstr "默认é‡åŠ›å‘é‡" - -msgid "Default Cell Size" -msgstr "默认å•å…ƒæ ¼å¤§å°" - -msgid "Default Edge Connection Margin" -msgstr "默认边界连接边è·" - msgid "Fallback Environment" msgstr "回退环境" @@ -5695,9 +8461,24 @@ msgstr "场景" msgid "Plane" msgstr "å¹³é¢" +msgid "Fallback values" +msgstr "回退值" + +msgid "Stylebox" +msgstr "æ ·å¼ç›’" + +msgid "Streams" +msgstr "æµ" + +msgid "Playback Mode" +msgstr "æ’放模å¼" + msgid "Random Pitch" msgstr "éšæœºéŸ³é«˜" +msgid "Random Volume Offset dB" +msgstr "éšæœºéŸ³é‡å移 dB" + msgid "Buffer Length" msgstr "缓冲长度" @@ -5809,20 +8590,26 @@ msgstr "撤离时间(毫秒)" msgid "Surround" msgstr "环绕" +msgid "Enable Input" +msgstr "å¯ç”¨è¾“å…¥" + msgid "Output Latency" msgstr "输出延迟" msgid "Channel Disable Threshold dB" msgstr "声é“ç¦ç”¨é˜ˆå€¼ dB" +msgid "Video" +msgstr "视频" + msgid "Video Delay Compensation (ms)" msgstr "视频延迟补å¿ï¼ˆæ¯«ç§’)" msgid "Bus Count" msgstr "总线数é‡" -msgid "Capture Device" -msgstr "æ•èŽ·è®¾å¤‡" +msgid "Playback Speed Scale" +msgstr "æ’放速度缩放" msgid "Feed" msgstr "æº" @@ -5830,11 +8617,56 @@ msgstr "æº" msgid "Is Active" msgstr "是å¦æ¿€æ´»" -msgid "Sleep Threshold Linear" -msgstr "ç¡çœ 线速度阈值" +msgid "Movie Writer" +msgstr "Movie Writer" -msgid "Sleep Threshold Angular" -msgstr "ç¡çœ 角速度阈值" +msgid "Movie File" +msgstr "电影文件" + +msgid "Disable V-Sync" +msgstr "ç¦ç”¨åž‚ç›´åŒæ¥" + +msgid "Pathfinding Algorithm" +msgstr "寻路算法" + +msgid "Path Postprocessing" +msgstr "路径åŽå¤„ç†" + +msgid "Metadata Flags" +msgstr "元数æ®æ ‡å¿—" + +msgid "Path Types" +msgstr "路径类型" + +msgid "Path Rids" +msgstr "路径 RID" + +msgid "Path Owner IDs" +msgstr "路径所有者 ID" + +msgid "Default Cell Size" +msgstr "默认å•å…ƒæ ¼å¤§å°" + +msgid "Default Edge Connection Margin" +msgstr "默认边界连接边è·" + +msgid "Default Link Connection Radius" +msgstr "默认链接连接边è·" + +msgid "Edge Connection Color" +msgstr "边界连接颜色" + +msgid "Geometry Edge Color" +msgstr "å‡ ä½•ä½“è¾¹é¢œè‰²" + +msgid "Geometry Face Color" +msgstr "å‡ ä½•ä½“é¢é¢œè‰²" + +msgid "Geometry Edge Disabled Color" +msgstr "å‡ ä½•ä½“è¾¹ç¦ç”¨é¢œè‰²" + +msgid "Geometry Face Disabled Color" +msgstr "å‡ ä½•ä½“é¢ç¦ç”¨é¢œè‰²" msgid "Inverse Mass" msgstr "逆转质é‡" @@ -5863,12 +8695,30 @@ msgstr "与区域碰撞" msgid "Shape RID" msgstr "形状 RID" +msgid "Exclude Objects" +msgstr "排除对象" + +msgid "Default Gravity" +msgstr "默认é‡åŠ›" + +msgid "Default Gravity Vector" +msgstr "默认é‡åŠ›å‘é‡" + +msgid "Sleep Threshold Linear" +msgstr "ç¡çœ 线速度阈值" + +msgid "Sleep Threshold Angular" +msgstr "ç¡çœ 角速度阈值" + msgid "Physics Engine" msgstr "物ç†å¼•æ“Ž" msgid "Principal Inertia Axes" msgstr "主惯性轴" +msgid "Max Collisions" +msgstr "最大碰撞数" + msgid "Vertex" msgstr "顶点" @@ -5884,29 +8734,50 @@ msgstr "剔除" msgid "Unshaded" msgstr "ä¸ç€è‰²" +msgid "Wireframe" +msgstr "线框" + +msgid "Skip Vertex Transform" +msgstr "跳过顶点å˜æ¢" + +msgid "World Vertex Coords" +msgstr "世界顶点åæ ‡" + msgid "Ensure Correct Normals" msgstr "ç¡®ä¿æ£ç¡®æ³•çº¿" +msgid "Shadows Disabled" +msgstr "ç¦ç”¨é˜´å½±" + +msgid "Ambient Light Disabled" +msgstr "ç¦ç”¨çŽ¯å¢ƒå…‰" + msgid "Vertex Lighting" msgstr "顶点光照" -msgid "Render Loop Enabled" -msgstr "å¯ç”¨æ¸²æŸ“循环" +msgid "Particle Trails" +msgstr "ç²’å尾迹" -msgid "VRAM Compression" -msgstr "VRAM 压缩" +msgid "Disable Velocity" +msgstr "ç¦ç”¨é€Ÿåº¦" -msgid "Import BPTC" -msgstr "导入 BPTC" +msgid "Keep Data" +msgstr "ä¿ç•™æ•°æ®" -msgid "Import S3TC" -msgstr "导入 S3TC" +msgid "Use Half Res Pass" +msgstr "使用二分之一分辨率阶段" -msgid "Import ETC" -msgstr "导入 ETC" +msgid "Use Quarter Res Pass" +msgstr "使用四分之一分辨率阶段" -msgid "Import ETC2" -msgstr "导入 ETC2" +msgid "Disable Fog" +msgstr "ç¦ç”¨é›¾" + +msgid "Render Loop Enabled" +msgstr "å¯ç”¨æ¸²æŸ“循环" + +msgid "VRAM Compression" +msgstr "VRAM 压缩" msgid "Lossless Compression" msgstr "æ— æŸåŽ‹ç¼©" @@ -5914,27 +8785,93 @@ msgstr "æ— æŸåŽ‹ç¼©" msgid "Force PNG" msgstr "强制 PNG" +msgid "Use Physical Light Units" +msgstr "使用物ç†å…‰çº¿å•ä½" + +msgid "Soft Shadow Filter Quality" +msgstr "柔和阴影过滤器质é‡" + msgid "Shadow Atlas" msgstr "阴影图集" +msgid "Shader Compiler" +msgstr "ç€è‰²å™¨ç¼–译器" + +msgid "Shader Cache" +msgstr "ç€è‰²å™¨ç¼“å˜" + +msgid "Use Zstd Compression" +msgstr "使用 Zstd 压缩" + +msgid "Strip Debug" +msgstr "剥离调试" + msgid "Reflections" msgstr "åå°„" +msgid "Sky Reflections" +msgstr "天空åå°„" + msgid "Texture Array Reflections" msgstr "纹ç†æ•°ç»„åå°„" +msgid "GGX Samples" +msgstr "GGX æ ·æœ¬" + +msgid "Fast Filter High Quality" +msgstr "高质é‡å¿«é€Ÿè¿‡æ»¤å™¨" + +msgid "Reflection Atlas" +msgstr "å射图集" + +msgid "Reflection Size" +msgstr "å射大å°" + +msgid "Reflection Count" +msgstr "åå°„æ•°é‡" + +msgid "GI" +msgstr "全局光" + +msgid "Use Half Resolution" +msgstr "åŠåˆ†è¾¨çŽ‡" + msgid "Overrides" msgstr "é‡å†™" msgid "Force Vertex Shading" msgstr "强制顶点ç€è‰²" +msgid "Force Lambert over Burley" +msgstr "强制 Lambert è€Œéž Burley" + msgid "Depth Prepass" msgstr "深度å‰ç½®é˜¶æ®µ" +msgid "Disable for Vendors" +msgstr "针对厂商ç¦ç”¨" + +msgid "Default Filters" +msgstr "默认过滤器" + msgid "Use Nearest Mipmap Filter" msgstr "使用最近 Mipmap 过滤" +msgid "Depth of Field" +msgstr "景深" + +msgid "Depth of Field Use Jitter" +msgstr "景深使用抖动" + +msgid "Occlusion Rays per Thread" +msgstr "æ¯çº¿ç¨‹é®æŒ¡å°„线" + +msgid "Upscale Mode" +msgstr "放大模å¼" + +msgid "Global Shader Variables" +msgstr "全局ç€è‰²å™¨å˜é‡" + msgid "Buffer Size" msgstr "缓冲区大å°" @@ -5944,12 +8881,21 @@ msgstr "ç€è‰²å™¨" msgid "Is Primary" msgstr "是å¦ä¸»è¦" +msgid "Play Area Mode" +msgstr "游玩区模å¼" + msgid "AR" msgstr "AR" msgid "Is Anchor Detection Enabled" msgstr "锚点检测是å¦å¯ç”¨" +msgid "Has Tracking Data" +msgstr "有跟踪数æ®" + +msgid "Tracking Confidence" +msgstr "追踪置信度" + msgid "Primary Interface" msgstr "主接å£" diff --git a/editor/translations/properties/zh_TW.po b/editor/translations/properties/zh_TW.po index adadc3a969..93130d6ec7 100644 --- a/editor/translations/properties/zh_TW.po +++ b/editor/translations/properties/zh_TW.po @@ -44,16 +44,16 @@ msgstr "" "Project-Id-Version: Godot Engine properties\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2023-01-14 10:06+0000\n" -"Last-Translator: Edison Lee <edisonlee@edisonlee55.com>\n" +"PO-Revision-Date: 2023-02-10 10:44+0000\n" +"Last-Translator: abcabcc <xmmandxpp@outlook.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" -"godot-engine/godot/zh_Hant/>\n" +"godot-engine/godot-properties/zh_Hant/>\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.15.1-dev\n" +"X-Generator: Weblate 4.16-dev\n" msgid "Application" msgstr "應用" @@ -64,9 +64,15 @@ msgstr "è¨ç½®" msgid "Name" msgstr "å稱" +msgid "Description" +msgstr "說明" + msgid "Run" msgstr "執行" +msgid "Main Scene" +msgstr "ä¸»å ´æ™¯" + msgid "Disable stdout" msgstr "åœç”¨æ¨™æº–輸出" @@ -94,18 +100,27 @@ msgstr "視窗" msgid "Size" msgstr "大å°" +msgid "Mode" +msgstr "模å¼" + msgid "Resizable" msgstr "å¯èª¿æ•´å¤§å°çš„" msgid "Borderless" msgstr "無邊框" +msgid "No Focus" +msgstr "關閉èšç„¦" + msgid "Energy Saving" msgstr "節能" msgid "Keep Screen On" msgstr "ä¿æŒèž¢å¹•é–‹å•Ÿ" +msgid "Audio" +msgstr "音訊" + msgid "Editor" msgstr "編輯器" @@ -127,6 +142,9 @@ msgstr "åµéŒ¯" msgid "Settings" msgstr "è¨å®š" +msgid "Compression" +msgstr "壓縮" + msgid "Crash Handler" msgstr "當機處ç†å¸¸å¼" @@ -136,6 +154,21 @@ msgstr "訊æ¯" msgid "Rendering" msgstr "算繪" +msgid "Limits" +msgstr "é™åˆ¶" + +msgid "Force Right to Left Layout Direction" +msgstr "強制畫é¢ä½ˆå±€ç”±å³è‡³å·¦" + +msgid "GUI" +msgstr "圖形使用者介é¢" + +msgid "Vulkan" +msgstr "Vulkan" + +msgid "Max Descriptors per Pool" +msgstr "å„æ± æœ€å¤§æ述符數" + msgid "Low Processor Usage Mode" msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼" @@ -145,6 +178,9 @@ msgstr "低處ç†å™¨ä½¿ç”¨çŽ‡æ¨¡å¼ç¡çœ (微秒)" msgid "Print Error Messages" msgstr "顯示錯誤訊æ¯" +msgid "Physics Ticks per Second" +msgstr "æ¯ç§’物ç†é€±æœŸæ•¸" + msgid "Time Scale" msgstr "時間縮放" @@ -160,9 +196,15 @@ msgstr "使用累ç©è¼¸å…¥" msgid "Device" msgstr "è£ç½®" +msgid "Command or Control Autoremap" +msgstr "自動é‡å°æ˜ Command å’Œ Control" + msgid "Pressed" msgstr "按下" +msgid "Keycode" +msgstr "éµç¢¼" + msgid "Unicode" msgstr "Unicode" @@ -208,6 +250,9 @@ msgstr "軸數值" msgid "Index" msgstr "索引" +msgid "Double Tap" +msgstr "雙擊" + msgid "Action" msgstr "æ“作" @@ -235,6 +280,12 @@ msgstr "控制器值" msgid "Big Endian" msgstr "大端" +msgid "Network" +msgstr "網路" + +msgid "Page Size" +msgstr "分é 大å°" + msgid "Blocking Mode Enabled" msgstr "啟用阻塞模å¼" @@ -271,15 +322,15 @@ msgstr "路徑" msgid "Data Array" msgstr "資料陣列" -msgid "Blocking Handshake" -msgstr "åœç”¨æ¡æ‰‹" - msgid "Max Pending Connections" msgstr "最大ç‰å¾…連接數" msgid "Offset" msgstr "å移" +msgid "Cell Size" +msgstr "å–®å…ƒæ ¼å¤§å°" + msgid "Seed" msgstr "種å" @@ -289,6 +340,15 @@ msgstr "狀態" msgid "Source Code" msgstr "原始碼" +msgid "Worker Pool" +msgstr "å·¥ä½œæ± " + +msgid "Use System Threads for Low Priority Tasks" +msgstr "將系統執行緒用於低優先度任務" + +msgid "Low Priority Thread Ratio" +msgstr "低優先度執行緒的比率" + msgid "Locale" msgstr "地å€" @@ -298,6 +358,9 @@ msgstr "測試" msgid "Fallback" msgstr "後備語言" +msgid "Double Vowels" +msgstr "é‡è¤‡æ¯éŸ³" + msgid "Prefix" msgstr "å‰ç¶´" @@ -343,15 +406,6 @@ msgstr "å‹•ç•«" msgid "Easing" msgstr "緩入緩出" -msgid "Interface" -msgstr "ç•Œé¢" - -msgid "Editors" -msgstr "編輯器" - -msgid "Network" -msgstr "網路" - msgid "Remote Port" msgstr "é 端阜" @@ -421,8 +475,8 @@ msgstr "已勾é¸" msgid "Keying" msgstr "輸入" -msgid "Main Scene" -msgstr "ä¸»å ´æ™¯" +msgid "Interface" +msgstr "ç•Œé¢" msgid "Show Update Spinner" msgstr "顯示更新旋轉圖" @@ -484,6 +538,12 @@ msgstr "編輯器語言" msgid "Display Scale" msgstr "顯示縮放" +msgid "Enable Pseudolocalization" +msgstr "啟用模擬翻è¯æ¨¡å¼" + +msgid "Use Embedded Menu" +msgstr "使用嵌入å¼é¸å–®" + msgid "Custom Display Scale" msgstr "自訂顯示縮放" @@ -493,6 +553,12 @@ msgstr "主è¦å—體大å°" msgid "Code Font Size" msgstr "程å¼ç¢¼å—體大å°" +msgid "Code Font Contextual Ligatures" +msgstr "程å¼ç¢¼å—é«”å‰å¾Œåˆå—" + +msgid "Code Font Custom OpenType Features" +msgstr "程å¼ç¢¼å—體自定義 OpenType 功能" + msgid "Font Hinting" msgstr "å—體微調" @@ -506,19 +572,28 @@ msgid "Code Font" msgstr "程å¼ç¢¼å—é«”" msgid "Low Processor Mode Sleep (µsec)" -msgstr "低處ç†å™¨ç¡çœ 模å¼ï¼ˆå¾®ç§’)" +msgstr "處ç†å™¨ç¯€èƒ½æ¨¡å¼ç¡çœ (微秒)" msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "未èšç„¦ä½Žè™•ç†å™¨ç¡çœ 模å¼ï¼ˆå¾®ç§’)" +msgstr "未èšç„¦æ™‚處ç†å™¨ç¯€èƒ½æ¨¡å¼ç¡çœ (微秒)" msgid "Separate Distraction Mode" -msgstr "ç¨ç«‹å°ˆæ³¨æ¨¡å¼" +msgstr "將專注模å¼åˆ†é›¢" msgid "Automatically Open Screenshots" msgstr "自動開啟截圖" +msgid "Single Window Mode" +msgstr "單視窗模å¼" + msgid "Mouse Extra Buttons Navigate History" -msgstr "使用é¡å¤–æ»‘é¼ æŒ‰éµæŸ¥çœ‹æ·å²" +msgstr "ä½¿ç”¨è¿½åŠ æ»‘é¼ æŒ‰éµä»¥æŸ¥çœ‹æ·å²ç´€éŒ„" + +msgid "Save Each Scene on Quit" +msgstr "æ¯æ¬¡é€€å‡ºæ™‚儲å˜å ´æ™¯" + +msgid "Accept Dialog Cancel OK Buttons" +msgstr "接å—å°è©±æ¡†çš„å–消/確定按鈕" msgid "Theme" msgstr "主題" @@ -721,6 +796,9 @@ msgstr "幫助æºå—體大å°" msgid "Help Title Font Size" msgstr "幫助標題å—體大å°" +msgid "Editors" +msgstr "編輯器" + msgid "Grid Map" msgstr "ç¶²æ ¼åœ°åœ–" @@ -1129,6 +1207,9 @@ msgstr "輪廓尺寸" msgid "Variation" msgstr "變化" +msgid "Transform" +msgstr "變æ›" + msgid "Collada" msgstr "Collada" @@ -1153,15 +1234,9 @@ msgstr "建立自" msgid "Delimiter" msgstr "分隔符號" -msgid "Mode" -msgstr "模å¼" - msgid "Lossy Quality" msgstr "低å“質" -msgid "BPTC LDR" -msgstr "BPTC LDR" - msgid "Mipmaps" msgstr "Mipmap" @@ -1175,7 +1250,7 @@ msgid "Vertical" msgstr "åž‚ç›´" msgid "Layout" -msgstr "ç•«é¢é…ç½®" +msgstr "é…置;畫é¢ä½ˆå±€" msgid "Amount" msgstr "數é‡" @@ -1216,12 +1291,6 @@ msgstr "最佳化器" msgid "Max Angular Error" msgstr "最大角度誤差" -msgid "Compression" -msgstr "壓縮" - -msgid "Page Size" -msgstr "分é 大å°" - msgid "Nodes" msgstr "節點" @@ -1327,6 +1396,9 @@ msgstr "使用執行緒" msgid "Available URLs" msgstr "å¯ç”¨ URL" +msgid "Unset" +msgstr "未è¨ç½®" + msgid "Error" msgstr "錯誤" @@ -1444,9 +1516,6 @@ msgstr "執行緒" msgid "Thread Model" msgstr "執行緒模型" -msgid "Audio" -msgstr "音訊" - msgid "Handheld" msgstr "攜帶型" @@ -1477,15 +1546,18 @@ msgstr "iOS" msgid "Hide Home Indicator" msgstr "éš±è— Home æ©«æ¢" +msgid "Input Devices" +msgstr "輸入è£ç½®" + +msgid "Pointing" +msgstr "指點" + msgid "Boot Splash" msgstr "å•Ÿå‹•ç•«é¢" msgid "BG Color" msgstr "背景é¡è‰²" -msgid "Input Devices" -msgstr "輸入è£ç½®" - msgid "Environment" msgstr "環境" @@ -1495,21 +1567,24 @@ msgstr "é è¨æ¸…除é¡è‰²" msgid "Show Image" msgstr "顯示圖åƒ" +msgid "Image" +msgstr "圖åƒ" + msgid "Fullsize" msgstr "全尺寸" msgid "Use Filter" msgstr "使用篩é¸å™¨" +msgid "Icon" +msgstr "圖示" + msgid "Buffering" msgstr "ç·©è¡" msgid "Agile Event Flushing" msgstr "æ•æ·äº‹ä»¶åˆ·æ–°" -msgid "Pointing" -msgstr "指點" - msgid "Emulate Touch From Mouse" msgstr "ä»¥æ»‘é¼ æ¨¡æ“¬è§¸æŽ§" @@ -1531,12 +1606,15 @@ msgstr "專案" msgid "Main Loop Type" msgstr "主迴圈類型" +msgid "Stretch" +msgstr "伸縮" + +msgid "Aspect" +msgstr "æ–¹ä½" + msgid "Auto Accept Quit" msgstr "自動接å—退出" -msgid "GUI" -msgstr "圖形使用者介é¢" - msgid "Fonts" msgstr "å—é«”" @@ -1855,9 +1933,6 @@ msgstr "IGD 控制 URL" msgid "IGD Our Addr" msgstr "IGD 我方ä½å€" -msgid "Limits" -msgstr "é™åˆ¶" - msgid "WebRTC" msgstr "WebRTC" @@ -1903,9 +1978,6 @@ msgstr "自é©æ‡‰å‰æ™¯ 432 X 432" msgid "Adaptive Background 432 X 432" msgstr "自é©æ‡‰èƒŒæ™¯ 432 X 432" -msgid "Use Custom Build" -msgstr "使用自定義建構" - msgid "Min SDK" msgstr "æœ€å° SDK" @@ -1972,9 +2044,6 @@ msgstr "相機使用æè¿°" msgid "Microphone Usage Description" msgstr "麥克風使用æè¿°" -msgid "Icon" -msgstr "圖示" - msgid "Codesign" msgstr "程å¼ç¢¼ç°½ç« " @@ -2047,9 +2116,6 @@ msgstr "Apple 團隊 ID" msgid "Short Name" msgstr "çŸå稱" -msgid "Description" -msgstr "說明" - msgid "Publisher Display Name" msgstr "發布者顯示å稱" @@ -2161,9 +2227,6 @@ msgstr "路徑最大è·é›¢" msgid "Max Speed" msgstr "最大速度" -msgid "Transform" -msgstr "變æ›" - msgid "Rotation Degrees" msgstr "旋轉角度" @@ -2341,15 +2404,15 @@ msgstr "隨機延é²" msgid "Xfade Time" msgstr "Xfade 時間" -msgid "Reset" -msgstr "é‡è¨" - msgid "Add Amount" msgstr "å¢žåŠ æ•¸é‡" msgid "Blend Amount" msgstr "æ··åˆé‡" +msgid "Reset" +msgstr "é‡è¨" + msgid "Switch" msgstr "切æ›" @@ -2431,9 +2494,6 @@ msgstr "分é 大å°" msgid "Split Offset" msgstr "拆分å移" -msgid "Stretch" -msgstr "伸縮" - msgid "Current Tab" msgstr "當å‰åˆ†é " @@ -2494,9 +2554,6 @@ msgstr "最å°å°ºå¯¸" msgid "Max Size" msgstr "最大大å°" -msgid "Aspect" -msgstr "æ–¹ä½" - msgid "Format" msgstr "æ ¼å¼" @@ -2680,9 +2737,6 @@ msgstr "å³ä¸‹" msgid "Bottom Left" msgstr "左下" -msgid "Image" -msgstr "圖åƒ" - msgid "Image Size" msgstr "圖片大å°" @@ -2698,9 +2752,6 @@ msgstr "常數" msgid "Function" msgstr "函å¼" -msgid "Default Edge Connection Margin" -msgstr "é è¨é‚Šç·£é€£æŽ¥é‚Šè·" - msgid "Plane" msgstr "å¹³é¢" @@ -2719,11 +2770,8 @@ msgstr "FFT 大å°" msgid "Time Pullout (ms)" msgstr "撤離時間(毫秒)" -msgid "Sleep Threshold Linear" -msgstr "線性ç¡çœ 速度閾值" - -msgid "Sleep Threshold Angular" -msgstr "ç¡çœ 角速度閾值" +msgid "Default Edge Connection Margin" +msgstr "é è¨é‚Šç·£é€£æŽ¥é‚Šè·" msgid "Inverse Mass" msgstr "逆質é‡" @@ -2752,6 +2800,12 @@ msgstr "å€åŸŸé–“碰撞" msgid "Shape RID" msgstr "形狀RID" +msgid "Sleep Threshold Linear" +msgstr "線性ç¡çœ 速度閾值" + +msgid "Sleep Threshold Angular" +msgstr "ç¡çœ 角速度閾值" + msgid "Physics Engine" msgstr "物ç†å¼•æ“Ž" @@ -2773,18 +2827,6 @@ msgstr "啟用算繪迴圈" msgid "VRAM Compression" msgstr "VRAM壓縮" -msgid "Import BPTC" -msgstr "匯入BPTC" - -msgid "Import S3TC" -msgstr "匯入S3TC" - -msgid "Import ETC" -msgstr "匯入ETC" - -msgid "Import ETC2" -msgstr "匯入ETC2" - msgid "Force PNG" msgstr "強制 PNG" diff --git a/main/main.cpp b/main/main.cpp index 3aa9a44a21..ae3a6d2a94 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -72,6 +72,7 @@ #include "servers/movie_writer/movie_writer_mjpeg.h" #include "servers/navigation_server_2d.h" #include "servers/navigation_server_3d.h" +#include "servers/navigation_server_3d_dummy.h" #include "servers/physics_server_2d.h" #include "servers/physics_server_3d.h" #include "servers/register_server_types.h" @@ -93,13 +94,17 @@ #include "editor/editor_settings.h" #include "editor/editor_translation.h" #include "editor/progress_dialog.h" -#include "editor/project_converter_3_to_4.h" #include "editor/project_manager.h" #include "editor/register_editor_types.h" + #ifndef NO_EDITOR_SPLASH #include "main/splash_editor.gen.h" #endif -#endif + +#ifndef DISABLE_DEPRECATED +#include "editor/project_converter_3_to_4.h" +#endif // DISABLE_DEPRECATED +#endif // TOOLS_ENABLED #include "modules/modules_enabled.gen.h" // For mono. @@ -163,8 +168,10 @@ static OS::ProcessID editor_pid = 0; static bool found_project = false; static bool auto_build_solutions = false; static String debug_server_uri; +#ifndef DISABLE_DEPRECATED static int converter_max_kb_file = 4 * 1024; // 4MB static int converter_max_line_length = 100000; +#endif // DISABLE_DEPRECATED HashMap<Main::CLIScope, Vector<String>> forwardable_cli_arguments; #endif @@ -278,8 +285,21 @@ void finalize_display() { void initialize_navigation_server() { ERR_FAIL_COND(navigation_server_3d != nullptr); + // Init 3D Navigation Server navigation_server_3d = NavigationServer3DManager::new_default_server(); + + // Fall back to dummy if no default server has been registered. + if (!navigation_server_3d) { + WARN_PRINT_ONCE("No NavigationServer3D implementation has been registered! Falling back to a dummy implementation: navigation features will be unavailable."); + navigation_server_3d = memnew(NavigationServer3DDummy); + } + + // Should be impossible, but make sure it's not null. + ERR_FAIL_NULL_MSG(navigation_server_3d, "Failed to initialize NavigationServer3D."); + + // Init 2D Navigation Server navigation_server_2d = memnew(NavigationServer2D); + ERR_FAIL_NULL_MSG(navigation_server_2d, "Failed to initialize NavigationServer2D."); } void finalize_navigation_server() { @@ -423,10 +443,12 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" The target directory must exist.\n"); OS::get_singleton()->print(" --export-debug <preset> <path> Export the project in debug mode using the given preset and output path. See --export-release description for other considerations.\n"); OS::get_singleton()->print(" --export-pack <preset> <path> Export the project data only using the given preset and output path. The <path> extension determines whether it will be in PCK or ZIP format.\n"); +#ifndef DISABLE_DEPRECATED OS::get_singleton()->print(" --convert-3to4 [<max_file_kb>] [<max_line_size>]\n"); OS::get_singleton()->print(" Converts project from Godot 3.x to Godot 4.x.\n"); OS::get_singleton()->print(" --validate-conversion-3to4 [<max_file_kb>] [<max_line_size>]\n"); OS::get_singleton()->print(" Shows what elements will be renamed when converting project from Godot 3.x to Godot 4.x.\n"); +#endif // DISABLE_DEPRECATED OS::get_singleton()->print(" --doctool [<path>] Dump the engine API reference to the given <path> (defaults to current dir) in XML format, merging if existing files are found.\n"); OS::get_singleton()->print(" --no-docbase Disallow dumping the base types (used with --doctool).\n"); OS::get_singleton()->print(" --build-solutions Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n"); @@ -1108,6 +1130,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph editor = true; cmdline_tool = true; main_args.push_back(I->get()); +#ifndef DISABLE_DEPRECATED } else if (I->get() == "--convert-3to4") { // Actually handling is done in start(). cmdline_tool = true; @@ -1138,6 +1161,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } } } +#endif // DISABLE_DEPRECATED } else if (I->get() == "--doctool") { // Actually handling is done in start(). cmdline_tool = true; @@ -1147,7 +1171,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph audio_driver = NULL_AUDIO_DRIVER; display_driver = NULL_DISPLAY_DRIVER; main_args.push_back(I->get()); -#endif +#endif // TOOLS_ENABLED } else if (I->get() == "--path") { // set path of project to start or edit if (I->next()) { @@ -1819,7 +1843,6 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph GLOBAL_DEF("display/window/ios/hide_home_indicator", true); GLOBAL_DEF("display/window/ios/hide_status_bar", true); GLOBAL_DEF("display/window/ios/suppress_ui_gesture", true); - GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "input_devices/pointing/ios/touch_delay", PROPERTY_HINT_RANGE, "0,1,0.001"), 0.15); // XR project settings. GLOBAL_DEF_RST_BASIC("xr/openxr/enabled", false); @@ -2370,7 +2393,7 @@ bool Main::start() { bool converting_project = false; bool validating_converting_project = false; #endif // DISABLE_DEPRECATED -#endif +#endif // TOOLS_ENABLED main_timer_sync.init(OS::get_singleton()->get_ticks_usec()); List<String> args = OS::get_singleton()->get_cmdline_args(); @@ -2395,7 +2418,7 @@ bool Main::start() { editor = true; } else if (args[i] == "-p" || args[i] == "--project-manager") { project_manager = true; -#endif +#endif // TOOLS_ENABLED } else if (args[i].length() && args[i][0] != '-' && positional_arg.is_empty()) { positional_arg = args[i]; @@ -2553,18 +2576,22 @@ bool Main::start() { #ifndef DISABLE_DEPRECATED if (converting_project) { - int exit_code = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).convert(); - OS::get_singleton()->set_exit_code(exit_code); + int ret = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).convert(); + if (ret) { + OS::get_singleton()->set_exit_code(EXIT_SUCCESS); + } return false; } if (validating_converting_project) { - int exit_code = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).validate_conversion(); - OS::get_singleton()->set_exit_code(exit_code); + bool ret = ProjectConverter3To4(converter_max_kb_file, converter_max_line_length).validate_conversion(); + if (ret) { + OS::get_singleton()->set_exit_code(EXIT_SUCCESS); + } return false; } #endif // DISABLE_DEPRECATED -#endif +#endif // TOOLS_ENABLED if (script.is_empty() && game_path.is_empty() && String(GLOBAL_GET("application/run/main_scene")) != "") { game_path = GLOBAL_GET("application/run/main_scene"); diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 13c7a8202c..afb8e62eea 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -1255,6 +1255,30 @@ Vector3 CSGBox3D::get_size() const { return size; } +#ifndef DISABLE_DEPRECATED +// Kept for compatibility from 3.x to 4.0. +bool CSGBox3D::_set(const StringName &p_name, const Variant &p_value) { + if (p_name == "width") { + size.x = p_value; + _make_dirty(); + update_gizmos(); + return true; + } else if (p_name == "height") { + size.y = p_value; + _make_dirty(); + update_gizmos(); + return true; + } else if (p_name == "depth") { + size.z = p_value; + _make_dirty(); + update_gizmos(); + return true; + } else { + return false; + } +} +#endif + void CSGBox3D::set_material(const Ref<Material> &p_material) { material = p_material; _make_dirty(); diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h index 9012c37679..c244107bfb 100644 --- a/modules/csg/csg_shape.h +++ b/modules/csg/csg_shape.h @@ -248,6 +248,10 @@ class CSGBox3D : public CSGPrimitive3D { protected: static void _bind_methods(); +#ifndef DISABLE_DEPRECATED + // Kept for compatibility from 3.x to 4.0. + bool _set(const StringName &p_name, const Variant &p_value); +#endif public: void set_size(const Vector3 &p_size); diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 923b2fe30d..0b7e4e50e6 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -4,7 +4,7 @@ Built-in GDScript functions. </brief_description> <description> - A list of GDScript-specific utility functions accessed in any script. + A list of GDScript-specific utility functions and annotations accessible from any script. For the list of the global functions and constants see [@GlobalScope]. </description> <tutorials> @@ -20,7 +20,7 @@ <description> Returns a [Color] constructed from red ([param r8]), green ([param g8]), blue ([param b8]), and optionally alpha ([param a8]) integer channels, each divided by [code]255.0[/code] for their final value. [codeblock] - var red = Color8(255, 0, 0) # Same as Color(1, 0, 0) + var red = Color8(255, 0, 0) # Same as Color(1, 0, 0). var dark_blue = Color8(0, 0, 51) # Same as Color(0, 0, 0.2). var my_color = Color8(306, 255, 0, 102) # Same as Color(1.2, 1, 0, 0.4). [/codeblock] @@ -37,10 +37,10 @@ [codeblock] # Imagine we always want speed to be between 0 and 20. var speed = -10 - assert(speed < 20) # True, the program will continue - assert(speed >= 0) # False, the program will stop - assert(speed >= 0 and speed < 20) # You can also combine the two conditional statements in one check - assert(speed < 20, "the speed limit is 20") # Show a message + assert(speed < 20) # True, the program will continue. + assert(speed >= 0) # False, the program will stop. + assert(speed >= 0 and speed < 20) # You can also combine the two conditional statements in one check. + assert(speed < 20, "the speed limit is 20") # Show a message. [/codeblock] </description> </method> @@ -140,7 +140,7 @@ <param index="0" name="path" type="String" /> <description> Returns a [Resource] from the filesystem located at the absolute [param path]. Unless it's already referenced elsewhere (such as in another script or in the scene), the resource is loaded from disk on function call, which might cause a slight delay, especially when loading large scenes. To avoid unnecessary delays when loading something multiple times, either store the resource in a variable or use [method preload]. - [b]Note:[/b] Resource paths can be obtained by right-clicking on a resource in the FileSystem dock and choosing "Copy Path" or by dragging the file from the FileSystem dock into the script. + [b]Note:[/b] Resource paths can be obtained by right-clicking on a resource in the FileSystem dock and choosing "Copy Path", or by dragging the file from the FileSystem dock into the current script. [codeblock] # Load a scene called "main" located in the root of the project directory and cache it in a variable. var main = load("res://main.tscn") # main will contain a PackedScene resource. @@ -155,7 +155,7 @@ <param index="0" name="path" type="String" /> <description> Returns a [Resource] from the filesystem located at [param path]. During run-time, the resource is loaded when the script is being parsed. This function effectively acts as a reference to that resource. Note that this function requires [param path] to be a constant [String]. If you want to load a resource from a dynamic/variable path, use [method load]. - [b]Note:[/b] Resource paths can be obtained by right clicking on a resource in the Assets Panel and choosing "Copy Path" or by dragging the file from the FileSystem dock into the script. + [b]Note:[/b] Resource paths can be obtained by right-clicking on a resource in the Assets Panel and choosing "Copy Path", or by dragging the file from the FileSystem dock into the current script. [codeblock] # Create instance of a scene. var diamond = preload("res://diamond.tscn").instantiate() @@ -259,10 +259,12 @@ <annotation name="@export"> <return type="void" /> <description> - Mark the following property as exported (editable in the Inspector dock and saved to disk). To control the type of the exported property use the type hint notation. + Mark the following property as exported (editable in the Inspector dock and saved to disk). To control the type of the exported property, use the type hint notation. [codeblock] + @export var string = "" @export var int_number = 5 @export var float_number: float = 5 + @export var image : Image [/codeblock] </description> </annotation> @@ -273,20 +275,20 @@ Define a new category for the following exported properties. This helps to organize properties in the Inspector dock. See also [constant PROPERTY_USAGE_CATEGORY]. [codeblock] - @export_category("My Properties") - @export var number = 3 - @export var string = "" + @export_category("Statistics") + @export var hp = 30 + @export var speed = 1.25 [/codeblock] - [b]Note:[/b] Categories in the property list are supposed to indicate different base types, so the use of this annotation is not encouraged. See [annotation @export_group] and [annotation @export_subgroup] instead. + [b]Note:[/b] Categories in the Inspector dock's list usually divide properties coming from different classes (Node, Node2D, Sprite, etc.). For better clarity, it's recommended to use [annotation @export_group] and [annotation @export_subgroup], instead. </description> </annotation> <annotation name="@export_color_no_alpha"> <return type="void" /> <description> - Export a [Color] property without transparency (its alpha fixed as [code]1.0[/code]). + Export a [Color] property without allowing its transparency ([member Color.a]) to be edited. See also [constant PROPERTY_HINT_COLOR_NO_ALPHA]. [codeblock] - @export_color_no_alpha var modulate_color: Color + @export_color_no_alpha var dye_color : Color [/codeblock] </description> </annotation> @@ -296,7 +298,7 @@ Export a [String] property as a path to a directory. The path will be limited to the project folder and its subfolders. See [annotation @export_global_dir] to allow picking from the entire filesystem. See also [constant PROPERTY_HINT_DIR]. [codeblock] - @export_dir var sprite_folder: String + @export_dir var sprite_folder_path: String [/codeblock] </description> </annotation> @@ -343,8 +345,8 @@ If [param filter] is provided, only matching files will be available for picking. See also [constant PROPERTY_HINT_FILE]. [codeblock] - @export_file var sound_effect_file: String - @export_file("*.txt") var notes_file: String + @export_file var sound_effect_path: String + @export_file("*.txt") var notes_path: String [/codeblock] </description> </annotation> @@ -436,10 +438,10 @@ <annotation name="@export_global_dir"> <return type="void" /> <description> - Export a [String] property as a path to a directory. The path can be picked from the entire filesystem. See [annotation @export_dir] to limit it to the project folder and its subfolders. + Export a [String] property as an absolute path to a directory. The path can be picked from the entire filesystem. See [annotation @export_dir] to limit it to the project folder and its subfolders. See also [constant PROPERTY_HINT_GLOBAL_DIR]. [codeblock] - @export_global_dir var sprite_folder: String + @export_global_dir var sprite_folder_path: String [/codeblock] </description> </annotation> @@ -447,12 +449,12 @@ <return type="void" /> <param index="0" name="filter" type="String" default="""" /> <description> - Export a [String] property as a path to a file. The path can be picked from the entire filesystem. See [annotation @export_file] to limit it to the project folder and its subfolders. + Export a [String] property as an absolute path to a file. The path can be picked from the entire filesystem. See [annotation @export_file] to limit it to the project folder and its subfolders. If [param filter] is provided, only matching files will be available for picking. See also [constant PROPERTY_HINT_GLOBAL_FILE]. [codeblock] - @export_global_file var sound_effect_file: String - @export_global_file("*.txt") var notes_file: String + @export_global_file var sound_effect_path: String + @export_global_file("*.txt") var notes_path: String [/codeblock] </description> </annotation> @@ -466,13 +468,13 @@ Groups cannot be nested, use [annotation @export_subgroup] to add subgroups within groups. See also [constant PROPERTY_USAGE_GROUP]. [codeblock] - @export_group("My Properties") - @export var number = 3 - @export var string = "" + @export_group("Racer Properties") + @export var nickname = "Nick" + @export var age = 26 - @export_group("Prefixed Properties", "prefix_") - @export var prefix_number = 3 - @export var prefix_string = "" + @export_group("Car Properties", "car_") + @export var car_label = "Speedy" + @export var car_number = 3 @export_group("", "") @export var ungrouped_number = 3 @@ -544,13 +546,13 @@ Define a new subgroup for the following exported properties. This helps to organize properties in the Inspector dock. Subgroups work exactly like groups, except they need a parent group to exist. See [annotation @export_group]. See also [constant PROPERTY_USAGE_SUBGROUP]. [codeblock] - @export_group("My Properties") - @export var number = 3 - @export var string = "" + @export_group("Racer Properties") + @export var nickname = "Nick" + @export var age = 26 - @export_subgroup("My Prefixed Properties", "prefix_") - @export var prefix_number = 3 - @export var prefix_string = "" + @export_subgroup("Car Properties", "car_") + @export var car_label = "Speedy" + @export var car_number = 3 [/codeblock] [b]Note:[/b] Subgroups cannot be nested, they only provide one extra level of depth. Just like the next group ends the previous group, so do the subsequent subgroups. </description> @@ -571,7 +573,7 @@ <annotation name="@onready"> <return type="void" /> <description> - Mark the following property as assigned on [Node]'s ready state change. Values for these properties are not assigned immediately upon the node's creation, and instead are computed and stored right before [method Node._ready]. + Mark the following property as assigned when the [Node] is ready. Values for these properties are not assigned immediately when the node is initialized ([method Object._init]), and instead are computed and stored right before [method Node._ready]. [codeblock] @onready var character_name: Label = $Label [/codeblock] diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index a876229276..fe79f37454 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -2578,7 +2578,6 @@ GDScriptLanguage::GDScriptLanguage() { #ifdef DEBUG_ENABLED GLOBAL_DEF("debug/gdscript/warnings/enable", true); - GLOBAL_DEF("debug/gdscript/warnings/treat_warnings_as_errors", false); GLOBAL_DEF("debug/gdscript/warnings/exclude_addons", true); for (int i = 0; i < (int)GDScriptWarning::WARNING_MAX; i++) { GDScriptWarning::Code code = (GDScriptWarning::Code)i; diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 602d07d9a7..d0525be853 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -42,6 +42,11 @@ #include "gdscript_utility_functions.h" #include "scene/resources/packed_scene.h" +#if defined(TOOLS_ENABLED) && !defined(DISABLE_DEPRECATED) +#define SUGGEST_GODOT4_RENAMES +#include "editor/renames_map_3_to_4.h" +#endif + #define UNNAMED_ENUM "<anonymous enum>" #define ENUM_SEPARATOR "::" @@ -1737,6 +1742,7 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi } type.is_constant = is_constant; + type.is_read_only = false; p_assignable->set_datatype(type); } @@ -2601,9 +2607,8 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o p_binary_op->set_datatype(result); } -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED -const char *GDScriptAnalyzer::get_rename_from_map(const char *map[][2], String key) { +#ifdef SUGGEST_GODOT4_RENAMES +const char *get_rename_from_map(const char *map[][2], String key) { for (int index = 0; map[index][0]; index++) { if (map[index][0] == key) { return map[index][1]; @@ -2614,39 +2619,39 @@ const char *GDScriptAnalyzer::get_rename_from_map(const char *map[][2], String k // Checks if an identifier/function name has been renamed in Godot 4, uses ProjectConverter3To4 for rename map. // Returns the new name if found, nullptr otherwise. -const char *GDScriptAnalyzer::check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type) { +const char *check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type) { switch (type) { case GDScriptParser::Node::IDENTIFIER: { // Check properties - const char *result = get_rename_from_map(ProjectConverter3To4::gdscript_properties_renames, identifier); + const char *result = get_rename_from_map(RenamesMap3To4::gdscript_properties_renames, identifier); if (result) { return result; } // Check enum values - result = get_rename_from_map(ProjectConverter3To4::enum_renames, identifier); + result = get_rename_from_map(RenamesMap3To4::enum_renames, identifier); if (result) { return result; } // Check color constants - result = get_rename_from_map(ProjectConverter3To4::color_renames, identifier); + result = get_rename_from_map(RenamesMap3To4::color_renames, identifier); if (result) { return result; } // Check type names - result = get_rename_from_map(ProjectConverter3To4::class_renames, identifier); + result = get_rename_from_map(RenamesMap3To4::class_renames, identifier); if (result) { return result; } - return get_rename_from_map(ProjectConverter3To4::builtin_types_renames, identifier); + return get_rename_from_map(RenamesMap3To4::builtin_types_renames, identifier); } case GDScriptParser::Node::CALL: { - const char *result = get_rename_from_map(ProjectConverter3To4::gdscript_function_renames, identifier); + const char *result = get_rename_from_map(RenamesMap3To4::gdscript_function_renames, identifier); if (result) { return result; } // Built-in Types are mistaken for function calls when the built-in type is not found. // Check built-in types if function rename not found - return get_rename_from_map(ProjectConverter3To4::builtin_types_renames, identifier); + return get_rename_from_map(RenamesMap3To4::builtin_types_renames, identifier); } // Signal references don't get parsed through the GDScriptAnalyzer. No support for signal rename hints. default: @@ -2654,8 +2659,7 @@ const char *GDScriptAnalyzer::check_for_renamed_identifier(String identifier, GD return nullptr; } } -#endif // DISABLE_DEPRECATED -#endif // TOOLS_ENABLED +#endif // SUGGEST_GODOT4_RENAMES void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_await, bool p_is_root) { bool all_is_constant = true; @@ -3078,8 +3082,7 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a } if (!found && (is_self || (base_type.is_hard_type() && base_type.kind == GDScriptParser::DataType::BUILTIN))) { String base_name = is_self && !p_call->is_super ? "self" : base_type.to_string(); -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED +#ifdef SUGGEST_GODOT4_RENAMES String rename_hint = String(); if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) { const char *renamed_function_name = check_for_renamed_identifier(p_call->function_name, p_call->type); @@ -3088,12 +3091,9 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a } } push_error(vformat(R"*(Function "%s()" not found in base %s.%s)*", p_call->function_name, base_name, rename_hint), p_call->is_super ? p_call : p_call->callee); -#else // !DISABLE_DEPRECATED - push_error(vformat(R"*(Function "%s()" not found in base %s.)*", p_call->function_name, base_name), p_call->is_super ? p_call : p_call->callee); -#endif // DISABLE_DEPRECATED #else push_error(vformat(R"*(Function "%s()" not found in base %s.)*", p_call->function_name, base_name), p_call->is_super ? p_call : p_call->callee); -#endif +#endif // SUGGEST_GODOT4_RENAMES } else if (!found && (!p_call->is_super && base_type.is_hard_type() && base_type.kind == GDScriptParser::DataType::NATIVE && base_type.is_meta_type)) { push_error(vformat(R"*(Static function "%s()" not found in base "%s".)*", p_call->function_name, base_type.native_type), p_call); } @@ -3283,8 +3283,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod p_identifier->reduced_value = result; p_identifier->set_datatype(type_from_variant(result, p_identifier)); } else if (base.is_hard_type()) { -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED +#ifdef SUGGEST_GODOT4_RENAMES String rename_hint = String(); if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) { const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type); @@ -3293,12 +3292,9 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod } } push_error(vformat(R"(Cannot find constant "%s" on base "%s".%s)", name, base.to_string(), rename_hint), p_identifier); -#else // !DISABLE_DEPRECATED - push_error(vformat(R"(Cannot find constant "%s" on base "%s".)", name, base.to_string()), p_identifier); -#endif // DISABLE_DEPRECATED #else push_error(vformat(R"(Cannot find constant "%s" on base "%s".)", name, base.to_string()), p_identifier); -#endif +#endif // SUGGEST_GODOT4_RENAMES } } else { switch (base.builtin_type) { @@ -3327,8 +3323,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod } } if (base.is_hard_type()) { -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED +#ifdef SUGGEST_GODOT4_RENAMES String rename_hint = String(); if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) { const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type); @@ -3337,12 +3332,9 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod } } push_error(vformat(R"(Cannot find property "%s" on base "%s".%s)", name, base.to_string(), rename_hint), p_identifier); -#else // !DISABLE_DEPRECATED - push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier); -#endif // DISABLE_DEPRECATED #else push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier); -#endif +#endif // SUGGEST_GODOT4_RENAMES } } } @@ -3682,8 +3674,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident if (GDScriptUtilityFunctions::function_exists(name)) { push_error(vformat(R"(Built-in function "%s" cannot be used as an identifier.)", name), p_identifier); } else { -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED +#ifdef SUGGEST_GODOT4_RENAMES String rename_hint = String(); if (GLOBAL_GET(GDScriptWarning::get_settings_path_from_code(GDScriptWarning::Code::RENAMED_IN_GD4_HINT)).booleanize()) { const char *renamed_identifier_name = check_for_renamed_identifier(name, p_identifier->type); @@ -3692,12 +3683,9 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident } } push_error(vformat(R"(Identifier "%s" not declared in the current scope.%s)", name, rename_hint), p_identifier); -#else // !DISABLE_DEPRECATED - push_error(vformat(R"(Identifier "%s" not declared in the current scope.)", name), p_identifier); -#endif // DISABLE_DEPRECATED #else push_error(vformat(R"(Identifier "%s" not declared in the current scope.)", name), p_identifier); -#endif +#endif // SUGGEST_GODOT4_RENAMES } GDScriptParser::DataType dummy; dummy.kind = GDScriptParser::DataType::VARIANT; @@ -4291,11 +4279,15 @@ Variant GDScriptAnalyzer::make_variable_default_value(GDScriptParser::VariableNo } } else { GDScriptParser::DataType datatype = p_variable->get_datatype(); - if (datatype.is_hard_type() && datatype.kind == GDScriptParser::DataType::BUILTIN && datatype.builtin_type != Variant::OBJECT) { - if (datatype.builtin_type == Variant::ARRAY && datatype.has_container_element_type()) { - result = make_array_from_element_datatype(datatype.get_container_element_type()); - } else { - VariantInternal::initialize(&result, datatype.builtin_type); + if (datatype.is_hard_type()) { + if (datatype.kind == GDScriptParser::DataType::BUILTIN && datatype.builtin_type != Variant::OBJECT) { + if (datatype.builtin_type == Variant::ARRAY && datatype.has_container_element_type()) { + result = make_array_from_element_datatype(datatype.get_container_element_type()); + } else { + VariantInternal::initialize(&result, datatype.builtin_type); + } + } else if (datatype.kind == GDScriptParser::DataType::ENUM) { + result = 0; } } } diff --git a/modules/gdscript/gdscript_analyzer.h b/modules/gdscript/gdscript_analyzer.h index a4c84db6b9..cdeba374c7 100644 --- a/modules/gdscript/gdscript_analyzer.h +++ b/modules/gdscript/gdscript_analyzer.h @@ -37,10 +37,6 @@ #include "gdscript_cache.h" #include "gdscript_parser.h" -#ifdef TOOLS_ENABLED -#include "editor/project_converter_3_to_4.h" -#endif - class GDScriptAnalyzer { GDScriptParser *parser = nullptr; HashMap<String, Ref<GDScriptParserRef>> depended_parsers; @@ -137,13 +133,6 @@ class GDScriptAnalyzer { bool is_shadowing(GDScriptParser::IdentifierNode *p_local, const String &p_context); #endif -#ifdef TOOLS_ENABLED -#ifndef DISABLE_DEPRECATED - const char *get_rename_from_map(const char *map[][2], String key); - const char *check_for_renamed_identifier(String identifier, GDScriptParser::Node::Type type); -#endif // DISABLE_DEPRECATED -#endif // TOOLS_ENABLED - public: Error resolve_inheritance(); Error resolve_interface(); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 3543c0a79f..8cfd48b52b 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -3491,14 +3491,6 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co break; } - if (context.current_class) { - if (context.type != GDScriptParser::COMPLETION_SUPER_METHOD) { - base.type = context.current_class->get_datatype(); - } else { - base.type = context.current_class->base_type; - } - } - if (_lookup_symbol_from_base(base.type, p_symbol, is_function, r_result) == OK) { return OK; } diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index c6e4222213..b5cb5a4680 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -175,7 +175,7 @@ void GDScriptParser::push_warning(const Node *p_source, GDScriptWarning::Code p_ warning.leftmost_column = p_source->leftmost_column; warning.rightmost_column = p_source->rightmost_column; - if (warn_level == GDScriptWarning::WarnLevel::ERROR || bool(GLOBAL_GET("debug/gdscript/warnings/treat_warnings_as_errors"))) { + if (warn_level == GDScriptWarning::WarnLevel::ERROR) { push_error(warning.get_message() + String(" (Warning treated as error.)"), p_source); return; } @@ -483,24 +483,34 @@ void GDScriptParser::parse_program() { current_class = head; bool can_have_class_or_extends = true; - while (match(GDScriptTokenizer::Token::ANNOTATION)) { - AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL); - if (annotation != nullptr) { - if (annotation->applies_to(AnnotationInfo::SCRIPT)) { - // `@icon` needs to be applied in the parser. See GH-72444. - if (annotation->name == SNAME("@icon")) { - annotation->apply(this, head); + while (!check(GDScriptTokenizer::Token::TK_EOF)) { + if (match(GDScriptTokenizer::Token::ANNOTATION)) { + AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::STANDALONE | AnnotationInfo::CLASS_LEVEL); + if (annotation != nullptr) { + if (annotation->applies_to(AnnotationInfo::SCRIPT)) { + // `@icon` needs to be applied in the parser. See GH-72444. + if (annotation->name == SNAME("@icon")) { + annotation->apply(this, head); + } else { + head->annotations.push_back(annotation); + } } else { - head->annotations.push_back(annotation); + annotation_stack.push_back(annotation); + // This annotation must appear after script-level annotations + // and class_name/extends (ex: could be @onready or @export), + // so we stop looking for script-level stuff. + can_have_class_or_extends = false; + break; } - } else { - annotation_stack.push_back(annotation); - // This annotation must appear after script-level annotations - // and class_name/extends (ex: could be @onready or @export), - // so we stop looking for script-level stuff. - can_have_class_or_extends = false; - break; } + } else if (check(GDScriptTokenizer::Token::LITERAL) && current.literal.get_type() == Variant::STRING) { + // Allow strings in class body as multiline comments. + advance(); + if (!match(GDScriptTokenizer::Token::NEWLINE)) { + push_error("Expected newline after comment string."); + } + } else { + break; } } @@ -524,6 +534,16 @@ void GDScriptParser::parse_program() { end_statement("superclass"); } break; + case GDScriptTokenizer::Token::LITERAL: + if (current.literal.get_type() == Variant::STRING) { + // Allow strings in class body as multiline comments. + advance(); + if (!match(GDScriptTokenizer::Token::NEWLINE)) { + push_error("Expected newline after comment string."); + } + break; + } + [[fallthrough]]; default: // No tokens are allowed between script annotations and class/extends. can_have_class_or_extends = false; @@ -829,6 +849,16 @@ void GDScriptParser::parse_class_body(bool p_is_multiline) { case GDScriptTokenizer::Token::DEDENT: class_end = true; break; + case GDScriptTokenizer::Token::LITERAL: + if (current.literal.get_type() == Variant::STRING) { + // Allow strings in class body as multiline comments. + advance(); + if (!match(GDScriptTokenizer::Token::NEWLINE)) { + push_error("Expected newline after comment string."); + } + break; + } + [[fallthrough]]; default: // Display a completion with identifiers. make_completion_context(COMPLETION_IDENTIFIER, nullptr); @@ -1675,6 +1705,12 @@ GDScriptParser::Node *GDScriptParser::parse_statement() { // Standalone lambdas can't be used, so make this an error. push_error("Standalone lambdas cannot be accessed. Consider assigning it to a variable.", expression); break; + case Node::LITERAL: + if (static_cast<GDScriptParser::LiteralNode *>(expression)->value.get_type() == Variant::STRING) { + // Allow strings as multiline comments. + break; + } + [[fallthrough]]; default: push_warning(expression, GDScriptWarning::STANDALONE_EXPRESSION); } @@ -2145,7 +2181,12 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_precedence(Precedence p_pr make_completion_context(COMPLETION_IDENTIFIER, nullptr); GDScriptTokenizer::Token token = current; - ParseFunction prefix_rule = get_rule(token.type)->prefix; + GDScriptTokenizer::Token::Type token_type = token.type; + if (token.is_identifier()) { + // Allow keywords that can be treated as identifiers. + token_type = GDScriptTokenizer::Token::IDENTIFIER; + } + ParseFunction prefix_rule = get_rule(token_type)->prefix; if (prefix_rule == nullptr) { // Expected expression. Let the caller give the proper error message. @@ -3010,7 +3051,14 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p path_state = PATH_STATE_NODE_NAME; } else if (current.is_node_name()) { advance(); - get_node->full_path += previous.get_identifier(); + String identifier = previous.get_identifier(); +#ifdef DEBUG_ENABLED + // Check spoofing. + if (TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY) && TS->spoof_check(identifier)) { + push_warning(get_node, GDScriptWarning::CONFUSABLE_IDENTIFIER, identifier); + } +#endif + get_node->full_path += identifier; path_state = PATH_STATE_NODE_NAME; } else if (!check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) { diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp index d7f1114fd3..d586380c41 100644 --- a/modules/gdscript/gdscript_tokenizer.cpp +++ b/modules/gdscript/gdscript_tokenizer.cpp @@ -168,7 +168,11 @@ bool GDScriptTokenizer::Token::is_identifier() const { switch (type) { case IDENTIFIER: case MATCH: // Used in String.match(). - case CONST_INF: // Used in Vector{2,3,4}.INF + // Allow constants to be treated as regular identifiers. + case CONST_PI: + case CONST_INF: + case CONST_NAN: + case CONST_TAU: return true; default: return false; @@ -188,6 +192,10 @@ bool GDScriptTokenizer::Token::is_node_name() const { case CLASS_NAME: case CLASS: case CONST: + case CONST_PI: + case CONST_INF: + case CONST_NAN: + case CONST_TAU: case CONTINUE: case ELIF: case ELSE: @@ -530,9 +538,12 @@ void GDScriptTokenizer::make_keyword_list() { #endif // DEBUG_ENABLED GDScriptTokenizer::Token GDScriptTokenizer::potential_identifier() { + bool only_ascii = _peek(-1) < 128; + // Consume all identifier characters. while (is_unicode_identifier_continue(_peek())) { - _advance(); + char32_t c = _advance(); + only_ascii = only_ascii && c < 128; } int len = _current - _start; @@ -587,7 +598,7 @@ GDScriptTokenizer::Token GDScriptTokenizer::potential_identifier() { #ifdef DEBUG_ENABLED // Additional checks for identifiers but only in debug and if it's available in TextServer. - if (TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY)) { + if (!only_ascii && TS->has_feature(TextServer::FEATURE_UNICODE_SECURITY)) { int64_t confusable = TS->is_confusable(name, keyword_list); if (confusable >= 0) { push_error(vformat(R"(Identifier "%s" is visually similar to the GDScript keyword "%s" and thus not allowed.)", name, keyword_list[confusable])); diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp index 6c26e226a5..7a11ea52f0 100644 --- a/modules/gdscript/gdscript_vm.cpp +++ b/modules/gdscript/gdscript_vm.cpp @@ -447,6 +447,9 @@ void (*type_init_function_table[])(Variant *) = { #define OP_GET_BASIS get_basis #define OP_GET_RID get_rid +#define METHOD_CALL_ON_NULL_VALUE_ERROR(method_pointer) "Cannot call method '" + (method_pointer)->get_name() + "' on a null value." +#define METHOD_CALL_ON_FREED_INSTANCE_ERROR(method_pointer) "Cannot call method '" + (method_pointer)->get_name() + "' on a previously freed instance." + Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Callable::CallError &r_err, CallState *p_state) { OPCODES_TABLE; @@ -1675,10 +1678,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a bool freed = false; Object *base_obj = base->get_validated_object_with_check(freed); if (freed) { - err_text = "Trying to call a function on a previously freed instance."; + err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method); OPCODE_BREAK; } else if (!base_obj) { - err_text = "Trying to call a function on a null value."; + err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method); OPCODE_BREAK; } #else @@ -1839,10 +1842,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a bool freed = false; \ Object *base_obj = base->get_validated_object_with_check(freed); \ if (freed) { \ - err_text = "Trying to call a function on a previously freed instance."; \ + err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method); \ OPCODE_BREAK; \ } else if (!base_obj) { \ - err_text = "Trying to call a function on a null value."; \ + err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method); \ OPCODE_BREAK; \ } \ const void **argptrs = call_args_ptr; \ @@ -1941,10 +1944,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a bool freed = false; Object *base_obj = base->get_validated_object_with_check(freed); if (freed) { - err_text = "Trying to call a function on a previously freed instance."; + err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method); OPCODE_BREAK; } else if (!base_obj) { - err_text = "Trying to call a function on a null value."; + err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method); OPCODE_BREAK; } #else @@ -1969,7 +1972,13 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a VariantInternal::initialize(ret, Variant::OBJECT); Object **ret_opaque = VariantInternal::get_object(ret); method->ptrcall(base_obj, argptrs, ret_opaque); - VariantInternal::update_object_id(ret); + if (method->is_return_type_raw_object_ptr()) { + // The Variant has to participate in the ref count since the method returns a raw Object *. + VariantInternal::object_assign(ret, *ret_opaque); + } else { + // The method, in case it returns something, returns an already encapsulated object. + VariantInternal::update_object_id(ret); + } #ifdef DEBUG_ENABLED if (GDScriptLanguage::get_singleton()->profiling) { @@ -1996,10 +2005,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a bool freed = false; Object *base_obj = base->get_validated_object_with_check(freed); if (freed) { - err_text = "Trying to call a function on a previously freed instance."; + err_text = METHOD_CALL_ON_FREED_INSTANCE_ERROR(method); OPCODE_BREAK; } else if (!base_obj) { - err_text = "Trying to call a function on a null value."; + err_text = METHOD_CALL_ON_NULL_VALUE_ERROR(method); OPCODE_BREAK; } #else diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp index b9e6921034..35fbdca949 100644 --- a/modules/gdscript/language_server/gdscript_text_document.cpp +++ b/modules/gdscript/language_server/gdscript_text_document.cpp @@ -108,6 +108,7 @@ void GDScriptTextDocument::didSave(const Variant &p_param) { scr->reload(true); } scr->update_exports(); + ScriptEditor::get_singleton()->reload_scripts(true); ScriptEditor::get_singleton()->update_docs_from_script(scr); } } diff --git a/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd b/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd index 092ae49d00..7416ecd87a 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/typed_array_usage.gd @@ -86,7 +86,8 @@ func test(): var typed_int := 556 var converted_floats: Array[float] = [typed_int] - assert(str(converted_floats) == '[556]') + converted_floats.push_back(498) + assert(str(converted_floats) == '[556, 498]') assert(converted_floats.get_typed_builtin() == TYPE_FLOAT) diff --git a/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd new file mode 100644 index 0000000000..390d314b94 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.gd @@ -0,0 +1,3 @@ +func test(): + var P1 = "ok" # Technically it is visually similar to keyword "PI" but allowed since it's in ASCII range. + print(P1) diff --git a/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out new file mode 100644 index 0000000000..1b47ed10dc --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allow_id_similar_to_keyword_in_ascii.out @@ -0,0 +1,2 @@ +GDTEST_OK +ok diff --git a/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd new file mode 100644 index 0000000000..3ecd65ad9c --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.gd @@ -0,0 +1,21 @@ +""" +This is a comment. +""" + +@tool + +""" +This is also a comment. +""" + +extends RefCounted + +''' +This is a comment too. +''' + +func test(): + """ + This too is a comment. + """ + print("ok") diff --git a/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out new file mode 100644 index 0000000000..1b47ed10dc --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allow_strings_as_comments.out @@ -0,0 +1,2 @@ +GDTEST_OK +ok diff --git a/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd new file mode 100644 index 0000000000..7e1982597c --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.gd @@ -0,0 +1,16 @@ +func test(): + # The following keywords are allowed as identifiers: + var match = "match" + print(match) + + var PI = "PI" + print(PI) + + var INF = "INF" + print(INF) + + var NAN = "NAN" + print(NAN) + + var TAU = "TAU" + print(TAU) diff --git a/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out new file mode 100644 index 0000000000..aae2ae13d5 --- /dev/null +++ b/modules/gdscript/tests/scripts/parser/features/allowed_keywords_as_identifiers.out @@ -0,0 +1,6 @@ +GDTEST_OK +match +PI +INF +NAN +TAU diff --git a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd index e2caac8ffd..41b38c4bba 100644 --- a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd +++ b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.gd @@ -1,5 +1,12 @@ +extends Node + func test(): var port = 0 # Only latin characters. var pοrt = 1 # The "ο" is Greek omicron. prints(port, pοrt) + +# Do not call this since nodes aren't in the tree. It is just a parser check. +func nodes(): + var _node1 = $port # Only latin characters. + var _node2 = $pοrt # The "ο" is Greek omicron. diff --git a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out index c483396443..c189204285 100644 --- a/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out +++ b/modules/gdscript/tests/scripts/parser/warnings/confusable_identifier.out @@ -1,6 +1,10 @@ GDTEST_OK >> WARNING ->> Line: 3 +>> Line: 5 +>> CONFUSABLE_IDENTIFIER +>> The identifier "pοrt" has misleading characters and might be confused with something else. +>> WARNING +>> Line: 12 >> CONFUSABLE_IDENTIFIER >> The identifier "pοrt" has misleading characters and might be confused with something else. 0 1 diff --git a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd index 18ea260fa2..dc4223ec2d 100644 --- a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd +++ b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.gd @@ -1,6 +1,5 @@ func test(): # The following statements should all be reported as standalone expressions: - "This is a standalone expression" 1234 0.0 + 0.0 Color(1, 1, 1) diff --git a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out index 99ec87438e..a2c67a6e51 100644 --- a/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out +++ b/modules/gdscript/tests/scripts/parser/warnings/standalone_expression.out @@ -8,14 +8,10 @@ GDTEST_OK >> STANDALONE_EXPRESSION >> Standalone expression (the line has no effect). >> WARNING ->> Line: 5 +>> Line: 6 >> STANDALONE_EXPRESSION >> Standalone expression (the line has no effect). >> WARNING >> Line: 7 >> STANDALONE_EXPRESSION >> Standalone expression (the line has no effect). ->> WARNING ->> Line: 8 ->> STANDALONE_EXPRESSION ->> Standalone expression (the line has no effect). diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index 520f33261a..7dcdc8e7cf 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -214,7 +214,14 @@ Node *EditorSceneFormatImporterBlend::import_scene(const String &p_path, uint32_ } return nullptr; } + +#ifndef DISABLE_DEPRECATED + bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false; + bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true; + return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable); +#else return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]); +#endif } Variant EditorSceneFormatImporterBlend::get_option_visibility(const String &p_path, bool p_for_animation, const String &p_option, diff --git a/modules/gltf/editor/editor_scene_importer_fbx.cpp b/modules/gltf/editor/editor_scene_importer_fbx.cpp index d829630032..f8f458fcc7 100644 --- a/modules/gltf/editor/editor_scene_importer_fbx.cpp +++ b/modules/gltf/editor/editor_scene_importer_fbx.cpp @@ -100,7 +100,14 @@ Node *EditorSceneFormatImporterFBX::import_scene(const String &p_path, uint32_t } return nullptr; } + +#ifndef DISABLE_DEPRECATED + bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false; + bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true; + return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable); +#else return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]); +#endif } Variant EditorSceneFormatImporterFBX::get_option_visibility(const String &p_path, bool p_for_animation, diff --git a/modules/gltf/editor/editor_scene_importer_gltf.cpp b/modules/gltf/editor/editor_scene_importer_gltf.cpp index 012a144d52..5339275439 100644 --- a/modules/gltf/editor/editor_scene_importer_gltf.cpp +++ b/modules/gltf/editor/editor_scene_importer_gltf.cpp @@ -47,15 +47,15 @@ void EditorSceneFormatImporterGLTF::get_extensions(List<String> *r_extensions) c Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t p_flags, const HashMap<StringName, Variant> &p_options, List<String> *r_missing_deps, Error *r_err) { - Ref<GLTFDocument> doc; - doc.instantiate(); + Ref<GLTFDocument> gltf; + gltf.instantiate(); Ref<GLTFState> state; state.instantiate(); if (p_options.has("gltf/embedded_image_handling")) { int32_t enum_option = p_options["gltf/embedded_image_handling"]; state->set_handle_binary_image(enum_option); } - Error err = doc->append_from_file(p_path, state, p_flags); + Error err = gltf->append_from_file(p_path, state, p_flags); if (err != OK) { if (r_err) { *r_err = err; @@ -67,21 +67,11 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t } #ifndef DISABLE_DEPRECATED - if (p_options.has("animation/trimming")) { - if (p_options.has("animation/remove_immutable_tracks")) { - return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]); - } else { - return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], true); - } - } else { - if (p_options.has("animation/remove_immutable_tracks")) { - return doc->generate_scene(state, (float)p_options["animation/fps"], false, (bool)p_options["animation/remove_immutable_tracks"]); - } else { - return doc->generate_scene(state, (float)p_options["animation/fps"], false, true); - } - } + bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false; + bool remove_immutable = p_options.has("animation/remove_immutable_tracks") ? (bool)p_options["animation/remove_immutable_tracks"] : true; + return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, remove_immutable); #else - return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]); + return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], (bool)p_options["animation/remove_immutable_tracks"]); #endif } diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 028028a103..e3ba290eb2 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -3285,7 +3285,6 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> p_state, const String &p_base_p tex.instantiate(); tex->set_name(img->get_name()); tex->set_keep_compressed_buffer(true); - p_state->source_images.push_back(img); tex->create_from_image(img, PortableCompressedTexture2D::COMPRESSION_MODE_BASIS_UNIVERSAL); p_state->images.push_back(tex); p_state->source_images.push_back(img); diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs index 1e4fd2f09a..7c02f29606 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs @@ -12,6 +12,7 @@ namespace GodotTools.Build public sealed partial class BuildInfo : RefCounted // TODO Remove RefCounted once we have proper serialization { public string Solution { get; private set; } + public string Project { get; private set; } public string Configuration { get; private set; } public string? RuntimeIdentifier { get; private set; } public string? PublishOutputDir { get; private set; } @@ -28,6 +29,7 @@ namespace GodotTools.Build { return obj is BuildInfo other && other.Solution == Solution && + other.Project == Project && other.Configuration == Configuration && other.RuntimeIdentifier == RuntimeIdentifier && other.PublishOutputDir == PublishOutputDir && other.Restore == Restore && other.Rebuild == Rebuild && other.OnlyClean == OnlyClean && @@ -41,6 +43,7 @@ namespace GodotTools.Build { int hash = 17; hash = (hash * 29) + Solution.GetHashCode(); + hash = (hash * 29) + Project.GetHashCode(); hash = (hash * 29) + Configuration.GetHashCode(); hash = (hash * 29) + (RuntimeIdentifier?.GetHashCode() ?? 0); hash = (hash * 29) + (PublishOutputDir?.GetHashCode() ?? 0); @@ -57,22 +60,25 @@ namespace GodotTools.Build private BuildInfo() { Solution = string.Empty; + Project = string.Empty; Configuration = string.Empty; } - public BuildInfo(string solution, string configuration, bool restore, bool rebuild, bool onlyClean) + public BuildInfo(string solution, string project, string configuration, bool restore, bool rebuild, bool onlyClean) { Solution = solution; + Project = project; Configuration = configuration; Restore = restore; Rebuild = rebuild; OnlyClean = onlyClean; } - public BuildInfo(string solution, string configuration, string runtimeIdentifier, + public BuildInfo(string solution, string project, string configuration, string runtimeIdentifier, string publishOutputDir, bool restore, bool rebuild, bool onlyClean) { Solution = solution; + Project = project; Configuration = configuration; RuntimeIdentifier = runtimeIdentifier; PublishOutputDir = publishOutputDir; diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs index 349f9d0cb8..ed3a4c6e26 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs @@ -262,7 +262,7 @@ namespace GodotTools.Build bool onlyClean = false ) { - var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, configuration, + var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, GodotSharpDirs.ProjectCsProjPath, configuration, restore: true, rebuild, onlyClean); // If a platform was not specified, try determining the current one. If that fails, let MSBuild auto-detect it. @@ -282,7 +282,7 @@ namespace GodotTools.Build [DisallowNull] string publishOutputDir ) { - var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, configuration, + var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, GodotSharpDirs.ProjectCsProjPath, configuration, runtimeIdentifier, publishOutputDir, restore: true, rebuild: false, onlyClean: false); buildInfo.CustomProperties.Add($"GodotTargetPlatform={platform}"); diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs index d6549c1b70..d550c36b82 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildSystem.cs @@ -139,8 +139,8 @@ namespace GodotTools.Build // `dotnet clean` / `dotnet build` commands arguments.Add(buildInfo.OnlyClean ? "clean" : "build"); - // Solution - arguments.Add(buildInfo.Solution); + // C# Project + arguments.Add(buildInfo.Project); // `dotnet clean` doesn't recognize these options if (!buildInfo.OnlyClean) @@ -180,8 +180,8 @@ namespace GodotTools.Build { arguments.Add("publish"); // `dotnet publish` command - // Solution - arguments.Add(buildInfo.Solution); + // C# Project + arguments.Add(buildInfo.Project); // Restore // `dotnet publish` restores by default, unless requested not to diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 43ead4af69..060c01b3f9 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -272,8 +272,7 @@ namespace GodotTools } } - string resourcePath = ProjectSettings.GlobalizePath("res://"); - args.Add(resourcePath); + args.Add(Path.GetDirectoryName(GodotSharpDirs.ProjectSlnPath)); string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath); diff --git a/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs b/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs index 3226ca79e5..6b000cc89b 100644 --- a/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs +++ b/modules/mono/glue/GodotSharp/Godot.SourceGenerators.Internal/UnmanagedCallbacksGenerator.cs @@ -168,7 +168,9 @@ using Godot.NativeInterop; { var parameter = callback.Parameters[i]; - source.Append(parameter.ToDisplayString()); + AppendRefKind(source, parameter.RefKind); + source.Append(' '); + source.Append(parameter.Type.FullQualifiedNameIncludeGlobal()); source.Append(' '); source.Append(parameter.Name); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs index 027eab30fc..79030c79cc 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotSynchronizationContext.cs @@ -1,17 +1,44 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; using System.Threading; +using System.Threading.Tasks; namespace Godot { public sealed class GodotSynchronizationContext : SynchronizationContext, IDisposable { - private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue = new(); + private readonly BlockingCollection<(SendOrPostCallback Callback, object State)> _queue = new(); + + public override void Send(SendOrPostCallback d, object state) + { + // Shortcut if we're already on this context + // Also necessary to avoid a deadlock, since Send is blocking + if (Current == this) + { + d(state); + return; + } + + var source = new TaskCompletionSource(); + + _queue.Add((st => + { + try + { + d(st); + } + finally + { + source.SetResult(); + } + }, state)); + + source.Task.Wait(); + } public override void Post(SendOrPostCallback d, object state) { - _queue.Add(new KeyValuePair<SendOrPostCallback, object>(d, state)); + _queue.Add((d, state)); } /// <summary> @@ -21,7 +48,7 @@ namespace Godot { while (_queue.TryTake(out var workItem)) { - workItem.Key(workItem.Value); + workItem.Callback(workItem.State); } } diff --git a/modules/multiplayer/multiplayer_spawner.cpp b/modules/multiplayer/multiplayer_spawner.cpp index 0aa54b69f9..4b1b6b541d 100644 --- a/modules/multiplayer/multiplayer_spawner.cpp +++ b/modules/multiplayer/multiplayer_spawner.cpp @@ -103,6 +103,15 @@ void MultiplayerSpawner::add_spawnable_scene(const String &p_path) { ERR_FAIL_COND(!FileAccess::exists(p_path)); } spawnable_scenes.push_back(sc); +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + return; + } +#endif + Node *node = get_spawn_node(); + if (spawnable_scenes.size() == 1 && node && !node->is_connected("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added))) { + node->connect("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added)); + } } int MultiplayerSpawner::get_spawnable_scene_count() const { @@ -116,6 +125,15 @@ String MultiplayerSpawner::get_spawnable_scene(int p_idx) const { void MultiplayerSpawner::clear_spawnable_scenes() { spawnable_scenes.clear(); +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + return; + } +#endif + Node *node = get_spawn_node(); + if (node && node->is_connected("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added))) { + node->disconnect("child_entered_tree", callable_mp(this, &MultiplayerSpawner::_node_added)); + } } Vector<String> MultiplayerSpawner::_get_spawnable_scenes() const { diff --git a/modules/multiplayer/scene_replication_interface.cpp b/modules/multiplayer/scene_replication_interface.cpp index 3466cb10df..68b6bc4a24 100644 --- a/modules/multiplayer/scene_replication_interface.cpp +++ b/modules/multiplayer/scene_replication_interface.cpp @@ -742,6 +742,7 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu ofs += 4; uint32_t size = decode_uint32(&p_buffer[ofs]); ofs += 4; + ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_INVALID_DATA); MultiplayerSynchronizer *sync = nullptr; if (net_id & 0x80000000) { sync = Object::cast_to<MultiplayerSynchronizer>(multiplayer->get_path_cache()->get_cached_object(p_from, net_id & 0x7FFFFFFF)); @@ -756,14 +757,15 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu } Node *node = sync->get_root_node(); if (sync->get_multiplayer_authority() != p_from || !node) { - ERR_CONTINUE(true); + // Not valid for me. + ofs += size; + ERR_CONTINUE_MSG(true, "Ignoring sync data from non-authority or for missing node."); } if (!sync->update_inbound_sync_time(time)) { // State is too old. ofs += size; continue; } - ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_BUG); const List<NodePath> props = sync->get_replication_config()->get_sync_properties(); Vector<Variant> vars; vars.resize(props.size()); diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index c3cb1c5f13..79e8c3a6d6 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -757,7 +757,7 @@ COMMAND_1(free, RID, p_object) { agent_owner.free(p_object); } else { - ERR_FAIL_COND("Invalid ID."); + ERR_FAIL_COND("Attempted to free a NavigationServer RID that did not exist (or was already freed)."); } } diff --git a/modules/webp/SCsub b/modules/webp/SCsub index 72ad1ea5e4..e78236a60b 100644 --- a/modules/webp/SCsub +++ b/modules/webp/SCsub @@ -13,6 +13,7 @@ if env["builtin_libwebp"]: thirdparty_dir = "#thirdparty/libwebp/" thirdparty_sources = [ "sharpyuv/sharpyuv.c", + "sharpyuv/sharpyuv_cpu.c", "sharpyuv/sharpyuv_csp.c", "sharpyuv/sharpyuv_dsp.c", "sharpyuv/sharpyuv_gamma.c", diff --git a/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml b/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml index aaeb2025ee..e0d17277ef 100644 --- a/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml +++ b/modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml @@ -16,7 +16,7 @@ <param index="1" name="tls_client_options" type="TLSOptions" default="null" /> <description> Starts a new multiplayer client connecting to the given [param url]. TLS certificates will be verified against the hostname when connecting using the [code]wss://[/code] protocol. You can pass the optional [param tls_client_options] parameter to customize the trusted certification authorities, or disable the common name verification. See [method TLSOptions.client] and [method TLSOptions.client_unsafe]. - [b]Note[/b]: It is recommended to specify the scheme part of the URL, i.e. the [param url] should start with either [code]ws://[/code] or [code]wss://[/code]. + [b]Note:[/b] It is recommended to specify the scheme part of the URL, i.e. the [param url] should start with either [code]ws://[/code] or [code]wss://[/code]. </description> </method> <method name="create_server"> diff --git a/modules/webxr/native/library_godot_webxr.js b/modules/webxr/native/library_godot_webxr.js index 1c00ebebb4..5c01d88a30 100644 --- a/modules/webxr/native/library_godot_webxr.js +++ b/modules/webxr/native/library_godot_webxr.js @@ -584,12 +584,11 @@ const GodotWebXR = { } const buf = GodotRuntime.malloc(point_count * 3 * 4); - GodotRuntime.setHeapValue(buf, point_count, 'i32'); for (let i = 0; i < point_count; i++) { const point = GodotWebXR.space.boundsGeometry[i]; - GodotRuntime.setHeapValue(buf + ((i * 3) + 1) * 4, point.x, 'float'); - GodotRuntime.setHeapValue(buf + ((i * 3) + 2) * 4, point.y, 'float'); - GodotRuntime.setHeapValue(buf + ((i * 3) + 3) * 4, point.z, 'float'); + GodotRuntime.setHeapValue(buf + ((i * 3) + 0) * 4, point.x, 'float'); + GodotRuntime.setHeapValue(buf + ((i * 3) + 1) * 4, point.y, 'float'); + GodotRuntime.setHeapValue(buf + ((i * 3) + 2) * 4, point.z, 'float'); } GodotRuntime.setHeapValue(r_points, buf, 'i32'); diff --git a/platform/android/android_input_handler.cpp b/platform/android/android_input_handler.cpp index 17903b3965..63045237e9 100644 --- a/platform/android/android_input_handler.cpp +++ b/platform/android/android_input_handler.cpp @@ -49,11 +49,19 @@ void AndroidInputHandler::process_joy_event(AndroidInputHandler::JoypadEvent p_e } } -void AndroidInputHandler::_set_key_modifier_state(Ref<InputEventWithModifiers> ev) { - ev->set_shift_pressed(shift_mem); - ev->set_alt_pressed(alt_mem); - ev->set_meta_pressed(meta_mem); - ev->set_ctrl_pressed(control_mem); +void AndroidInputHandler::_set_key_modifier_state(Ref<InputEventWithModifiers> ev, Key p_keycode) { + if (p_keycode != Key::SHIFT) { + ev->set_shift_pressed(shift_mem); + } + if (p_keycode != Key::ALT) { + ev->set_alt_pressed(alt_mem); + } + if (p_keycode != Key::META) { + ev->set_meta_pressed(meta_mem); + } + if (p_keycode != Key::CTRL) { + ev->set_ctrl_pressed(control_mem); + } } void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicode, int p_key_label, bool p_pressed) { @@ -118,7 +126,7 @@ void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicod ev->set_unicode(fix_unicode(unicode)); ev->set_pressed(p_pressed); - _set_key_modifier_state(ev); + _set_key_modifier_state(ev, keycode); if (p_physical_keycode == AKEYCODE_BACK) { if (DisplayServerAndroid *dsa = Object::cast_to<DisplayServerAndroid>(DisplayServer::get_singleton())) { @@ -129,13 +137,22 @@ void AndroidInputHandler::process_key_event(int p_physical_keycode, int p_unicod Input::get_singleton()->parse_input_event(ev); } -void AndroidInputHandler::_parse_all_touch(bool p_pressed, bool p_double_tap) { +void AndroidInputHandler::_cancel_all_touch() { + _parse_all_touch(false, false, true); + touch.clear(); +} + +void AndroidInputHandler::_parse_all_touch(bool p_pressed, bool p_double_tap, bool reset_index) { if (touch.size()) { //end all if exist for (int i = 0; i < touch.size(); i++) { Ref<InputEventScreenTouch> ev; ev.instantiate(); - ev->set_index(touch[i].id); + if (reset_index) { + ev->set_index(-1); + } else { + ev->set_index(touch[i].id); + } ev->set_pressed(p_pressed); ev->set_position(touch[i].pos); ev->set_double_tap(p_double_tap); @@ -196,7 +213,9 @@ void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const } } break; - case AMOTION_EVENT_ACTION_CANCEL: + case AMOTION_EVENT_ACTION_CANCEL: { + _cancel_all_touch(); + } break; case AMOTION_EVENT_ACTION_UP: { //release _release_all_touch(); } break; @@ -236,6 +255,12 @@ void AndroidInputHandler::process_touch_event(int p_event, int p_pointer, const } } +void AndroidInputHandler::_cancel_mouse_event_info(bool p_source_mouse_relative) { + buttons_state = BitField<MouseButtonMask>(); + _parse_mouse_event_info(BitField<MouseButtonMask>(), false, false, p_source_mouse_relative); + mouse_event_info.valid = false; +} + void AndroidInputHandler::_parse_mouse_event_info(BitField<MouseButtonMask> event_buttons_mask, bool p_pressed, bool p_double_click, bool p_source_mouse_relative) { if (!mouse_event_info.valid) { return; @@ -243,7 +268,7 @@ void AndroidInputHandler::_parse_mouse_event_info(BitField<MouseButtonMask> even Ref<InputEventMouseButton> ev; ev.instantiate(); - _set_key_modifier_state(ev); + _set_key_modifier_state(ev, Key::NONE); if (p_source_mouse_relative) { ev->set_position(hover_prev_pos); ev->set_global_position(hover_prev_pos); @@ -277,7 +302,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an // https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER Ref<InputEventMouseMotion> ev; ev.instantiate(); - _set_key_modifier_state(ev); + _set_key_modifier_state(ev, Key::NONE); ev->set_position(p_event_pos); ev->set_global_position(p_event_pos); ev->set_relative(p_event_pos - hover_prev_pos); @@ -296,8 +321,11 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an _parse_mouse_event_info(event_buttons_mask, true, p_double_click, p_source_mouse_relative); } break; + case AMOTION_EVENT_ACTION_CANCEL: { + _cancel_mouse_event_info(p_source_mouse_relative); + } break; + case AMOTION_EVENT_ACTION_UP: - case AMOTION_EVENT_ACTION_CANCEL: case AMOTION_EVENT_ACTION_BUTTON_RELEASE: { _release_mouse_event_info(p_source_mouse_relative); } break; @@ -309,7 +337,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an Ref<InputEventMouseMotion> ev; ev.instantiate(); - _set_key_modifier_state(ev); + _set_key_modifier_state(ev, Key::NONE); if (p_source_mouse_relative) { ev->set_position(hover_prev_pos); ev->set_global_position(hover_prev_pos); @@ -328,7 +356,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an case AMOTION_EVENT_ACTION_SCROLL: { Ref<InputEventMouseButton> ev; ev.instantiate(); - _set_key_modifier_state(ev); + _set_key_modifier_state(ev, Key::NONE); if (p_source_mouse_relative) { ev->set_position(hover_prev_pos); ev->set_global_position(hover_prev_pos); @@ -355,7 +383,7 @@ void AndroidInputHandler::process_mouse_event(int p_event_action, int p_event_an void AndroidInputHandler::_wheel_button_click(BitField<MouseButtonMask> event_buttons_mask, const Ref<InputEventMouseButton> &ev, MouseButton wheel_button, float factor) { Ref<InputEventMouseButton> evd = ev->duplicate(); - _set_key_modifier_state(evd); + _set_key_modifier_state(evd, Key::NONE); evd->set_button_index(wheel_button); evd->set_button_mask(BitField<MouseButtonMask>(event_buttons_mask.operator int64_t() ^ int64_t(mouse_button_to_mask(wheel_button)))); evd->set_factor(factor); @@ -369,7 +397,7 @@ void AndroidInputHandler::_wheel_button_click(BitField<MouseButtonMask> event_bu void AndroidInputHandler::process_magnify(Point2 p_pos, float p_factor) { Ref<InputEventMagnifyGesture> magnify_event; magnify_event.instantiate(); - _set_key_modifier_state(magnify_event); + _set_key_modifier_state(magnify_event, Key::NONE); magnify_event->set_position(p_pos); magnify_event->set_factor(p_factor); Input::get_singleton()->parse_input_event(magnify_event); @@ -378,7 +406,7 @@ void AndroidInputHandler::process_magnify(Point2 p_pos, float p_factor) { void AndroidInputHandler::process_pan(Point2 p_pos, Vector2 p_delta) { Ref<InputEventPanGesture> pan_event; pan_event.instantiate(); - _set_key_modifier_state(pan_event); + _set_key_modifier_state(pan_event, Key::NONE); pan_event->set_position(p_pos); pan_event->set_delta(p_delta); Input::get_singleton()->parse_input_event(pan_event); diff --git a/platform/android/android_input_handler.h b/platform/android/android_input_handler.h index 6e53dcfc89..2badd32636 100644 --- a/platform/android/android_input_handler.h +++ b/platform/android/android_input_handler.h @@ -76,7 +76,7 @@ private: MouseEventInfo mouse_event_info; Point2 hover_prev_pos; // needed to calculate the relative position on hover events - void _set_key_modifier_state(Ref<InputEventWithModifiers> ev); + void _set_key_modifier_state(Ref<InputEventWithModifiers> ev, Key p_keycode); static MouseButton _button_index_from_mask(BitField<MouseButtonMask> button_mask); static BitField<MouseButtonMask> _android_button_mask_to_godot_button_mask(int android_button_mask); @@ -87,10 +87,14 @@ private: void _release_mouse_event_info(bool p_source_mouse_relative = false); - void _parse_all_touch(bool p_pressed, bool p_double_tap); + void _cancel_mouse_event_info(bool p_source_mouse_relative = false); + + void _parse_all_touch(bool p_pressed, bool p_double_tap, bool reset_index = false); void _release_all_touch(); + void _cancel_all_touch(); + public: void process_mouse_event(int p_event_action, int p_event_android_buttons_mask, Point2 p_event_pos, Vector2 p_delta, bool p_double_click, bool p_source_mouse_relative); void process_touch_event(int p_event, int p_pointer, const Vector<TouchPos> &p_points, bool p_double_tap); diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index fdd2fed836..641258a26c 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -251,7 +251,7 @@ static const int EXPORT_FORMAT_AAB = 1; static const char *APK_ASSETS_DIRECTORY = "res://android/build/assets"; static const char *AAB_ASSETS_DIRECTORY = "res://android/build/assetPacks/installTime/src/main/assets"; -static const int DEFAULT_MIN_SDK_VERSION = 21; // Should match the value in 'platform/android/java/app/config.gradle#minSdk' +static const int OPENGL_MIN_SDK_VERSION = 21; // Should match the value in 'platform/android/java/app/config.gradle#minSdk' static const int VULKAN_MIN_SDK_VERSION = 24; static const int DEFAULT_TARGET_SDK_VERSION = 32; // Should match the value in 'platform/android/java/app/config.gradle#targetSdk' @@ -1706,7 +1706,7 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "gradle_build/export_format", PROPERTY_HINT_ENUM, "Export APK,Export AAB"), EXPORT_FORMAT_APK)); // Using String instead of int to default to an empty string (no override) with placeholder for instructions (see GH-62465). // This implies doing validation that the string is a proper int. - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/min_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", DEFAULT_MIN_SDK_VERSION)), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/min_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", VULKAN_MIN_SDK_VERSION)), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "gradle_build/target_sdk", PROPERTY_HINT_PLACEHOLDER_TEXT, vformat("%d (default)", DEFAULT_TARGET_SDK_VERSION)), "")); Vector<PluginConfigAndroid> plugins_configs = get_plugins(); @@ -2337,7 +2337,7 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit // Check the min sdk version. String min_sdk_str = p_preset->get("gradle_build/min_sdk"); - int min_sdk_int = DEFAULT_MIN_SDK_VERSION; + int min_sdk_int = VULKAN_MIN_SDK_VERSION; if (!min_sdk_str.is_empty()) { // Empty means no override, nothing to do. if (!gradle_build_enabled) { valid = false; @@ -2350,9 +2350,9 @@ bool EditorExportPlatformAndroid::has_valid_project_configuration(const Ref<Edit err += "\n"; } else { min_sdk_int = min_sdk_str.to_int(); - if (min_sdk_int < DEFAULT_MIN_SDK_VERSION) { + if (min_sdk_int < OPENGL_MIN_SDK_VERSION) { valid = false; - err += vformat(TTR("\"Min SDK\" cannot be lower than %d, which is the version needed by the Godot library."), DEFAULT_MIN_SDK_VERSION); + err += vformat(TTR("\"Min SDK\" cannot be lower than %d, which is the version needed by the Godot library."), OPENGL_MIN_SDK_VERSION); err += "\n"; } } @@ -2808,7 +2808,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP String version_name = p_preset->get("version/name"); String min_sdk_version = p_preset->get("gradle_build/min_sdk"); if (!min_sdk_version.is_valid_int()) { - min_sdk_version = itos(DEFAULT_MIN_SDK_VERSION); + min_sdk_version = itos(VULKAN_MIN_SDK_VERSION); } String target_sdk_version = p_preset->get("gradle_build/target_sdk"); if (!target_sdk_version.is_valid_int()) { diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp index 5df05580a5..1249f2219f 100644 --- a/platform/android/file_access_android.cpp +++ b/platform/android/file_access_android.cpp @@ -169,6 +169,10 @@ bool FileAccessAndroid::file_exists(const String &p_path) { return true; } +void FileAccessAndroid::close() { + _close(); +} + FileAccessAndroid::~FileAccessAndroid() { _close(); } diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h index 1d25a28d90..b8f45628e5 100644 --- a/platform/android/file_access_android.h +++ b/platform/android/file_access_android.h @@ -78,6 +78,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } + virtual void close() override; + ~FileAccessAndroid(); }; diff --git a/platform/android/file_access_filesystem_jandroid.cpp b/platform/android/file_access_filesystem_jandroid.cpp index 7174d57344..ea8459d1ed 100644 --- a/platform/android/file_access_filesystem_jandroid.cpp +++ b/platform/android/file_access_filesystem_jandroid.cpp @@ -333,6 +333,12 @@ void FileAccessFilesystemJAndroid::setup(jobject p_file_access_handler) { _file_last_modified = env->GetMethodID(cls, "fileLastModified", "(Ljava/lang/String;)J"); } +void FileAccessFilesystemJAndroid::close() { + if (is_open()) { + _close(); + } +} + FileAccessFilesystemJAndroid::FileAccessFilesystemJAndroid() { id = 0; } diff --git a/platform/android/file_access_filesystem_jandroid.h b/platform/android/file_access_filesystem_jandroid.h index 7829ab7cf9..5e74d9de24 100644 --- a/platform/android/file_access_filesystem_jandroid.h +++ b/platform/android/file_access_filesystem_jandroid.h @@ -93,6 +93,8 @@ public: virtual uint32_t _get_unix_permissions(const String &p_file) override { return 0; } virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override { return FAILED; } + virtual void close() override; + FileAccessFilesystemJAndroid(); ~FileAccessFilesystemJAndroid(); }; diff --git a/platform/ios/SCsub b/platform/ios/SCsub index f3925c146f..18ba6617af 100644 --- a/platform/ios/SCsub +++ b/platform/ios/SCsub @@ -17,7 +17,6 @@ ios_lib = [ "display_layer.mm", "godot_app_delegate.m", "godot_view_renderer.mm", - "godot_view_gesture_recognizer.mm", "device_metrics.m", "keyboard_input_view.mm", "key_mapping_ios.mm", diff --git a/platform/ios/godot_view.h b/platform/ios/godot_view.h index 077584baa6..b00ca37ebe 100644 --- a/platform/ios/godot_view.h +++ b/platform/ios/godot_view.h @@ -59,9 +59,4 @@ class String; - (void)stopRendering; - (void)startRendering; -- (void)godotTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -- (void)godotTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; -- (void)godotTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; -- (void)godotTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; - @end diff --git a/platform/ios/godot_view.mm b/platform/ios/godot_view.mm index 4b10f95ab8..fafec79bf6 100644 --- a/platform/ios/godot_view.mm +++ b/platform/ios/godot_view.mm @@ -35,7 +35,6 @@ #include "core/string/ustring.h" #import "display_layer.h" #include "display_server_ios.h" -#import "godot_view_gesture_recognizer.h" #import "godot_view_renderer.h" #import <CoreMotion/CoreMotion.h> @@ -60,8 +59,6 @@ static const float earth_gravity = 9.80665; @property(strong, nonatomic) CMMotionManager *motionManager; -@property(strong, nonatomic) GodotViewGestureRecognizer *delayGestureRecognizer; - @end @implementation GodotView @@ -148,10 +145,6 @@ static const float earth_gravity = 9.80665; [self.animationTimer invalidate]; self.animationTimer = nil; } - - if (self.delayGestureRecognizer) { - self.delayGestureRecognizer = nil; - } } - (void)godot_commonInit { @@ -171,11 +164,6 @@ static const float earth_gravity = 9.80665; self.motionManager = nil; } } - - // Initialize delay gesture recognizer - GodotViewGestureRecognizer *gestureRecognizer = [[GodotViewGestureRecognizer alloc] init]; - self.delayGestureRecognizer = gestureRecognizer; - [self addGestureRecognizer:self.delayGestureRecognizer]; } - (void)stopRendering { @@ -347,58 +335,42 @@ static const float earth_gravity = 9.80665; } } -- (void)godotTouchesBegan:(NSSet *)touchesSet withEvent:(UIEvent *)event { - NSArray *tlist = [event.allTouches allObjects]; - for (unsigned int i = 0; i < [tlist count]; i++) { - if ([touchesSet containsObject:[tlist objectAtIndex:i]]) { - UITouch *touch = [tlist objectAtIndex:i]; - int tid = [self getTouchIDForTouch:touch]; - ERR_FAIL_COND(tid == -1); - CGPoint touchPoint = [touch locationInView:self]; - DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, true, touch.tapCount > 1); - } +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + for (UITouch *touch in touches) { + int tid = [self getTouchIDForTouch:touch]; + ERR_FAIL_COND(tid == -1); + CGPoint touchPoint = [touch locationInView:self]; + DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, true, touch.tapCount > 1); } } -- (void)godotTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - NSArray *tlist = [event.allTouches allObjects]; - for (unsigned int i = 0; i < [tlist count]; i++) { - if ([touches containsObject:[tlist objectAtIndex:i]]) { - UITouch *touch = [tlist objectAtIndex:i]; - int tid = [self getTouchIDForTouch:touch]; - ERR_FAIL_COND(tid == -1); - CGPoint touchPoint = [touch locationInView:self]; - CGPoint prev_point = [touch previousLocationInView:self]; - CGFloat alt = [touch altitudeAngle]; - CGVector azim = [touch azimuthUnitVectorInView:self]; - DisplayServerIOS::get_singleton()->touch_drag(tid, prev_point.x * self.contentScaleFactor, prev_point.y * self.contentScaleFactor, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, [touch force] / [touch maximumPossibleForce], Vector2(azim.dx, azim.dy) * Math::cos(alt)); - } +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { + for (UITouch *touch in touches) { + int tid = [self getTouchIDForTouch:touch]; + ERR_FAIL_COND(tid == -1); + CGPoint touchPoint = [touch locationInView:self]; + CGPoint prev_point = [touch previousLocationInView:self]; + CGFloat alt = [touch altitudeAngle]; + CGVector azim = [touch azimuthUnitVectorInView:self]; + DisplayServerIOS::get_singleton()->touch_drag(tid, prev_point.x * self.contentScaleFactor, prev_point.y * self.contentScaleFactor, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, [touch force] / [touch maximumPossibleForce], Vector2(azim.dx, azim.dy) * Math::cos(alt)); } } -- (void)godotTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - NSArray *tlist = [event.allTouches allObjects]; - for (unsigned int i = 0; i < [tlist count]; i++) { - if ([touches containsObject:[tlist objectAtIndex:i]]) { - UITouch *touch = [tlist objectAtIndex:i]; - int tid = [self getTouchIDForTouch:touch]; - ERR_FAIL_COND(tid == -1); - [self removeTouch:touch]; - CGPoint touchPoint = [touch locationInView:self]; - DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, false, false); - } +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + for (UITouch *touch in touches) { + int tid = [self getTouchIDForTouch:touch]; + ERR_FAIL_COND(tid == -1); + [self removeTouch:touch]; + CGPoint touchPoint = [touch locationInView:self]; + DisplayServerIOS::get_singleton()->touch_press(tid, touchPoint.x * self.contentScaleFactor, touchPoint.y * self.contentScaleFactor, false, false); } } -- (void)godotTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - NSArray *tlist = [event.allTouches allObjects]; - for (unsigned int i = 0; i < [tlist count]; i++) { - if ([touches containsObject:[tlist objectAtIndex:i]]) { - UITouch *touch = [tlist objectAtIndex:i]; - int tid = [self getTouchIDForTouch:touch]; - ERR_FAIL_COND(tid == -1); - DisplayServerIOS::get_singleton()->touches_canceled(tid); - } +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + for (UITouch *touch in touches) { + int tid = [self getTouchIDForTouch:touch]; + ERR_FAIL_COND(tid == -1); + DisplayServerIOS::get_singleton()->touches_canceled(tid); } [self clearTouches]; } diff --git a/platform/ios/godot_view_gesture_recognizer.mm b/platform/ios/godot_view_gesture_recognizer.mm deleted file mode 100644 index 9b71228864..0000000000 --- a/platform/ios/godot_view_gesture_recognizer.mm +++ /dev/null @@ -1,186 +0,0 @@ -/**************************************************************************/ -/* godot_view_gesture_recognizer.mm */ -/**************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/**************************************************************************/ -/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/**************************************************************************/ - -#import "godot_view_gesture_recognizer.h" - -#import "godot_view.h" - -#include "core/config/project_settings.h" - -// Minimum distance for touches to move to fire -// a delay timer before scheduled time. -// Should be the low enough to not cause issues with dragging -// but big enough to allow click to work. -const CGFloat kGLGestureMovementDistance = 0.5; - -@interface GodotViewGestureRecognizer () - -@property(nonatomic, readwrite, assign) NSTimeInterval delayTimeInterval; - -@end - -@interface GodotViewGestureRecognizer () - -// Timer used to delay begin touch message. -// Should work as simple emulation of UIDelayedAction -@property(strong, nonatomic) NSTimer *delayTimer; - -// Delayed touch parameters -@property(strong, nonatomic) NSSet *delayedTouches; -@property(strong, nonatomic) UIEvent *delayedEvent; - -@end - -@implementation GodotViewGestureRecognizer - -- (GodotView *)godotView { - return (GodotView *)self.view; -} - -- (instancetype)init { - self = [super init]; - - self.cancelsTouchesInView = YES; - self.delaysTouchesBegan = YES; - self.delaysTouchesEnded = YES; - self.requiresExclusiveTouchType = NO; - - self.delayTimeInterval = GLOBAL_GET("input_devices/pointing/ios/touch_delay"); - - return self; -} - -- (void)dealloc { - if (self.delayTimer) { - [self.delayTimer invalidate]; - self.delayTimer = nil; - } - - if (self.delayedTouches) { - self.delayedTouches = nil; - } - - if (self.delayedEvent) { - self.delayedEvent = nil; - } -} - -- (void)delayTouches:(NSSet *)touches andEvent:(UIEvent *)event { - [self.delayTimer fire]; - - self.delayedTouches = touches; - self.delayedEvent = event; - - self.delayTimer = [NSTimer - scheduledTimerWithTimeInterval:self.delayTimeInterval - target:self - selector:@selector(fireDelayedTouches:) - userInfo:nil - repeats:NO]; -} - -- (void)fireDelayedTouches:(id)timer { - [self.delayTimer invalidate]; - self.delayTimer = nil; - - if (self.delayedTouches) { - [self.godotView godotTouchesBegan:self.delayedTouches withEvent:self.delayedEvent]; - } - - self.delayedTouches = nil; - self.delayedEvent = nil; -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseBegan]; - [self delayTouches:cleared andEvent:event]; - - [super touchesBegan:touches withEvent:event]; -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseMoved]; - - if (self.delayTimer) { - // We should check if movement was significant enough to fire an event - // for dragging to work correctly. - for (UITouch *touch in cleared) { - CGPoint from = [touch locationInView:self.godotView]; - CGPoint to = [touch previousLocationInView:self.godotView]; - CGFloat xDistance = from.x - to.x; - CGFloat yDistance = from.y - to.y; - - CGFloat distance = sqrt(xDistance * xDistance + yDistance * yDistance); - - // Early exit, since one of touches has moved enough to fire a drag event. - if (distance > kGLGestureMovementDistance) { - [self.delayTimer fire]; - [self.godotView godotTouchesMoved:cleared withEvent:event]; - return; - } - } - - return; - } - - [self.godotView godotTouchesMoved:cleared withEvent:event]; - - [super touchesMoved:touches withEvent:event]; -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - [self.delayTimer fire]; - - NSSet *cleared = [self copyClearedTouches:touches phase:UITouchPhaseEnded]; - [self.godotView godotTouchesEnded:cleared withEvent:event]; - - [super touchesEnded:touches withEvent:event]; -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - [self.delayTimer fire]; - [self.godotView godotTouchesCancelled:touches withEvent:event]; - - [super touchesCancelled:touches withEvent:event]; -} - -- (NSSet *)copyClearedTouches:(NSSet *)touches phase:(UITouchPhase)phaseToSave { - NSMutableSet *cleared = [touches mutableCopy]; - - for (UITouch *touch in touches) { - if (touch.view != self.view || touch.phase != phaseToSave) { - [cleared removeObject:touch]; - } - } - - return cleared; -} - -@end diff --git a/platform/linuxbsd/SCsub b/platform/linuxbsd/SCsub index 3c5dc78c60..4dd74ff9d0 100644 --- a/platform/linuxbsd/SCsub +++ b/platform/linuxbsd/SCsub @@ -11,23 +11,30 @@ common_linuxbsd = [ "joypad_linux.cpp", "freedesktop_portal_desktop.cpp", "freedesktop_screensaver.cpp", - "xkbcommon-so_wrap.c", ] +if env["use_sowrap"]: + common_linuxbsd.append("xkbcommon-so_wrap.c") + if env["x11"]: common_linuxbsd += SConscript("x11/SCsub") if env["speechd"]: - common_linuxbsd.append(["speechd-so_wrap.c", "tts_linux.cpp"]) + common_linuxbsd.append("tts_linux.cpp") + if env["use_sowrap"]: + common_linuxbsd.append("speechd-so_wrap.c") if env["fontconfig"]: - common_linuxbsd.append("fontconfig-so_wrap.c") + if env["use_sowrap"]: + common_linuxbsd.append("fontconfig-so_wrap.c") if env["udev"]: - common_linuxbsd.append("libudev-so_wrap.c") + if env["use_sowrap"]: + common_linuxbsd.append("libudev-so_wrap.c") if env["dbus"]: - common_linuxbsd.append("dbus-so_wrap.c") + if env["use_sowrap"]: + common_linuxbsd.append("dbus-so_wrap.c") prog = env.add_program("#bin/godot", ["godot_linuxbsd.cpp"] + common_linuxbsd) diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 36e149f2b4..af2a271476 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -43,6 +43,7 @@ def get_opts(): BoolVariable("use_lsan", "Use LLVM/GCC compiler leak sanitizer (LSAN)", False), BoolVariable("use_tsan", "Use LLVM/GCC compiler thread sanitizer (TSAN)", False), BoolVariable("use_msan", "Use LLVM compiler memory sanitizer (MSAN)", False), + BoolVariable("use_sowrap", "Dynamically load system libraries", True), BoolVariable("alsa", "Use ALSA", True), BoolVariable("pulseaudio", "Use PulseAudio", True), BoolVariable("dbus", "Use D-Bus to handle screensaver and portal desktop settings", True), @@ -184,6 +185,9 @@ def configure(env: "Environment"): ## Dependencies + if env["use_sowrap"]: + env.Append(CPPDEFINES=["SOWRAP_ENABLED"]) + if env["touch"]: env.Append(CPPDEFINES=["TOUCH_ENABLED"]) @@ -271,26 +275,83 @@ def configure(env: "Environment"): env.Append(LIBS=["embree3"]) ## Flags - if env["fontconfig"]: - env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"]) + if not env["use_sowrap"]: + if os.system("pkg-config --exists fontconfig") == 0: # 0 means found + env.ParseConfig("pkg-config fontconfig --cflags --libs") + env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"]) + else: + print("Warning: fontconfig development libraries not found. Disabling the system fonts support.") + env["fontconfig"] = False + else: + env.Append(CPPDEFINES=["FONTCONFIG_ENABLED"]) if env["alsa"]: - env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"]) + if not env["use_sowrap"]: + if os.system("pkg-config --exists alsa") == 0: # 0 means found + env.ParseConfig("pkg-config alsa --cflags --libs") + env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"]) + else: + print("Warning: ALSA development libraries not found. Disabling the ALSA audio driver.") + env["alsa"] = False + else: + env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"]) if env["pulseaudio"]: + if not env["use_sowrap"]: + if os.system("pkg-config --exists libpulse") == 0: # 0 means found + env.ParseConfig("pkg-config libpulse --cflags --libs") + env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED", "_REENTRANT"]) + else: + print("Warning: PulseAudio development libraries not found. Disabling the PulseAudio audio driver.") + env["pulseaudio"] = False env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED", "_REENTRANT"]) if env["dbus"]: - env.Append(CPPDEFINES=["DBUS_ENABLED"]) + if not env["use_sowrap"]: + if os.system("pkg-config --exists dbus-1") == 0: # 0 means found + env.ParseConfig("pkg-config dbus-1 --cflags --libs") + env.Append(CPPDEFINES=["DBUS_ENABLED"]) + else: + print("Warning: D-Bus development libraries not found. Disabling screensaver prevention.") + env["dbus"] = False + else: + env.Append(CPPDEFINES=["DBUS_ENABLED"]) if env["speechd"]: - env.Append(CPPDEFINES=["SPEECHD_ENABLED"]) + if not env["use_sowrap"]: + if os.system("pkg-config --exists speech-dispatcher") == 0: # 0 means found + env.ParseConfig("pkg-config speech-dispatcher --cflags --libs") + env.Append(CPPDEFINES=["SPEECHD_ENABLED"]) + else: + print("Warning: speech-dispatcher development libraries not found. Disabling text to speech support.") + env["speechd"] = False + else: + env.Append(CPPDEFINES=["SPEECHD_ENABLED"]) + + if not env["use_sowrap"]: + if os.system("pkg-config --exists xkbcommon") == 0: # 0 means found + env.ParseConfig("pkg-config xkbcommon --cflags --libs") + env.Append(CPPDEFINES=["XKB_ENABLED"]) + else: + print( + "Warning: libxkbcommon development libraries not found. Disabling dead key composition and key label support." + ) + else: + env.Append(CPPDEFINES=["XKB_ENABLED"]) if platform.system() == "Linux": env.Append(CPPDEFINES=["JOYDEV_ENABLED"]) if env["udev"]: - env.Append(CPPDEFINES=["UDEV_ENABLED"]) + if not env["use_sowrap"]: + if os.system("pkg-config --exists libudev") == 0: # 0 means found + env.ParseConfig("pkg-config libudev --cflags --libs") + env.Append(CPPDEFINES=["UDEV_ENABLED"]) + else: + print("Warning: libudev development libraries not found. Disabling controller hotplugging support.") + env["udev"] = False + else: + env.Append(CPPDEFINES=["UDEV_ENABLED"]) else: env["udev"] = False # Linux specific @@ -298,7 +359,9 @@ def configure(env: "Environment"): if not env["builtin_zlib"]: env.ParseConfig("pkg-config zlib --cflags --libs") - env.Prepend(CPPPATH=["#platform/linuxbsd", "#thirdparty/linuxbsd_headers"]) + env.Prepend(CPPPATH=["#platform/linuxbsd"]) + if env["use_sowrap"]: + env.Prepend(CPPPATH=["#thirdparty/linuxbsd_headers"]) env.Append( CPPDEFINES=[ @@ -309,6 +372,35 @@ def configure(env: "Environment"): ) if env["x11"]: + if not env["use_sowrap"]: + if os.system("pkg-config --exists x11"): + print("Error: X11 libraries not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config x11 --cflags --libs") + if os.system("pkg-config --exists xcursor"): + print("Error: Xcursor library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xcursor --cflags --libs") + if os.system("pkg-config --exists xinerama"): + print("Error: Xinerama library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xinerama --cflags --libs") + if os.system("pkg-config --exists xext"): + print("Error: Xext library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xext --cflags --libs") + if os.system("pkg-config --exists xrandr"): + print("Error: XrandR library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xrandr --cflags --libs") + if os.system("pkg-config --exists xrender"): + print("Error: XRender library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xrender --cflags --libs") + if os.system("pkg-config --exists xi"): + print("Error: Xi library not found. Aborting.") + sys.exit(255) + env.ParseConfig("pkg-config xi --cflags --libs") env.Append(CPPDEFINES=["X11_ENABLED"]) if env["vulkan"]: @@ -346,7 +438,7 @@ def configure(env: "Environment"): gnu_ld_version = re.search("^GNU ld [^$]*(\d+\.\d+)$", linker_version_str, re.MULTILINE) if not gnu_ld_version: print( - "Warning: Creating template binaries enabled for PCK embedding is currently only supported with GNU ld, not gold or LLD." + "Warning: Creating export template binaries enabled for PCK embedding is currently only supported with GNU ld, not gold, LLD or mold." ) else: if float(gnu_ld_version.group(1)) >= 2.30: diff --git a/platform/linuxbsd/freedesktop_portal_desktop.cpp b/platform/linuxbsd/freedesktop_portal_desktop.cpp index 72d4e3772f..ec1fcf6698 100644 --- a/platform/linuxbsd/freedesktop_portal_desktop.cpp +++ b/platform/linuxbsd/freedesktop_portal_desktop.cpp @@ -36,7 +36,11 @@ #include "core/os/os.h" #include "core/string/ustring.h" +#ifdef SOWRAP_ENABLED #include "dbus-so_wrap.h" +#else +#include <dbus/dbus.h> +#endif #include "core/variant/variant.h" @@ -124,12 +128,16 @@ uint32_t FreeDesktopPortalDesktop::get_appearance_color_scheme() { } FreeDesktopPortalDesktop::FreeDesktopPortalDesktop() { +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else int dylibloader_verbose = 0; #endif unsupported = (initialize_dbus(dylibloader_verbose) != 0); +#else + unsupported = false; +#endif } #endif // DBUS_ENABLED diff --git a/platform/linuxbsd/freedesktop_screensaver.cpp b/platform/linuxbsd/freedesktop_screensaver.cpp index 159fd0df61..d07e781a5f 100644 --- a/platform/linuxbsd/freedesktop_screensaver.cpp +++ b/platform/linuxbsd/freedesktop_screensaver.cpp @@ -34,7 +34,11 @@ #include "core/config/project_settings.h" +#ifdef SOWRAP_ENABLED #include "dbus-so_wrap.h" +#else +#include <dbus/dbus.h> +#endif #define BUS_OBJECT_NAME "org.freedesktop.ScreenSaver" #define BUS_OBJECT_PATH "/org/freedesktop/ScreenSaver" @@ -127,12 +131,16 @@ void FreeDesktopScreenSaver::uninhibit() { } FreeDesktopScreenSaver::FreeDesktopScreenSaver() { +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else int dylibloader_verbose = 0; #endif unsupported = (initialize_dbus(dylibloader_verbose) != 0); +#else + unsupported = false; +#endif } #endif // DBUS_ENABLED diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index b77f989677..0256af0a59 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -39,7 +39,11 @@ #include <unistd.h> #ifdef UDEV_ENABLED +#ifdef SOWRAP_ENABLED #include "libudev-so_wrap.h" +#else +#include <libudev.h> +#endif #endif #define LONG_BITS (sizeof(long) * 8) @@ -70,6 +74,7 @@ void JoypadLinux::Joypad::reset() { JoypadLinux::JoypadLinux(Input *in) { #ifdef UDEV_ENABLED +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else @@ -81,6 +86,7 @@ JoypadLinux::JoypadLinux(Input *in) { } else { print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads."); } +#endif #else print_verbose("JoypadLinux: udev disabled, parsing /dev/input to detect joypads."); #endif diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 41d1f1d050..54bb34ef73 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -1083,12 +1083,16 @@ OS_LinuxBSD::OS_LinuxBSD() { #endif #ifdef FONTCONFIG_ENABLED +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else int dylibloader_verbose = 0; #endif font_config_initialized = (initialize_fontconfig(dylibloader_verbose) == 0); +#else + font_config_initialized = true; +#endif if (font_config_initialized) { config = FcInitLoadConfigAndFonts(); if (!config) { diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index 045d3d95ba..9423514944 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -41,7 +41,11 @@ #include "servers/audio_server.h" #ifdef FONTCONFIG_ENABLED +#ifdef SOWRAP_ENABLED #include "fontconfig-so_wrap.h" +#else +#include <fontconfig/fontconfig.h> +#endif #endif class OS_LinuxBSD : public OS_Unix { diff --git a/platform/linuxbsd/tts_linux.cpp b/platform/linuxbsd/tts_linux.cpp index 4662aaf02d..04d7c5444f 100644 --- a/platform/linuxbsd/tts_linux.cpp +++ b/platform/linuxbsd/tts_linux.cpp @@ -39,12 +39,18 @@ void TTS_Linux::speech_init_thread_func(void *p_userdata) { TTS_Linux *tts = (TTS_Linux *)p_userdata; if (tts) { MutexLock thread_safe_method(tts->_thread_safe_); +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else int dylibloader_verbose = 0; #endif - if (initialize_speechd(dylibloader_verbose) == 0) { + if (initialize_speechd(dylibloader_verbose) != 0) { + print_verbose("Text-to-Speech: Cannot load Speech Dispatcher library!"); + } else { +#else + { +#endif CharString class_str; String config_name = GLOBAL_GET("application/config/name"); if (config_name.length() == 0) { @@ -64,8 +70,6 @@ void TTS_Linux::speech_init_thread_func(void *p_userdata) { } else { print_verbose("Text-to-Speech: Cannot initialize Speech Dispatcher synthesizer!"); } - } else { - print_verbose("Text-to-Speech: Cannot load Speech Dispatcher library!"); } } } diff --git a/platform/linuxbsd/tts_linux.h b/platform/linuxbsd/tts_linux.h index 425654d975..3fe7b659d0 100644 --- a/platform/linuxbsd/tts_linux.h +++ b/platform/linuxbsd/tts_linux.h @@ -39,7 +39,11 @@ #include "core/variant/array.h" #include "servers/display_server.h" +#ifdef SOWRAP_ENABLED #include "speechd-so_wrap.h" +#else +#include <libspeechd.h> +#endif class TTS_Linux { _THREAD_SAFE_CLASS_ diff --git a/platform/linuxbsd/x11/SCsub b/platform/linuxbsd/x11/SCsub index 8b2e2aabe4..a4890391ce 100644 --- a/platform/linuxbsd/x11/SCsub +++ b/platform/linuxbsd/x11/SCsub @@ -5,15 +5,21 @@ Import("env") source_files = [ "display_server_x11.cpp", "key_mapping_x11.cpp", - "dynwrappers/xlib-so_wrap.c", - "dynwrappers/xcursor-so_wrap.c", - "dynwrappers/xinerama-so_wrap.c", - "dynwrappers/xinput2-so_wrap.c", - "dynwrappers/xrandr-so_wrap.c", - "dynwrappers/xrender-so_wrap.c", - "dynwrappers/xext-so_wrap.c", ] +if env["use_sowrap"]: + source_files.append( + [ + "dynwrappers/xlib-so_wrap.c", + "dynwrappers/xcursor-so_wrap.c", + "dynwrappers/xinerama-so_wrap.c", + "dynwrappers/xinput2-so_wrap.c", + "dynwrappers/xrandr-so_wrap.c", + "dynwrappers/xrender-so_wrap.c", + "dynwrappers/xext-so_wrap.c", + ] + ) + if env["vulkan"]: source_files.append("vulkan_context_x11.cpp") diff --git a/platform/linuxbsd/x11/detect_prime_x11.cpp b/platform/linuxbsd/x11/detect_prime_x11.cpp index 8d586599e6..3d07be1c76 100644 --- a/platform/linuxbsd/x11/detect_prime_x11.cpp +++ b/platform/linuxbsd/x11/detect_prime_x11.cpp @@ -41,7 +41,13 @@ #include "thirdparty/glad/glad/gl.h" #include "thirdparty/glad/glad/glx.h" +#ifdef SOWRAP_ENABLED #include "dynwrappers/xlib-so_wrap.h" +#else +#include <X11/XKBlib.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#endif #include <cstring> diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 525c62fbf2..896b7b95eb 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -1329,12 +1329,14 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) { wd.xic = nullptr; } XDestroyWindow(x11_display, wd.x11_xim_window); +#ifdef XKB_ENABLED if (xkb_loaded) { if (wd.xkb_state) { xkb_compose_state_unref(wd.xkb_state); wd.xkb_state = nullptr; } } +#endif XUnmapWindow(x11_display, wd.x11_window); XDestroyWindow(x11_display, wd.x11_window); @@ -2942,11 +2944,13 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_keycode, nullptr); String keysym; +#ifdef XKB_ENABLED if (xkb_loaded) { KeySym keysym_unicode_nm = 0; // keysym used to find unicode XLookupString(&xkeyevent_no_mod, nullptr, 0, &keysym_unicode_nm, nullptr); keysym = String::chr(xkb_keysym_to_utf32(xkb_keysym_to_upper(keysym_unicode_nm))); } +#endif // Meanwhile, XLookupString returns keysyms useful for unicode. @@ -3035,6 +3039,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, } } while (status == XBufferOverflow); #endif +#ifdef XKB_ENABLED } else if (xkeyevent->type == KeyPress && wd.xkb_state && xkb_loaded) { xkb_compose_feed_result res = xkb_compose_state_feed(wd.xkb_state, keysym_unicode); if (res == XKB_COMPOSE_FEED_ACCEPTED) { @@ -3093,6 +3098,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, return; } } +#endif } /* Phase 2, obtain a Godot keycode from the keysym */ @@ -4936,6 +4942,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V win_rect.position = wpos; } + // Position and size hints are set from these values before they are updated to the actual + // window size, so we need to initialize them here. + wd.position = win_rect.position; + wd.size = win_rect.size; + { wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo.screen), win_rect.position.x, win_rect.position.y, win_rect.size.width > 0 ? win_rect.size.width : 1, win_rect.size.height > 0 ? win_rect.size.height : 1, 0, visualInfo.depth, InputOutput, visualInfo.visual, valuemask, &windowAttributes); @@ -4943,11 +4954,11 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V window_attributes_ime.event_mask = KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask; wd.x11_xim_window = XCreateWindow(x11_display, wd.x11_window, 0, 0, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWEventMask, &window_attributes_ime); - +#ifdef XKB_ENABLED if (dead_tbl && xkb_loaded) { wd.xkb_state = xkb_compose_state_new(dead_tbl, XKB_COMPOSE_STATE_NO_FLAGS); } - +#endif // Enable receiving notification when the window is initialized (MapNotify) // so the focus can be set at the right time. if (!wd.no_focus && !wd.is_popup) { @@ -5212,6 +5223,7 @@ static ::XIMStyle _get_best_xim_style(const ::XIMStyle &p_style_a, const ::XIMSt DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Error &r_error) { KeyMappingX11::initialize(); +#ifdef SOWRAP_ENABLED #ifdef DEBUG_ENABLED int dylibloader_verbose = 1; #else @@ -5226,9 +5238,9 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode r_error = ERR_UNAVAILABLE; ERR_FAIL_MSG("Can't load XCursor dynamically."); } - +#ifdef XKB_ENABLED xkb_loaded = (initialize_xkbcommon(dylibloader_verbose) == 0); - +#endif if (initialize_xext(dylibloader_verbose) != 0) { r_error = ERR_UNAVAILABLE; ERR_FAIL_MSG("Can't load Xext dynamically."); @@ -5253,7 +5265,13 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode r_error = ERR_UNAVAILABLE; ERR_FAIL_MSG("Can't load Xinput2 dynamically."); } +#else +#ifdef XKB_ENABLED + xkb_loaded = true; +#endif +#endif +#ifdef XKB_ENABLED if (xkb_loaded) { xkb_ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (xkb_ctx) { @@ -5270,6 +5288,7 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode dead_tbl = xkb_compose_table_new_from_locale(xkb_ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS); } } +#endif Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); @@ -5712,16 +5731,19 @@ DisplayServerX11::~DisplayServerX11() { wd.xic = nullptr; } XDestroyWindow(x11_display, wd.x11_xim_window); +#ifdef XKB_ENABLED if (xkb_loaded) { if (wd.xkb_state) { xkb_compose_state_unref(wd.xkb_state); wd.xkb_state = nullptr; } } +#endif XUnmapWindow(x11_display, wd.x11_window); XDestroyWindow(x11_display, wd.x11_window); } +#ifdef XKB_ENABLED if (xkb_loaded) { if (dead_tbl) { xkb_compose_table_unref(dead_tbl); @@ -5730,6 +5752,7 @@ DisplayServerX11::~DisplayServerX11() { xkb_context_unref(xkb_ctx); } } +#endif //destroy drivers #if defined(VULKAN_ENABLED) diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h index ea54b42262..dbe8a0ce2b 100644 --- a/platform/linuxbsd/x11/display_server_x11.h +++ b/platform/linuxbsd/x11/display_server_x11.h @@ -36,6 +36,8 @@ #include "servers/display_server.h" #include "core/input/input.h" +#include "core/os/mutex.h" +#include "core/os/thread.h" #include "core/templates/local_vector.h" #include "drivers/alsa/audio_driver_alsa.h" #include "drivers/alsamidi/midi_driver_alsamidi.h" @@ -69,6 +71,7 @@ #include <X11/Xutil.h> #include <X11/keysym.h> +#ifdef SOWRAP_ENABLED #include "dynwrappers/xlib-so_wrap.h" #include "dynwrappers/xcursor-so_wrap.h" @@ -79,6 +82,25 @@ #include "dynwrappers/xrender-so_wrap.h" #include "../xkbcommon-so_wrap.h" +#else +#include <X11/XKBlib.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +#include <X11/Xcursor/Xcursor.h> +#include <X11/extensions/XInput2.h> +#include <X11/extensions/Xext.h> +#include <X11/extensions/Xinerama.h> +#include <X11/extensions/Xrandr.h> +#include <X11/extensions/Xrender.h> +#include <X11/extensions/shape.h> + +#ifdef XKB_ENABLED +#include <xkbcommon/xkbcommon-compose.h> +#include <xkbcommon/xkbcommon-keysyms.h> +#include <xkbcommon/xkbcommon.h> +#endif +#endif typedef struct _xrr_monitor_info { Atom name; @@ -142,7 +164,9 @@ class DisplayServerX11 : public DisplayServer { bool ime_active = false; bool ime_in_progress = false; bool ime_suppress_next_keyup = false; +#ifdef XKB_ENABLED xkb_compose_state *xkb_state = nullptr; +#endif Size2i min_size; Size2i max_size; @@ -186,9 +210,11 @@ class DisplayServerX11 : public DisplayServer { Point2i im_selection; String im_text; +#ifdef XKB_ENABLED bool xkb_loaded = false; xkb_context *xkb_ctx = nullptr; xkb_compose_table *dead_tbl = nullptr; +#endif HashMap<WindowID, WindowData> windows; diff --git a/platform/linuxbsd/x11/gl_manager_x11.h b/platform/linuxbsd/x11/gl_manager_x11.h index 713b13376c..0eb8ab64f4 100644 --- a/platform/linuxbsd/x11/gl_manager_x11.h +++ b/platform/linuxbsd/x11/gl_manager_x11.h @@ -37,9 +37,22 @@ #include "core/os/os.h" #include "core/templates/local_vector.h" -#include "dynwrappers/xext-so_wrap.h" + +#ifdef SOWRAP_ENABLED #include "dynwrappers/xlib-so_wrap.h" + +#include "dynwrappers/xext-so_wrap.h" #include "dynwrappers/xrender-so_wrap.h" +#else +#include <X11/XKBlib.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +#include <X11/extensions/Xext.h> +#include <X11/extensions/Xrender.h> +#include <X11/extensions/shape.h> +#endif + #include "servers/display_server.h" struct GLManager_X11_Private; diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index d71fd60543..e89a79834b 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -108,11 +108,19 @@ void DisplayServerWeb::request_quit_callback() { // Keys -void DisplayServerWeb::dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod) { - ev->set_shift_pressed(p_mod & 1); - ev->set_alt_pressed(p_mod & 2); - ev->set_ctrl_pressed(p_mod & 4); - ev->set_meta_pressed(p_mod & 8); +void DisplayServerWeb::dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod, Key p_keycode) { + if (p_keycode != Key::SHIFT) { + ev->set_shift_pressed(p_mod & 1); + } + if (p_keycode != Key::ALT) { + ev->set_alt_pressed(p_mod & 2); + } + if (p_keycode != Key::CTRL) { + ev->set_ctrl_pressed(p_mod & 4); + } + if (p_keycode != Key::META) { + ev->set_meta_pressed(p_mod & 8); + } } void DisplayServerWeb::key_callback(int p_pressed, int p_repeat, int p_modifiers) { @@ -138,7 +146,7 @@ void DisplayServerWeb::key_callback(int p_pressed, int p_repeat, int p_modifiers ev->set_key_label(fix_key_label(c, keycode)); ev->set_unicode(fix_unicode(c)); ev->set_pressed(p_pressed); - dom2godot_mod(ev, p_modifiers); + dom2godot_mod(ev, p_modifiers, fix_keycode(c, keycode)); Input::get_singleton()->parse_input_event(ev); @@ -157,7 +165,7 @@ int DisplayServerWeb::mouse_button_callback(int p_pressed, int p_button, double ev->set_position(pos); ev->set_global_position(pos); ev->set_pressed(p_pressed); - dom2godot_mod(ev, p_modifiers); + dom2godot_mod(ev, p_modifiers, Key::NONE); switch (p_button) { case DOM_BUTTON_LEFT: @@ -235,7 +243,7 @@ void DisplayServerWeb::mouse_move_callback(double p_x, double p_y, double p_rel_ Point2 pos(p_x, p_y); Ref<InputEventMouseMotion> ev; ev.instantiate(); - dom2godot_mod(ev, p_modifiers); + dom2godot_mod(ev, p_modifiers, Key::NONE); ev->set_button_mask(input_mask); ev->set_position(pos); diff --git a/platform/web/display_server_web.h b/platform/web/display_server_web.h index 6d76af4e56..2e50a6bbc8 100644 --- a/platform/web/display_server_web.h +++ b/platform/web/display_server_web.h @@ -81,7 +81,7 @@ private: bool swap_cancel_ok = false; // utilities - static void dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod); + static void dom2godot_mod(Ref<InputEventWithModifiers> ev, int p_mod, Key p_keycode); static const char *godot2dom_cursor(DisplayServer::CursorShape p_shape); // events diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index fe7d91dc18..1cfc9c9f47 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -3668,10 +3668,18 @@ void DisplayServerWindows::_process_key_events() { } k->set_window_id(ke.window_id); - k->set_shift_pressed(ke.shift); - k->set_alt_pressed(ke.alt); - k->set_ctrl_pressed(ke.control); - k->set_meta_pressed(ke.meta); + if (keycode != Key::SHIFT) { + k->set_shift_pressed(ke.shift); + } + if (keycode != Key::ALT) { + k->set_alt_pressed(ke.alt); + } + if (keycode != Key::CTRL) { + k->set_ctrl_pressed(ke.control); + } + if (keycode != Key::META) { + k->set_meta_pressed(ke.meta); + } k->set_pressed(true); k->set_keycode(keycode); k->set_physical_keycode(physical_keycode); @@ -3693,11 +3701,6 @@ void DisplayServerWindows::_process_key_events() { k.instantiate(); k->set_window_id(ke.window_id); - k->set_shift_pressed(ke.shift); - k->set_alt_pressed(ke.alt); - k->set_ctrl_pressed(ke.control); - k->set_meta_pressed(ke.meta); - k->set_pressed(ke.uMsg == WM_KEYDOWN); Key keycode = KeyMappingWindows::get_keysym(ke.wParam); @@ -3719,6 +3722,18 @@ void DisplayServerWindows::_process_key_events() { } } + if (keycode != Key::SHIFT) { + k->set_shift_pressed(ke.shift); + } + if (keycode != Key::ALT) { + k->set_alt_pressed(ke.alt); + } + if (keycode != Key::CTRL) { + k->set_ctrl_pressed(ke.control); + } + if (keycode != Key::META) { + k->set_meta_pressed(ke.meta); + } k->set_keycode(keycode); k->set_physical_keycode(physical_keycode); k->set_key_label(key_label); diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index fe6bee0f1b..f7d2ae7d2d 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -266,6 +266,8 @@ void Camera2D::_notification(int p_what) { clear_current(); } viewport = nullptr; + just_exited_tree = true; + callable_mp(this, &Camera2D::_reset_just_exited).call_deferred(); } break; #ifdef TOOLS_ENABLED @@ -438,6 +440,10 @@ void Camera2D::_update_process_internal_for_smoothing() { void Camera2D::make_current() { ERR_FAIL_COND(!enabled || !is_inside_tree()); get_tree()->call_group(group_name, "_make_current", this); + if (just_exited_tree) { + // If camera exited the scene tree in the same frame, group call will skip it, so this needs to be called manually. + _make_current(this); + } _update_scroll(); } diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 7a77266db8..2417953691 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -51,6 +51,7 @@ protected: Point2 camera_pos; Point2 smoothed_camera_pos; bool first = true; + bool just_exited_tree = false; ObjectID custom_viewport_id; // to check validity Viewport *custom_viewport = nullptr; @@ -88,6 +89,7 @@ protected: void _update_scroll(); void _make_current(Object *p_which); + void _reset_just_exited() { just_exited_tree = false; } void _set_old_smoothing(real_t p_enable); diff --git a/scene/2d/line_builder.cpp b/scene/2d/line_builder.cpp index d91f6e36bb..0970325502 100644 --- a/scene/2d/line_builder.cpp +++ b/scene/2d/line_builder.cpp @@ -393,6 +393,8 @@ void LineBuilder::build() { if (end_cap_mode == Line2D::LINE_CAP_BOX) { pos_up1 += f0 * hw * width_factor; pos_down1 += f0 * hw * width_factor; + + current_distance1 += hw * width_factor; } if (texture_mode == Line2D::LINE_TEXTURE_TILE) { diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index 6aa7779b09..1ee6a0b779 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -31,6 +31,7 @@ #include "navigation_agent_2d.h" #include "core/math/geometry_2d.h" +#include "scene/2d/navigation_link_2d.h" #include "scene/resources/world_2d.h" #include "servers/navigation_server_2d.h" @@ -119,7 +120,7 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_debug_path_custom_line_width", "line_width"), &NavigationAgent2D::set_debug_path_custom_line_width); ClassDB::bind_method(D_METHOD("get_debug_path_custom_line_width"), &NavigationAgent2D::get_debug_path_custom_line_width); - ADD_GROUP("Debug", ""); + ADD_GROUP("Debug", "debug_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_enabled"), "set_debug_enabled", "get_debug_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_use_custom"), "set_debug_use_custom", "get_debug_use_custom"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_path_custom_color"), "set_debug_path_custom_color", "get_debug_path_custom_color"); @@ -623,6 +624,21 @@ void NavigationAgent2D::update_navigation() { } details[SNAME("owner")] = owner; + + if (waypoint_type == NavigationPathQueryResult2D::PATH_SEGMENT_TYPE_LINK) { + const NavigationLink2D *navlink = Object::cast_to<NavigationLink2D>(owner); + if (navlink) { + Vector2 link_global_start_position = navlink->get_global_start_position(); + Vector2 link_global_end_position = navlink->get_global_end_position(); + if (waypoint.distance_to(link_global_start_position) < waypoint.distance_to(link_global_end_position)) { + details[SNAME("link_entry_position")] = link_global_start_position; + details[SNAME("link_exit_position")] = link_global_end_position; + } else { + details[SNAME("link_entry_position")] = link_global_end_position; + details[SNAME("link_exit_position")] = link_global_start_position; + } + } + } } // Emit a signal for the waypoint diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp index 26dca40176..8adb7c6305 100644 --- a/scene/2d/navigation_link_2d.cpp +++ b/scene/2d/navigation_link_2d.cpp @@ -54,6 +54,12 @@ void NavigationLink2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_end_position", "position"), &NavigationLink2D::set_end_position); ClassDB::bind_method(D_METHOD("get_end_position"), &NavigationLink2D::get_end_position); + ClassDB::bind_method(D_METHOD("set_global_start_position", "position"), &NavigationLink2D::set_global_start_position); + ClassDB::bind_method(D_METHOD("get_global_start_position"), &NavigationLink2D::get_global_start_position); + + ClassDB::bind_method(D_METHOD("set_global_end_position", "position"), &NavigationLink2D::set_global_end_position); + ClassDB::bind_method(D_METHOD("get_global_end_position"), &NavigationLink2D::get_global_end_position); + ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationLink2D::set_enter_cost); ClassDB::bind_method(D_METHOD("get_enter_cost"), &NavigationLink2D::get_enter_cost); @@ -271,6 +277,38 @@ void NavigationLink2D::set_end_position(Vector2 p_position) { #endif // DEBUG_ENABLED } +void NavigationLink2D::set_global_start_position(Vector2 p_position) { + if (is_inside_tree()) { + set_start_position(to_local(p_position)); + } else { + set_start_position(p_position); + } +} + +Vector2 NavigationLink2D::get_global_start_position() const { + if (is_inside_tree()) { + return to_global(start_position); + } else { + return start_position; + } +} + +void NavigationLink2D::set_global_end_position(Vector2 p_position) { + if (is_inside_tree()) { + set_end_position(to_local(p_position)); + } else { + set_end_position(p_position); + } +} + +Vector2 NavigationLink2D::get_global_end_position() const { + if (is_inside_tree()) { + return to_global(end_position); + } else { + return end_position; + } +} + void NavigationLink2D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); if (Math::is_equal_approx(enter_cost, p_enter_cost)) { diff --git a/scene/2d/navigation_link_2d.h b/scene/2d/navigation_link_2d.h index 5bf2a72358..8a24d611c9 100644 --- a/scene/2d/navigation_link_2d.h +++ b/scene/2d/navigation_link_2d.h @@ -78,6 +78,12 @@ public: void set_end_position(Vector2 p_position); Vector2 get_end_position() const { return end_position; } + void set_global_start_position(Vector2 p_position); + Vector2 get_global_start_position() const; + + void set_global_end_position(Vector2 p_position); + Vector2 get_global_end_position() const; + void set_enter_cost(real_t p_enter_cost); real_t get_enter_cost() const { return enter_cost; } diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 3484a9de65..5dbba313bc 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -167,58 +167,78 @@ void NavigationRegion2D::_notification(int p_what) { case NOTIFICATION_DRAW: { #ifdef DEBUG_ENABLED - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) { - Vector<Vector2> verts = navigation_polygon->get_vertices(); - if (verts.size() < 3) { + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer2D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) { + Vector<Vector2> navigation_polygon_vertices = navigation_polygon->get_vertices(); + if (navigation_polygon_vertices.size() < 3) { return; } - Color color; - if (enabled) { - color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color(); - } else { - color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_disabled_color(); + const NavigationServer2D *ns2d = NavigationServer2D::get_singleton(); + + bool enabled_geometry_face_random_color = ns2d->get_debug_navigation_enable_geometry_face_random_color(); + bool enabled_edge_lines = ns2d->get_debug_navigation_enable_edge_lines(); + bool enable_edge_connections = ns2d->get_debug_navigation_enable_edge_connections(); + + Color debug_face_color = ns2d->get_debug_navigation_geometry_face_color(); + Color debug_edge_color = ns2d->get_debug_navigation_geometry_edge_color(); + Color debug_edge_connection_color = ns2d->get_debug_navigation_edge_connection_color(); + + if (!enabled) { + debug_face_color = ns2d->get_debug_navigation_geometry_face_disabled_color(); + debug_edge_color = ns2d->get_debug_navigation_geometry_edge_disabled_color(); } - Color doors_color = NavigationServer3D::get_singleton()->get_debug_navigation_edge_connection_color(); RandomPCG rand; for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) { // An array of vertices for this polygon. Vector<int> polygon = navigation_polygon->get_polygon(i); - Vector<Vector2> vertices; - vertices.resize(polygon.size()); + Vector<Vector2> debug_polygon_vertices; + debug_polygon_vertices.resize(polygon.size()); for (int j = 0; j < polygon.size(); j++) { - ERR_FAIL_INDEX(polygon[j], verts.size()); - vertices.write[j] = verts[polygon[j]]; + ERR_FAIL_INDEX(polygon[j], navigation_polygon_vertices.size()); + debug_polygon_vertices.write[j] = navigation_polygon_vertices[polygon[j]]; } // Generate the polygon color, slightly randomly modified from the settings one. - Color random_variation_color; - random_variation_color.set_hsv(color.get_h() + rand.random(-1.0, 1.0) * 0.1, color.get_s(), color.get_v() + rand.random(-1.0, 1.0) * 0.2); - random_variation_color.a = color.a; - Vector<Color> colors; - colors.push_back(random_variation_color); + Color random_variation_color = debug_face_color; + if (enabled_geometry_face_random_color) { + random_variation_color.set_hsv( + debug_face_color.get_h() + rand.random(-1.0, 1.0) * 0.1, + debug_face_color.get_s(), + debug_face_color.get_v() + rand.random(-1.0, 1.0) * 0.2); + } + random_variation_color.a = debug_face_color.a; - RS::get_singleton()->canvas_item_add_polygon(get_canvas_item(), vertices, colors); + Vector<Color> debug_face_colors; + debug_face_colors.push_back(random_variation_color); + RS::get_singleton()->canvas_item_add_polygon(get_canvas_item(), debug_polygon_vertices, debug_face_colors); + + if (enabled_edge_lines) { + Vector<Color> debug_edge_colors; + debug_edge_colors.push_back(debug_edge_color); + debug_polygon_vertices.push_back(debug_polygon_vertices[0]); // Add first again for closing polyline. + RS::get_singleton()->canvas_item_add_polyline(get_canvas_item(), debug_polygon_vertices, debug_edge_colors); + } } - // Draw the region - Transform2D xform = get_global_transform(); - const NavigationServer2D *ns = NavigationServer2D::get_singleton(); - real_t radius = ns->map_get_edge_connection_margin(get_world_2d()->get_navigation_map()) / 2.0; - for (int i = 0; i < ns->region_get_connections_count(region); i++) { - // Two main points - Vector2 a = ns->region_get_connection_pathway_start(region, i); - a = xform.affine_inverse().xform(a); - Vector2 b = ns->region_get_connection_pathway_end(region, i); - b = xform.affine_inverse().xform(b); - draw_line(a, b, doors_color); - - // Draw a circle to illustrate the margins. - real_t angle = a.angle_to_point(b); - draw_arc(a, radius, angle + Math_PI / 2.0, angle - Math_PI / 2.0 + Math_TAU, 10, doors_color); - draw_arc(b, radius, angle - Math_PI / 2.0, angle + Math_PI / 2.0, 10, doors_color); + if (enable_edge_connections) { + // Draw the region edge connections. + Transform2D xform = get_global_transform(); + real_t radius = ns2d->map_get_edge_connection_margin(get_world_2d()->get_navigation_map()) / 2.0; + for (int i = 0; i < ns2d->region_get_connections_count(region); i++) { + // Two main points + Vector2 a = ns2d->region_get_connection_pathway_start(region, i); + a = xform.affine_inverse().xform(a); + Vector2 b = ns2d->region_get_connection_pathway_end(region, i); + b = xform.affine_inverse().xform(b); + draw_line(a, b, debug_edge_connection_color); + + // Draw a circle to illustrate the margins. + real_t angle = a.angle_to_point(b); + draw_arc(a, radius, angle + Math_PI / 2.0, angle - Math_PI / 2.0 + Math_TAU, 10, debug_edge_connection_color); + draw_arc(b, radius, angle - Math_PI / 2.0, angle + Math_PI / 2.0, 10, debug_edge_connection_color); + } } } #endif // DEBUG_ENABLED diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 95bf67d38d..11e59d9858 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -752,6 +752,21 @@ TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() { return navigation_visibility_mode; } +void TileMap::set_navigation_map(int p_layer, RID p_map) { + ERR_FAIL_INDEX(p_layer, (int)layers.size()); + ERR_FAIL_COND_MSG(!is_inside_tree(), "A TileMap navigation map can only be changed while inside the SceneTree."); + layers[p_layer].navigation_map = p_map; + layers[p_layer].uses_world_navigation_map = p_map == get_world_2d()->get_navigation_map(); +} + +RID TileMap::get_navigation_map(int p_layer) const { + ERR_FAIL_INDEX_V(p_layer, (int)layers.size(), RID()); + if (layers[p_layer].navigation_map.is_valid()) { + return layers[p_layer].navigation_map; + } + return RID(); +} + void TileMap::set_y_sort_enabled(bool p_enable) { Node2D::set_y_sort_enabled(p_enable); _clear_internals(); @@ -897,6 +912,9 @@ void TileMap::_recreate_layer_internals(int p_layer) { // Update the layer internals. _rendering_update_layer(p_layer); + // Update the layer internal navigation maps. + _navigation_update_layer(p_layer); + // Recreate the quadrants. const HashMap<Vector2i, TileMapCell> &tile_map = layers[p_layer].tile_map; for (const KeyValue<Vector2i, TileMapCell> &E : tile_map) { @@ -959,6 +977,9 @@ void TileMap::_clear_layer_internals(int p_layer) { // Clear the layers internals. _rendering_cleanup_layer(p_layer); + // Clear the layers internal navigation maps. + _navigation_cleanup_layer(p_layer); + // Clear the dirty quadrants list. while (layers[p_layer].dirty_quadrant_list.first()) { layers[p_layer].dirty_quadrant_list.remove(layers[p_layer].dirty_quadrant_list.first()); @@ -1083,6 +1104,38 @@ void TileMap::_rendering_notification(int p_what) { } } +void TileMap::_navigation_update_layer(int p_layer) { + ERR_FAIL_INDEX(p_layer, (int)layers.size()); + ERR_FAIL_NULL(NavigationServer2D::get_singleton()); + + if (!layers[p_layer].navigation_map.is_valid()) { + if (p_layer == 0 && is_inside_tree()) { + // Use the default World2D navigation map for the first layer when empty. + layers[p_layer].navigation_map = get_world_2d()->get_navigation_map(); + layers[p_layer].uses_world_navigation_map = true; + } else { + RID new_layer_map = NavigationServer2D::get_singleton()->map_create(); + NavigationServer2D::get_singleton()->map_set_active(new_layer_map, true); + layers[p_layer].navigation_map = new_layer_map; + layers[p_layer].uses_world_navigation_map = false; + } + } +} + +void TileMap::_navigation_cleanup_layer(int p_layer) { + ERR_FAIL_INDEX(p_layer, (int)layers.size()); + ERR_FAIL_NULL(NavigationServer2D::get_singleton()); + + if (layers[p_layer].navigation_map.is_valid()) { + if (layers[p_layer].uses_world_navigation_map) { + // Do not delete the World2D default navigation map. + return; + } + NavigationServer2D::get_singleton()->free(layers[p_layer].navigation_map); + layers[p_layer].navigation_map = RID(); + } +} + void TileMap::_rendering_update_layer(int p_layer) { ERR_FAIL_INDEX(p_layer, (int)layers.size()); @@ -1732,6 +1785,9 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List q.navigation_regions[E_cell].resize(tile_set->get_navigation_layers_count()); for (int layer_index = 0; layer_index < tile_set->get_navigation_layers_count(); layer_index++) { + if (layer_index >= (int)layers.size() || !layers[layer_index].navigation_map.is_valid()) { + continue; + } Ref<NavigationPolygon> navigation_polygon; navigation_polygon = tile_data->get_navigation_polygon(layer_index); @@ -1741,7 +1797,7 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List RID region = NavigationServer2D::get_singleton()->region_create(); NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id()); - NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map()); + NavigationServer2D::get_singleton()->region_set_map(region, layers[layer_index].navigation_map); NavigationServer2D::get_singleton()->region_set_transform(region, tilemap_xform * tile_transform); NavigationServer2D::get_singleton()->region_set_navigation_layers(region, tile_set->get_navigation_layer_layers(layer_index)); NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon); @@ -1795,12 +1851,16 @@ void TileMap::_navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant) { return; } +#ifdef DEBUG_ENABLED RenderingServer *rs = RenderingServer::get_singleton(); + const NavigationServer2D *ns2d = NavigationServer2D::get_singleton(); + + bool enabled_geometry_face_random_color = ns2d->get_debug_navigation_enable_geometry_face_random_color(); + bool enabled_edge_lines = ns2d->get_debug_navigation_enable_edge_lines(); + + Color debug_face_color = ns2d->get_debug_navigation_geometry_face_color(); + Color debug_edge_color = ns2d->get_debug_navigation_geometry_edge_color(); - Color color = Color(0.5, 1.0, 1.0, 1.0); -#ifdef DEBUG_ENABLED - color = NavigationServer3D::get_singleton()->get_debug_navigation_geometry_face_color(); -#endif // DEBUG_ENABLED RandomPCG rand; Vector2 quadrant_pos = map_to_local(p_quadrant->coords * get_effective_quadrant_size(p_quadrant->layer)); @@ -1830,34 +1890,50 @@ void TileMap::_navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant) { rs->canvas_item_add_set_transform(p_quadrant->debug_canvas_item, cell_to_quadrant); for (int layer_index = 0; layer_index < tile_set->get_navigation_layers_count(); layer_index++) { - Ref<NavigationPolygon> navpoly = tile_data->get_navigation_polygon(layer_index); - if (navpoly.is_valid()) { - PackedVector2Array navigation_polygon_vertices = navpoly->get_vertices(); + Ref<NavigationPolygon> navigation_polygon = tile_data->get_navigation_polygon(layer_index); + if (navigation_polygon.is_valid()) { + Vector<Vector2> navigation_polygon_vertices = navigation_polygon->get_vertices(); + if (navigation_polygon_vertices.size() < 3) { + continue; + } - for (int i = 0; i < navpoly->get_polygon_count(); i++) { + for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) { // An array of vertices for this polygon. - Vector<int> polygon = navpoly->get_polygon(i); - Vector<Vector2> vertices; - vertices.resize(polygon.size()); + Vector<int> polygon = navigation_polygon->get_polygon(i); + Vector<Vector2> debug_polygon_vertices; + debug_polygon_vertices.resize(polygon.size()); for (int j = 0; j < polygon.size(); j++) { ERR_FAIL_INDEX(polygon[j], navigation_polygon_vertices.size()); - vertices.write[j] = navigation_polygon_vertices[polygon[j]]; + debug_polygon_vertices.write[j] = navigation_polygon_vertices[polygon[j]]; } // Generate the polygon color, slightly randomly modified from the settings one. - Color random_variation_color; - random_variation_color.set_hsv(color.get_h() + rand.random(-1.0, 1.0) * 0.05, color.get_s(), color.get_v() + rand.random(-1.0, 1.0) * 0.1); - random_variation_color.a = color.a; - Vector<Color> colors; - colors.push_back(random_variation_color); + Color random_variation_color = debug_face_color; + if (enabled_geometry_face_random_color) { + random_variation_color.set_hsv( + debug_face_color.get_h() + rand.random(-1.0, 1.0) * 0.1, + debug_face_color.get_s(), + debug_face_color.get_v() + rand.random(-1.0, 1.0) * 0.2); + } + random_variation_color.a = debug_face_color.a; - rs->canvas_item_add_polygon(p_quadrant->debug_canvas_item, vertices, colors); + Vector<Color> debug_face_colors; + debug_face_colors.push_back(random_variation_color); + rs->canvas_item_add_polygon(p_quadrant->debug_canvas_item, debug_polygon_vertices, debug_face_colors); + + if (enabled_edge_lines) { + Vector<Color> debug_edge_colors; + debug_edge_colors.push_back(debug_edge_color); + debug_polygon_vertices.push_back(debug_polygon_vertices[0]); // Add first again for closing polyline. + rs->canvas_item_add_polyline(p_quadrant->debug_canvas_item, debug_polygon_vertices, debug_edge_colors); + } } } } } } } +#endif // DEBUG_ENABLED } /////////////////////////////// Scenes ////////////////////////////////////// @@ -4031,6 +4107,9 @@ void TileMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_visibility_mode", "navigation_visibility_mode"), &TileMap::set_navigation_visibility_mode); ClassDB::bind_method(D_METHOD("get_navigation_visibility_mode"), &TileMap::get_navigation_visibility_mode); + ClassDB::bind_method(D_METHOD("set_navigation_map", "layer", "map"), &TileMap::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map", "layer"), &TileMap::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_cell", "layer", "coords", "source_id", "atlas_coords", "alternative_tile"), &TileMap::set_cell, DEFVAL(TileSet::INVALID_SOURCE), DEFVAL(TileSetSource::INVALID_ATLAS_COORDS), DEFVAL(0)); ClassDB::bind_method(D_METHOD("erase_cell", "layer", "coords"), &TileMap::erase_cell); ClassDB::bind_method(D_METHOD("get_cell_source_id", "layer", "coords", "use_proxies"), &TileMap::get_cell_source_id, DEFVAL(false)); diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 7cf2a2eded..e9c1cb0c11 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -211,6 +211,8 @@ private: HashMap<Vector2i, TileMapCell> tile_map; HashMap<Vector2i, TileMapQuadrant> quadrant_map; SelfList<TileMapQuadrant>::List dirty_quadrant_list; + RID navigation_map; + bool uses_world_navigation_map = false; }; LocalVector<TileMapLayer> layers; int selected_layer = -1; @@ -259,6 +261,8 @@ private: void _physics_draw_quadrant_debug(TileMapQuadrant *p_quadrant); void _navigation_notification(int p_what); + void _navigation_update_layer(int p_layer); + void _navigation_cleanup_layer(int p_layer); void _navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List &r_dirty_quadrant_list); void _navigation_cleanup_quadrant(TileMapQuadrant *p_quadrant); void _navigation_draw_quadrant_debug(TileMapQuadrant *p_quadrant); @@ -339,6 +343,9 @@ public: void set_navigation_visibility_mode(VisibilityMode p_show_navigation); VisibilityMode get_navigation_visibility_mode(); + void set_navigation_map(int p_layer, RID p_map); + RID get_navigation_map(int p_layer) const; + // Cells accessors. void set_cell(int p_layer, const Vector2i &p_coords, int p_source_id = TileSet::INVALID_SOURCE, const Vector2i p_atlas_coords = TileSetSource::INVALID_ATLAS_COORDS, int p_alternative_tile = 0); void erase_cell(int p_layer, const Vector2i &p_coords); diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp index e122adcc8c..6f2717fd41 100644 --- a/scene/3d/decal.cpp +++ b/scene/3d/decal.cpp @@ -31,7 +31,7 @@ #include "decal.h" void Decal::set_size(const Vector3 &p_size) { - size = p_size; + size = Vector3(MAX(0.001, p_size.x), MAX(0.001, p_size.y), MAX(0.001, p_size.z)); RS::get_singleton()->decal_set_size(decal, p_size); update_gizmos(); } diff --git a/scene/3d/label_3d.cpp b/scene/3d/label_3d.cpp index b39ca43d2e..5fc36abb76 100644 --- a/scene/3d/label_3d.cpp +++ b/scene/3d/label_3d.cpp @@ -442,6 +442,18 @@ void Label3D::_generate_glyph_surfaces(const Glyph &p_glyph, Vector2 &r_offset, } void Label3D::_shape() { + // When a shaped text is invalidated by an external source, we want to reshape it. + if (!TS->shaped_text_is_ready(text_rid)) { + dirty_text = true; + } + + for (const RID &line_rid : lines_rid) { + if (!TS->shaped_text_is_ready(line_rid)) { + dirty_lines = true; + break; + } + } + // Clear mesh. RS::get_singleton()->mesh_clear(mesh); aabb = AABB(); diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index fb74cffc94..b4387b0f3c 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -163,7 +163,8 @@ Array LightmapGIData::_get_light_textures_data() const { config->set_value("remap", "importer", "2d_array_texture"); config->set_value("remap", "type", "CompressedTexture2DArray"); if (!config->has_section_key("params", "compress/mode")) { - config->set_value("params", "compress/mode", 2); //user may want another compression, so leave it be + // User may want another compression, so leave it be, but default to VRAM uncompressed. + config->set_value("params", "compress/mode", 3); } config->set_value("params", "compress/channel_pack", 1); config->set_value("params", "mipmaps/generate", false); diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 081e7505d0..5b5ad62d64 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -30,6 +30,7 @@ #include "navigation_agent_3d.h" +#include "scene/3d/navigation_link_3d.h" #include "servers/navigation_server_3d.h" void NavigationAgent3D::_bind_methods() { @@ -130,7 +131,7 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_debug_path_custom_point_size", "point_size"), &NavigationAgent3D::set_debug_path_custom_point_size); ClassDB::bind_method(D_METHOD("get_debug_path_custom_point_size"), &NavigationAgent3D::get_debug_path_custom_point_size); - ADD_GROUP("Debug", ""); + ADD_GROUP("Debug", "debug_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_enabled"), "set_debug_enabled", "get_debug_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug_use_custom"), "set_debug_use_custom", "get_debug_use_custom"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_path_custom_color"), "set_debug_path_custom_color", "get_debug_path_custom_color"); @@ -649,6 +650,21 @@ void NavigationAgent3D::update_navigation() { } details[SNAME("owner")] = owner; + + if (waypoint_type == NavigationPathQueryResult3D::PATH_SEGMENT_TYPE_LINK) { + const NavigationLink3D *navlink = Object::cast_to<NavigationLink3D>(owner); + if (navlink) { + Vector3 link_global_start_position = navlink->get_global_start_position(); + Vector3 link_global_end_position = navlink->get_global_end_position(); + if (waypoint.distance_to(link_global_start_position) < waypoint.distance_to(link_global_end_position)) { + details[SNAME("link_entry_position")] = link_global_start_position; + details[SNAME("link_exit_position")] = link_global_end_position; + } else { + details[SNAME("link_entry_position")] = link_global_end_position; + details[SNAME("link_exit_position")] = link_global_start_position; + } + } + } } // Emit a signal for the waypoint diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp index f47fcfaf51..9c4b8e7905 100644 --- a/scene/3d/navigation_link_3d.cpp +++ b/scene/3d/navigation_link_3d.cpp @@ -163,6 +163,12 @@ void NavigationLink3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_end_position", "position"), &NavigationLink3D::set_end_position); ClassDB::bind_method(D_METHOD("get_end_position"), &NavigationLink3D::get_end_position); + ClassDB::bind_method(D_METHOD("set_global_start_position", "position"), &NavigationLink3D::set_global_start_position); + ClassDB::bind_method(D_METHOD("get_global_start_position"), &NavigationLink3D::get_global_start_position); + + ClassDB::bind_method(D_METHOD("set_global_end_position", "position"), &NavigationLink3D::set_global_end_position); + ClassDB::bind_method(D_METHOD("get_global_end_position"), &NavigationLink3D::get_global_end_position); + ClassDB::bind_method(D_METHOD("set_enter_cost", "enter_cost"), &NavigationLink3D::set_enter_cost); ClassDB::bind_method(D_METHOD("get_enter_cost"), &NavigationLink3D::get_enter_cost); @@ -386,6 +392,38 @@ void NavigationLink3D::set_end_position(Vector3 p_position) { update_configuration_warnings(); } +void NavigationLink3D::set_global_start_position(Vector3 p_position) { + if (is_inside_tree()) { + set_start_position(to_local(p_position)); + } else { + set_start_position(p_position); + } +} + +Vector3 NavigationLink3D::get_global_start_position() const { + if (is_inside_tree()) { + return to_global(start_position); + } else { + return start_position; + } +} + +void NavigationLink3D::set_global_end_position(Vector3 p_position) { + if (is_inside_tree()) { + set_end_position(to_local(p_position)); + } else { + set_end_position(p_position); + } +} + +Vector3 NavigationLink3D::get_global_end_position() const { + if (is_inside_tree()) { + return to_global(end_position); + } else { + return end_position; + } +} + void NavigationLink3D::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); if (Math::is_equal_approx(enter_cost, p_enter_cost)) { diff --git a/scene/3d/navigation_link_3d.h b/scene/3d/navigation_link_3d.h index 5c9ec36189..991f45c85d 100644 --- a/scene/3d/navigation_link_3d.h +++ b/scene/3d/navigation_link_3d.h @@ -83,6 +83,12 @@ public: void set_end_position(Vector3 p_position); Vector3 get_end_position() const { return end_position; } + void set_global_start_position(Vector3 p_position); + Vector3 get_global_start_position() const; + + void set_global_end_position(Vector3 p_position); + Vector3 get_global_end_position() const; + void set_enter_cost(real_t p_enter_cost); real_t get_enter_cost() const { return enter_cost; } diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 3fe46b380f..d3207c1a3d 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -350,29 +350,29 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_is_exter set_parameter(active, true); } - real_t blend; - + real_t blend = 1.0; + bool use_blend = sync; if (cur_time < fade_in) { if (fade_in > 0) { + use_blend = true; blend = cur_time / fade_in; } else { - blend = 0; + blend = 0; // Should not happen. } } else if (!do_start && cur_remaining <= fade_out) { + use_blend = true; if (fade_out > 0) { blend = (cur_remaining / fade_out); } else { blend = 0; } - } else { - blend = 1.0; } - double main_rem; + double main_rem = 0.0; if (mix == MIX_MODE_ADD) { main_rem = blend_input(0, p_time, p_seek, p_is_external_seeking, 1.0, FILTER_IGNORE, sync); } else { - main_rem = blend_input(0, p_time, p_seek, p_is_external_seeking, 1.0 - blend, FILTER_BLEND, sync); // Unlike below, processing this edge is a corner case. + main_rem = blend_input(0, p_time, use_blend && p_seek, p_is_external_seeking, 1.0 - blend, FILTER_BLEND, sync); // Unlike below, processing this edge is a corner case. } double os_rem = blend_input(1, os_seek ? cur_time : p_time, os_seek, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_PASS, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. @@ -825,6 +825,7 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex bool switched = false; bool restart = false; + bool clear_remaining_fade = false; if (pending_update) { if (cur_current_index < 0 || cur_current_index >= get_input_count()) { @@ -842,6 +843,10 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex pending_update = false; } + if (p_time == 0 && p_seek && !p_is_external_seeking) { + clear_remaining_fade = true; // Reset occurs. + } + if (!cur_transition_request.is_empty()) { int new_idx = find_input(cur_transition_request); if (new_idx >= 0) { @@ -849,10 +854,7 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex if (allow_transition_to_self) { // Transition to same state. restart = input_data[cur_current_index].reset; - cur_prev_xfading = 0; - set_parameter(prev_xfading, 0); - cur_prev_index = -1; - set_parameter(prev_index, -1); + clear_remaining_fade = true; } } else { switched = true; @@ -869,6 +871,13 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex set_parameter(transition_request, cur_transition_request); } + if (clear_remaining_fade) { + cur_prev_xfading = 0; + set_parameter(prev_xfading, 0); + cur_prev_index = -1; + set_parameter(prev_index, -1); + } + // Special case for restart. if (restart) { set_parameter(time, 0); @@ -910,24 +919,31 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex } else { // Cross-fading from prev to current. - real_t blend = xfade_time == 0 ? 0 : (cur_prev_xfading / xfade_time); - if (xfade_curve.is_valid()) { - blend = xfade_curve->sample(blend); + real_t blend = 0.0; + real_t blend_inv = 1.0; + bool use_blend = sync; + if (xfade_time > 0) { + use_blend = true; + blend = cur_prev_xfading / xfade_time; + if (xfade_curve.is_valid()) { + blend = xfade_curve->sample(blend); + } + blend_inv = 1.0 - blend; + blend = Math::is_zero_approx(blend) ? CMP_EPSILON : blend; + blend_inv = Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv; } // Blend values must be more than CMP_EPSILON to process discrete keys in edge. - real_t blend_inv = 1.0 - blend; if (input_data[cur_current_index].reset && !p_seek && switched) { // Just switched, seek to start of current. - rem = blend_input(cur_current_index, 0, true, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true); + rem = blend_input(cur_current_index, 0, true, p_is_external_seeking, blend_inv, FILTER_IGNORE, true); } else { - rem = blend_input(cur_current_index, p_time, p_seek, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true); + rem = blend_input(cur_current_index, p_time, p_seek, p_is_external_seeking, blend_inv, FILTER_IGNORE, true); } + blend_input(cur_prev_index, p_time, use_blend && p_seek, p_is_external_seeking, blend, FILTER_IGNORE, true); if (p_seek) { - blend_input(cur_prev_index, p_time, true, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true); cur_time = p_time; } else { - blend_input(cur_prev_index, p_time, false, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true); cur_time += p_time; cur_prev_xfading -= p_time; if (cur_prev_xfading < 0) { diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index ad0c19b1e6..fc3a3d306f 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -199,7 +199,7 @@ void AnimationPlayer::_validate_property(PropertyInfo &p_property) const { void AnimationPlayer::_get_property_list(List<PropertyInfo> *p_list) const { List<PropertyInfo> anim_names; - anim_names.push_back(PropertyInfo(Variant::DICTIONARY, "libraries")); + anim_names.push_back(PropertyInfo(Variant::DICTIONARY, PNAME("libraries"))); for (const KeyValue<StringName, AnimationData> &E : animation_set) { if (E.value.next != StringName()) { diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index 7c2edef1de..9f9916c1c6 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -567,6 +567,10 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { List<StringName> sname; player->get_animation_list(&sname); + root_motion_cache.loc = Vector3(0, 0, 0); + root_motion_cache.rot = Quaternion(0, 0, 0, 1); + root_motion_cache.scale = Vector3(1, 1, 1); + Ref<Animation> reset_anim; bool has_reset_anim = player->has_animation(SceneStringNames::get_singleton()->RESET); if (has_reset_anim) { @@ -1035,14 +1039,13 @@ void AnimationTree::_process_graph(double p_delta) { case Animation::TYPE_POSITION_3D: { TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); if (track->root_motion) { - t->loc = Vector3(0, 0, 0); - t->rot = Quaternion(0, 0, 0, 1); - t->scale = Vector3(1, 1, 1); - } else { - t->loc = t->init_loc; - t->rot = t->init_rot; - t->scale = t->init_scale; + root_motion_cache.loc = Vector3(0, 0, 0); + root_motion_cache.rot = Quaternion(0, 0, 0, 1); + root_motion_cache.scale = Vector3(1, 1, 1); } + t->loc = t->init_loc; + t->rot = t->init_rot; + t->scale = t->init_scale; } break; case Animation::TYPE_BLEND_SHAPE: { TrackCacheBlendShape *t = static_cast<TrackCacheBlendShape *>(track); @@ -1117,6 +1120,7 @@ void AnimationTree::_process_graph(double p_delta) { continue; // Nothing to blend. } TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); + if (track->root_motion && calc_root) { double prev_time = time - delta; if (!backward) { @@ -1164,7 +1168,7 @@ void AnimationTree::_process_graph(double p_delta) { loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx); a->position_track_interpolate(i, (double)a->get_length(), &loc[1]); loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx); - t->loc += (loc[1] - loc[0]) * blend; + root_motion_cache.loc += (loc[1] - loc[0]) * blend; prev_time = 0; } } else { @@ -1176,7 +1180,7 @@ void AnimationTree::_process_graph(double p_delta) { loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx); a->position_track_interpolate(i, 0, &loc[1]); loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx); - t->loc += (loc[1] - loc[0]) * blend; + root_motion_cache.loc += (loc[1] - loc[0]) * blend; prev_time = (double)a->get_length(); } } @@ -1186,13 +1190,13 @@ void AnimationTree::_process_graph(double p_delta) { continue; } loc[0] = post_process_key_value(a, i, loc[0], t->object, t->bone_idx); - a->position_track_interpolate(i, time, &loc[1]); loc[1] = post_process_key_value(a, i, loc[1], t->object, t->bone_idx); - t->loc += (loc[1] - loc[0]) * blend; + root_motion_cache.loc += (loc[1] - loc[0]) * blend; prev_time = !backward ? 0 : (double)a->get_length(); + } - } else { + { Vector3 loc; Error err = a->position_track_interpolate(i, time, &loc); @@ -1211,6 +1215,7 @@ void AnimationTree::_process_graph(double p_delta) { continue; // Nothing to blend. } TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); + if (track->root_motion && calc_root) { double prev_time = time - delta; if (!backward) { @@ -1258,7 +1263,7 @@ void AnimationTree::_process_graph(double p_delta) { rot[0] = post_process_key_value(a, i, rot[0], t->object, t->bone_idx); a->rotation_track_interpolate(i, (double)a->get_length(), &rot[1]); rot[1] = post_process_key_value(a, i, rot[1], t->object, t->bone_idx); - t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); + root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); prev_time = 0; } } else { @@ -1269,7 +1274,7 @@ void AnimationTree::_process_graph(double p_delta) { } rot[0] = post_process_key_value(a, i, rot[0], t->object, t->bone_idx); a->rotation_track_interpolate(i, 0, &rot[1]); - t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); + root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); prev_time = (double)a->get_length(); } } @@ -1282,10 +1287,11 @@ void AnimationTree::_process_graph(double p_delta) { a->rotation_track_interpolate(i, time, &rot[1]); rot[1] = post_process_key_value(a, i, rot[1], t->object, t->bone_idx); - t->rot = (t->rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); + root_motion_cache.rot = (root_motion_cache.rot * Quaternion().slerp(rot[0].inverse() * rot[1], blend)).normalized(); prev_time = !backward ? 0 : (double)a->get_length(); + } - } else { + { Quaternion rot; Error err = a->rotation_track_interpolate(i, time, &rot); @@ -1304,6 +1310,7 @@ void AnimationTree::_process_graph(double p_delta) { continue; // Nothing to blend. } TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); + if (track->root_motion && calc_root) { double prev_time = time - delta; if (!backward) { @@ -1350,7 +1357,7 @@ void AnimationTree::_process_graph(double p_delta) { } scale[0] = post_process_key_value(a, i, scale[0], t->object, t->bone_idx); a->scale_track_interpolate(i, (double)a->get_length(), &scale[1]); - t->scale += (scale[1] - scale[0]) * blend; + root_motion_cache.scale += (scale[1] - scale[0]) * blend; scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx); prev_time = 0; } @@ -1363,7 +1370,7 @@ void AnimationTree::_process_graph(double p_delta) { scale[0] = post_process_key_value(a, i, scale[0], t->object, t->bone_idx); a->scale_track_interpolate(i, 0, &scale[1]); scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx); - t->scale += (scale[1] - scale[0]) * blend; + root_motion_cache.scale += (scale[1] - scale[0]) * blend; prev_time = (double)a->get_length(); } } @@ -1376,10 +1383,11 @@ void AnimationTree::_process_graph(double p_delta) { a->scale_track_interpolate(i, time, &scale[1]); scale[1] = post_process_key_value(a, i, scale[1], t->object, t->bone_idx); - t->scale += (scale[1] - scale[0]) * blend; + root_motion_cache.scale += (scale[1] - scale[0]) * blend; prev_time = !backward ? 0 : (double)a->get_length(); + } - } else { + { Vector3 scale; Error err = a->scale_track_interpolate(i, time, &scale); @@ -1692,10 +1700,12 @@ void AnimationTree::_process_graph(double p_delta) { TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); if (t->root_motion) { - root_motion_position = t->loc; - root_motion_rotation = t->rot; - root_motion_scale = t->scale - Vector3(1, 1, 1); - + root_motion_position = root_motion_cache.loc; + root_motion_rotation = root_motion_cache.rot; + root_motion_scale = root_motion_cache.scale - Vector3(1, 1, 1); + root_motion_position_accumulator = t->loc; + root_motion_rotation_accumulator = t->rot; + root_motion_scale_accumulator = t->scale; } else if (t->skeleton && t->bone_idx >= 0) { if (t->loc_used) { t->skeleton->set_bone_pose_position(t->bone_idx, t->loc); @@ -1997,6 +2007,18 @@ Vector3 AnimationTree::get_root_motion_scale() const { return root_motion_scale; } +Vector3 AnimationTree::get_root_motion_position_accumulator() const { + return root_motion_position_accumulator; +} + +Quaternion AnimationTree::get_root_motion_rotation_accumulator() const { + return root_motion_rotation_accumulator; +} + +Vector3 AnimationTree::get_root_motion_scale_accumulator() const { + return root_motion_scale_accumulator; +} + void AnimationTree::_tree_changed() { if (properties_dirty) { return; @@ -2186,6 +2208,9 @@ void AnimationTree::_bind_methods() { ClassDB::bind_method(D_METHOD("get_root_motion_position"), &AnimationTree::get_root_motion_position); ClassDB::bind_method(D_METHOD("get_root_motion_rotation"), &AnimationTree::get_root_motion_rotation); ClassDB::bind_method(D_METHOD("get_root_motion_scale"), &AnimationTree::get_root_motion_scale); + ClassDB::bind_method(D_METHOD("get_root_motion_position_accumulator"), &AnimationTree::get_root_motion_position_accumulator); + ClassDB::bind_method(D_METHOD("get_root_motion_rotation_accumulator"), &AnimationTree::get_root_motion_rotation_accumulator); + ClassDB::bind_method(D_METHOD("get_root_motion_scale_accumulator"), &AnimationTree::get_root_motion_scale_accumulator); ClassDB::bind_method(D_METHOD("_update_properties"), &AnimationTree::_update_properties); diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index 0540add85b..c68cae56ea 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -228,6 +228,12 @@ private: } }; + struct RootMotionCache { + Vector3 loc = Vector3(0, 0, 0); + Quaternion rot = Quaternion(0, 0, 0, 1); + Vector3 scale = Vector3(1, 1, 1); + }; + struct TrackCacheBlendShape : public TrackCache { MeshInstance3D *mesh_3d = nullptr; float init_value = 0; @@ -294,6 +300,7 @@ private: } }; + RootMotionCache root_motion_cache; HashMap<NodePath, TrackCache *> track_cache; HashSet<TrackCache *> playing_caches; Vector<Node *> playing_audio_stream_players; @@ -327,6 +334,9 @@ private: Vector3 root_motion_position = Vector3(0, 0, 0); Quaternion root_motion_rotation = Quaternion(0, 0, 0, 1); Vector3 root_motion_scale = Vector3(0, 0, 0); + Vector3 root_motion_position_accumulator = Vector3(0, 0, 0); + Quaternion root_motion_rotation_accumulator = Quaternion(0, 0, 0, 1); + Vector3 root_motion_scale_accumulator = Vector3(1, 1, 1); friend class AnimationNode; bool properties_dirty = true; @@ -394,6 +404,10 @@ public: Quaternion get_root_motion_rotation() const; Vector3 get_root_motion_scale() const; + Vector3 get_root_motion_position_accumulator() const; + Quaternion get_root_motion_rotation_accumulator() const; + Vector3 get_root_motion_scale_accumulator() const; + real_t get_connection_activity(const StringName &p_path, int p_connection) const; void advance(double p_time); diff --git a/scene/animation/root_motion_view.cpp b/scene/animation/root_motion_view.cpp index 3d8d451c70..fc758b9456 100644 --- a/scene/animation/root_motion_view.cpp +++ b/scene/animation/root_motion_view.cpp @@ -88,6 +88,7 @@ void RootMotionView::_notification(int p_what) { case NOTIFICATION_INTERNAL_PROCESS: case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { Transform3D transform; + Basis diff; if (has_node(path)) { Node *node = get_node(path); @@ -103,9 +104,9 @@ void RootMotionView::_notification(int p_what) { set_process_internal(true); set_physics_process_internal(false); } - transform.origin = tree->get_root_motion_position(); transform.basis = tree->get_root_motion_rotation(); // Scale is meaningless. + diff = tree->get_root_motion_rotation_accumulator(); } } @@ -115,8 +116,10 @@ void RootMotionView::_notification(int p_what) { first = false; - accumulated.origin += transform.origin; accumulated.basis *= transform.basis; + transform.origin = (diff.inverse() * accumulated.basis).xform(transform.origin); + accumulated.origin += transform.origin; + accumulated.origin.x = Math::fposmod(accumulated.origin.x, cell_size); if (zero_y) { accumulated.origin.y = 0; diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index abc7814877..9d1118e0ef 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -60,6 +60,20 @@ void Tweener::_bind_methods() { ADD_SIGNAL(MethodInfo("finished")); } +bool Tween::_validate_type_match(const Variant &p_from, Variant &r_to) { + if (p_from.get_type() != r_to.get_type()) { + // Cast r_to between double and int to avoid minor annoyances. + if (p_from.get_type() == Variant::FLOAT && r_to.get_type() == Variant::INT) { + r_to = double(r_to); + } else if (p_from.get_type() == Variant::INT && r_to.get_type() == Variant::FLOAT) { + r_to = int(r_to); + } else { + ERR_FAIL_V_MSG(false, "Type mismatch between initial and final value: " + Variant::get_type_name(p_from.get_type()) + " and " + Variant::get_type_name(r_to.get_type())); + } + } + return true; +} + void Tween::_start_tweeners() { if (tweeners.is_empty()) { dead = true; @@ -85,16 +99,8 @@ Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree."); ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first."); - Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type(); - if (property_type != p_to.get_type()) { - // Cast p_to between double and int to avoid minor annoyances. - if (property_type == Variant::FLOAT && p_to.get_type() == Variant::INT) { - p_to = double(p_to); - } else if (property_type == Variant::INT && p_to.get_type() == Variant::FLOAT) { - p_to = int(p_to); - } else { - ERR_FAIL_V_MSG(Ref<PropertyTweener>(), "Type mismatch between property and final value: " + Variant::get_type_name(property_type) + " and " + Variant::get_type_name(p_to.get_type())); - } + if (!_validate_type_match(p_target->get_indexed(p_property.get_as_property_path().get_subnames()), p_to)) { + return nullptr; } Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, p_property, p_to, p_duration)); @@ -124,6 +130,10 @@ Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Vari ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree."); ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first."); + if (!_validate_type_match(p_from, p_to)) { + return nullptr; + } + Ref<MethodTweener> tweener = memnew(MethodTweener(p_callback, p_from, p_to, p_duration)); append(tweener); return tweener; diff --git a/scene/animation/tween.h b/scene/animation/tween.h index 58217db535..c5abcb28a6 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -47,6 +47,7 @@ public: protected: static void _bind_methods(); + Ref<Tween> tween; double elapsed_time = 0; bool finished = false; @@ -125,6 +126,7 @@ private: void _start_tweeners(); void _stop_internal(bool p_reset); + bool _validate_type_match(const Variant &p_from, Variant &r_to); protected: static void _bind_methods(); diff --git a/scene/gui/aspect_ratio_container.cpp b/scene/gui/aspect_ratio_container.cpp index 802189c374..94240ccead 100644 --- a/scene/gui/aspect_ratio_container.cpp +++ b/scene/gui/aspect_ratio_container.cpp @@ -30,6 +30,8 @@ #include "aspect_ratio_container.h" +#include "scene/gui/texture_rect.h" + Size2 AspectRatioContainer::get_minimum_size() const { Size2 ms; for (int i = 0; i < get_child_count(); i++) { @@ -113,6 +115,16 @@ void AspectRatioContainer::_notification(int p_what) { if (c->is_set_as_top_level()) { continue; } + + // Temporary fix for editor crash. + TextureRect *trect = Object::cast_to<TextureRect>(c); + if (trect) { + if (trect->get_expand_mode() == TextureRect::EXPAND_FIT_WIDTH_PROPORTIONAL || trect->get_expand_mode() == TextureRect::EXPAND_FIT_HEIGHT_PROPORTIONAL) { + WARN_PRINT_ONCE("Proportional TextureRect is currently not supported inside AspectRatioContainer"); + continue; + } + } + Size2 child_minsize = c->get_combined_minimum_size(); Size2 child_size = Size2(ratio, 1.0); float scale_factor = 1.0; diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index b084cb5bea..e2f7ec860c 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -2856,7 +2856,7 @@ void CodeEdit::_filter_code_completion_candidates_impl() { const int caret_line = get_caret_line(); const int caret_column = get_caret_column(); const String line = get_line(caret_line); - ERR_FAIL_INDEX_MSG(caret_column - 1, line.length(), "Caret column exceeds line length."); + ERR_FAIL_INDEX_MSG(caret_column, line.length() + 1, "Caret column exceeds line length."); if (caret_column > 0 && line[caret_column - 1] == '(' && !code_completion_forced) { cancel_code_completion(); diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index da29bc823f..0b0698188c 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -1197,11 +1197,11 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event, Control *c) { } if (!spinning) { - real_t x = CLAMP(bev->get_position().x, corner_x, c->get_size().x - corner_x); - real_t y = CLAMP(bev->get_position().y, corner_x, c->get_size().y - corner_y); + real_t x = CLAMP(bev->get_position().x - corner_x, 0, real_size.x); + real_t y = CLAMP(bev->get_position().y - corner_y, 0, real_size.y); - s = (x - c->get_position().x - corner_x) / real_size.x; - v = 1.0 - (y - c->get_position().y - corner_y) / real_size.y; + s = x / real_size.x; + v = 1.0 - y / real_size.y; } } @@ -1250,11 +1250,11 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event, Control *c) { real_t corner_y = (c == wheel_uv) ? center.y - Math_SQRT12 * c->get_size().height * 0.42 : 0; Size2 real_size(c->get_size().x - corner_x * 2, c->get_size().y - corner_y * 2); - real_t x = CLAMP(mev->get_position().x, corner_x, c->get_size().x - corner_x); - real_t y = CLAMP(mev->get_position().y, corner_x, c->get_size().y - corner_y); + real_t x = CLAMP(mev->get_position().x - corner_x, 0, real_size.x); + real_t y = CLAMP(mev->get_position().y - corner_y, 0, real_size.y); - s = (x - corner_x) / real_size.x; - v = 1.0 - (y - corner_y) / real_size.y; + s = x / real_size.x; + v = 1.0 - y / real_size.y; } } diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index a6a2fb8d7c..58b820c31f 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -860,7 +860,7 @@ bool GraphEdit::is_in_port_hotzone(const Vector2 &pos, const Vector2 &p_mouse_po } for (int i = 0; i < get_child_count(); i++) { - Control *child = Object::cast_to<Control>(get_child(i)); + GraphNode *child = Object::cast_to<GraphNode>(get_child(i)); if (!child) { continue; } diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index f59702835c..b861d7af01 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -86,7 +86,7 @@ int Label::get_line_height(int p_line) const { } } -void Label::_shape() { +bool Label::_shape() { Ref<StyleBox> style = theme_cache.normal_style; int width = (get_size().width - style->get_minimum_size().width); @@ -101,7 +101,7 @@ void Label::_shape() { } const Ref<Font> &font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font; int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size; - ERR_FAIL_COND(font.is_null()); + ERR_FAIL_COND_V(font.is_null(), true); String txt = (uppercase) ? TS->string_to_upper(xl_text, language) : xl_text; if (visible_chars >= 0 && visible_chars_behavior == TextServer::VC_CHARS_BEFORE_SHAPING) { txt = txt.substr(0, visible_chars); @@ -121,6 +121,7 @@ void Label::_shape() { dirty = false; font_dirty = false; lines_dirty = true; + // Note for future maintainers: forgetting stable width here (e.g., setting it to -1) may fix still undiscovered bugs. } if (lines_dirty) { @@ -128,127 +129,143 @@ void Label::_shape() { TS->free_rid(lines_rid[i]); } lines_rid.clear(); - - BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY; - switch (autowrap_mode) { - case TextServer::AUTOWRAP_WORD_SMART: - autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY; - break; - case TextServer::AUTOWRAP_WORD: - autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY; - break; - case TextServer::AUTOWRAP_ARBITRARY: - autowrap_flags = TextServer::BREAK_GRAPHEME_BOUND | TextServer::BREAK_MANDATORY; - break; - case TextServer::AUTOWRAP_OFF: - break; - } - autowrap_flags = autowrap_flags | TextServer::BREAK_TRIM_EDGE_SPACES; - - PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags); - for (int i = 0; i < line_breaks.size(); i = i + 2) { - RID line = TS->shaped_text_substr(text_rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]); - lines_rid.push_back(line); - } } + Size2i prev_minsize = minsize; + minsize = Size2(); + + bool can_process_lines = false; if (xl_text.length() == 0) { - minsize = Size2(1, get_line_height()); - return; - } + can_process_lines = true; + lines_dirty = false; + } else { + // With autowrap on or off with trimming enabled, we won't compute the minimum size until width is stable + // (two shape requests in a row with the same width.) This avoids situations in which the initial width is + // very narrow and the label would break text into many very short lines, causing a very tall label that can + // leave a deformed container. In the remaining case (namely, autowrap off and no trimming), the label is + // free to dictate its own width, something that will be taken advtantage of. + bool can_dictate_width = autowrap_mode == TextServer::AUTOWRAP_OFF && overrun_behavior == TextServer::OVERRUN_NO_TRIMMING; + bool is_width_stable = get_size().width == stable_width; + can_process_lines = can_dictate_width || is_width_stable; + stable_width = get_size().width; + + if (can_process_lines) { + if (lines_dirty) { + BitField<TextServer::LineBreakFlag> autowrap_flags = TextServer::BREAK_MANDATORY; + switch (autowrap_mode) { + case TextServer::AUTOWRAP_WORD_SMART: + autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_ADAPTIVE | TextServer::BREAK_MANDATORY; + break; + case TextServer::AUTOWRAP_WORD: + autowrap_flags = TextServer::BREAK_WORD_BOUND | TextServer::BREAK_MANDATORY; + break; + case TextServer::AUTOWRAP_ARBITRARY: + autowrap_flags = TextServer::BREAK_GRAPHEME_BOUND | TextServer::BREAK_MANDATORY; + break; + case TextServer::AUTOWRAP_OFF: + break; + } + autowrap_flags = autowrap_flags | TextServer::BREAK_TRIM_EDGE_SPACES; - if (autowrap_mode == TextServer::AUTOWRAP_OFF) { - minsize.width = 0.0f; - for (int i = 0; i < lines_rid.size(); i++) { - if (minsize.width < TS->shaped_text_get_size(lines_rid[i]).x) { - minsize.width = TS->shaped_text_get_size(lines_rid[i]).x; + PackedInt32Array line_breaks = TS->shaped_text_get_line_breaks(text_rid, width, 0, autowrap_flags); + for (int i = 0; i < line_breaks.size(); i = i + 2) { + RID line = TS->shaped_text_substr(text_rid, line_breaks[i], line_breaks[i + 1] - line_breaks[i]); + lines_rid.push_back(line); + } } - } - } - if (lines_dirty) { - BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM; - switch (overrun_behavior) { - case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS: - overrun_flags.set_flag(TextServer::OVERRUN_TRIM); - overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); - overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); - break; - case TextServer::OVERRUN_TRIM_ELLIPSIS: - overrun_flags.set_flag(TextServer::OVERRUN_TRIM); - overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); - break; - case TextServer::OVERRUN_TRIM_WORD: - overrun_flags.set_flag(TextServer::OVERRUN_TRIM); - overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); - break; - case TextServer::OVERRUN_TRIM_CHAR: - overrun_flags.set_flag(TextServer::OVERRUN_TRIM); - break; - case TextServer::OVERRUN_NO_TRIMMING: - break; - } - - // Fill after min_size calculation. - - if (autowrap_mode != TextServer::AUTOWRAP_OFF) { - int visible_lines = get_visible_line_count(); - bool lines_hidden = visible_lines > 0 && visible_lines < lines_rid.size(); - if (lines_hidden) { - overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS); - } - if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { + if (can_dictate_width) { for (int i = 0; i < lines_rid.size(); i++) { - if (i < visible_lines - 1 || lines_rid.size() == 1) { - TS->shaped_text_fit_to_width(lines_rid[i], width); - } else if (i == (visible_lines - 1)) { - TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags); + if (minsize.width < TS->shaped_text_get_size(lines_rid[i]).x) { + minsize.width = TS->shaped_text_get_size(lines_rid[i]).x; } } - } else if (lines_hidden) { - TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags); + + width = (minsize.width - style->get_minimum_size().width); } - } else { - // Autowrap disabled. - for (int i = 0; i < lines_rid.size(); i++) { - if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { - TS->shaped_text_fit_to_width(lines_rid[i], width); - overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE); - TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); - TS->shaped_text_fit_to_width(lines_rid[i], width, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS); + + if (lines_dirty) { + BitField<TextServer::TextOverrunFlag> overrun_flags = TextServer::OVERRUN_NO_TRIM; + switch (overrun_behavior) { + case TextServer::OVERRUN_TRIM_WORD_ELLIPSIS: + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); + break; + case TextServer::OVERRUN_TRIM_ELLIPSIS: + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_ADD_ELLIPSIS); + break; + case TextServer::OVERRUN_TRIM_WORD: + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + overrun_flags.set_flag(TextServer::OVERRUN_TRIM_WORD_ONLY); + break; + case TextServer::OVERRUN_TRIM_CHAR: + overrun_flags.set_flag(TextServer::OVERRUN_TRIM); + break; + case TextServer::OVERRUN_NO_TRIMMING: + break; + } + + // Fill after min_size calculation. + + int visible_lines = lines_rid.size(); + if (max_lines_visible >= 0 && visible_lines > max_lines_visible) { + visible_lines = max_lines_visible; + } + if (autowrap_mode != TextServer::AUTOWRAP_OFF) { + bool lines_hidden = visible_lines > 0 && visible_lines < lines_rid.size(); + if (lines_hidden) { + overrun_flags.set_flag(TextServer::OVERRUN_ENFORCE_ELLIPSIS); + } + if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { + for (int i = 0; i < lines_rid.size(); i++) { + if (i < visible_lines - 1 || lines_rid.size() == 1) { + TS->shaped_text_fit_to_width(lines_rid[i], width); + } else if (i == (visible_lines - 1)) { + TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags); + } + } + } else if (lines_hidden) { + TS->shaped_text_overrun_trim_to_width(lines_rid[visible_lines - 1], width, overrun_flags); + } } else { - TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); + // Autowrap disabled. + for (int i = 0; i < lines_rid.size(); i++) { + if (horizontal_alignment == HORIZONTAL_ALIGNMENT_FILL) { + TS->shaped_text_fit_to_width(lines_rid[i], width); + overrun_flags.set_flag(TextServer::OVERRUN_JUSTIFICATION_AWARE); + TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); + TS->shaped_text_fit_to_width(lines_rid[i], width, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS); + } else { + TS->shaped_text_overrun_trim_to_width(lines_rid[i], width, overrun_flags); + } + } } + + int last_line = MIN(lines_rid.size(), visible_lines + lines_skipped); + int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing; + for (int64_t i = lines_skipped; i < last_line; i++) { + minsize.height += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing; + } + + lines_dirty = false; } + } else { + callable_mp(this, &Label::_shape).call_deferred(); } - lines_dirty = false; - lines_shaped_last_width = get_size().width; } - _update_visible(); - - if (autowrap_mode == TextServer::AUTOWRAP_OFF || !clip || overrun_behavior == TextServer::OVERRUN_NO_TRIMMING) { - update_minimum_size(); + if (draw_pending) { + queue_redraw(); + draw_pending = false; } -} -void Label::_update_visible() { - int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing; - Ref<StyleBox> style = theme_cache.normal_style; - int lines_visible = lines_rid.size(); - - if (max_lines_visible >= 0 && lines_visible > max_lines_visible) { - lines_visible = max_lines_visible; + if (minsize != prev_minsize) { + update_minimum_size(); } - minsize.height = 0; - int last_line = MIN(lines_rid.size(), lines_visible + lines_skipped); - for (int64_t i = lines_skipped; i < last_line; i++) { - minsize.height += TS->shaped_text_get_size(lines_rid[i]).y + line_spacing; - if (minsize.height > (get_size().height - style->get_minimum_size().height + line_spacing)) { - break; - } - } + return can_process_lines; } inline void draw_glyph(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_color, const Vector2 &p_ofs) { @@ -345,8 +362,24 @@ void Label::_notification(int p_what) { RenderingServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), true); } + // When a shaped text is invalidated by an external source, we want to reshape it. + if (!TS->shaped_text_is_ready(text_rid)) { + dirty = true; + } + + for (const RID &line_rid : lines_rid) { + if (!TS->shaped_text_is_ready(line_rid)) { + lines_dirty = true; + break; + } + } + if (dirty || font_dirty || lines_dirty) { - _shape(); + if (!_shape()) { + // There will be another pass. + draw_pending = true; + break; + } } RID ci = get_canvas_item(); @@ -589,6 +622,8 @@ void Label::_notification(int p_what) { } ofs.y += TS->shaped_text_get_descent(lines_rid[i]) + vsep + line_spacing; } + + draw_pending = false; } break; case NOTIFICATION_THEME_CHANGED: { @@ -597,13 +632,7 @@ void Label::_notification(int p_what) { } break; case NOTIFICATION_RESIZED: { - // It may happen that the reshaping due to this size change triggers a cascade of re-layout - // across the hierarchy where this label belongs to in a way that its size changes multiple - // times, but ending up with the original size it was already shaped for. - // This check prevents the catastrophic, freezing infinite cascade of re-layout. - if (lines_shaped_last_width != get_size().width) { - lines_dirty = true; - } + lines_dirty = true; } break; } } @@ -886,7 +915,7 @@ void Label::set_lines_skipped(int p_lines) { } lines_skipped = p_lines; - _update_visible(); + lines_dirty = true; queue_redraw(); } @@ -900,7 +929,7 @@ void Label::set_max_lines_visible(int p_lines) { } max_lines_visible = p_lines; - _update_visible(); + lines_dirty = true; queue_redraw(); } diff --git a/scene/gui/label.h b/scene/gui/label.h index b80646810b..36b85f7af8 100644 --- a/scene/gui/label.h +++ b/scene/gui/label.h @@ -46,11 +46,10 @@ private: bool clip = false; TextServer::OverrunBehavior overrun_behavior = TextServer::OVERRUN_NO_TRIMMING; Size2 minsize; + real_t stable_width = -1; bool uppercase = false; bool lines_dirty = true; - int lines_shaped_last_width = -1; - bool dirty = true; bool font_dirty = true; RID text_rid; @@ -66,6 +65,7 @@ private: float visible_ratio = 1.0; int lines_skipped = 0; int max_lines_visible = -1; + bool draw_pending = false; Ref<LabelSettings> settings; @@ -83,8 +83,7 @@ private: int font_shadow_outline_size; } theme_cache; - void _update_visible(); - void _shape(); + bool _shape(); void _invalidate(); protected: diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 16a718722c..a57dccd5c8 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -274,6 +274,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } } grab_focus(); + accept_event(); return; } @@ -383,6 +384,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } queue_redraw(); + return; } Ref<InputEventMouseMotion> m = p_event; @@ -407,6 +409,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { drag_caret_force_displayed = true; set_caret_at_pixel_pos(m->get_position().x); } + + return; } Ref<InputEventKey> k = p_event; @@ -460,6 +464,9 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { menu->reset_size(); menu->popup(); menu->grab_focus(); + + accept_event(); + return; } } @@ -469,6 +476,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD) && virtual_keyboard_enabled) { DisplayServer::get_singleton()->virtual_keyboard_hide(); } + accept_event(); + return; } if (is_shortcut_keys_enabled()) { @@ -608,6 +617,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { _text_changed(); } accept_event(); + return; } } } diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 2ea1b93810..432004dedc 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -36,7 +36,7 @@ void Popup::_input_from_window(const Ref<InputEvent> &p_event) { Ref<InputEventKey> key = p_event; - if (key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) { + if (get_flag(FLAG_POPUP) && key.is_valid() && key->is_pressed() && key->get_keycode() == Key::ESCAPE) { _close_pressed(); } } @@ -102,12 +102,17 @@ void Popup::_notification(int p_what) { } } break; - case NOTIFICATION_WM_CLOSE_REQUEST: - case NOTIFICATION_APPLICATION_FOCUS_OUT: { + case NOTIFICATION_WM_CLOSE_REQUEST: { if (!is_in_edited_scene_root()) { _close_pressed(); } } break; + + case NOTIFICATION_APPLICATION_FOCUS_OUT: { + if (!is_in_edited_scene_root() && get_flag(FLAG_POPUP)) { + _close_pressed(); + } + } break; } } diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 0eeac2f285..1a6adca121 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -59,6 +59,7 @@ Size2 PopupMenu::_get_contents_minimum_size() const { for (int i = 0; i < items.size(); i++) { Size2 item_size; + const_cast<PopupMenu *>(this)->_shape_item(i); Size2 icon_size = items[i].get_icon_size(); item_size.height = _get_item_height(i); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index f9c9906efa..2c1c44322a 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -5520,34 +5520,6 @@ void RichTextLabel::_bind_methods() { BIND_ENUM_CONSTANT(LIST_ROMAN); BIND_ENUM_CONSTANT(LIST_DOTS); - BIND_ENUM_CONSTANT(ITEM_FRAME); - BIND_ENUM_CONSTANT(ITEM_TEXT); - BIND_ENUM_CONSTANT(ITEM_IMAGE); - BIND_ENUM_CONSTANT(ITEM_NEWLINE); - BIND_ENUM_CONSTANT(ITEM_FONT); - BIND_ENUM_CONSTANT(ITEM_FONT_SIZE); - BIND_ENUM_CONSTANT(ITEM_FONT_FEATURES); - BIND_ENUM_CONSTANT(ITEM_COLOR); - BIND_ENUM_CONSTANT(ITEM_OUTLINE_SIZE); - BIND_ENUM_CONSTANT(ITEM_OUTLINE_COLOR); - BIND_ENUM_CONSTANT(ITEM_UNDERLINE); - BIND_ENUM_CONSTANT(ITEM_STRIKETHROUGH); - BIND_ENUM_CONSTANT(ITEM_PARAGRAPH); - BIND_ENUM_CONSTANT(ITEM_INDENT); - BIND_ENUM_CONSTANT(ITEM_LIST); - BIND_ENUM_CONSTANT(ITEM_TABLE); - BIND_ENUM_CONSTANT(ITEM_FADE); - BIND_ENUM_CONSTANT(ITEM_SHAKE); - BIND_ENUM_CONSTANT(ITEM_WAVE); - BIND_ENUM_CONSTANT(ITEM_TORNADO); - BIND_ENUM_CONSTANT(ITEM_RAINBOW); - BIND_ENUM_CONSTANT(ITEM_BGCOLOR); - BIND_ENUM_CONSTANT(ITEM_FGCOLOR); - BIND_ENUM_CONSTANT(ITEM_META); - BIND_ENUM_CONSTANT(ITEM_HINT); - BIND_ENUM_CONSTANT(ITEM_DROPCAP); - BIND_ENUM_CONSTANT(ITEM_CUSTOMFX); - BIND_ENUM_CONSTANT(MENU_COPY); BIND_ENUM_CONSTANT(MENU_SELECT_ALL); BIND_ENUM_CONSTANT(MENU_MAX); diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index b01fccf14c..1dae8b75ca 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -740,7 +740,6 @@ public: }; VARIANT_ENUM_CAST(RichTextLabel::ListType); -VARIANT_ENUM_CAST(RichTextLabel::ItemType); VARIANT_ENUM_CAST(RichTextLabel::MenuItems); #endif // RICH_TEXT_LABEL_H diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp index eca6cb3eef..5e378a0321 100644 --- a/scene/gui/tab_bar.cpp +++ b/scene/gui/tab_bar.cpp @@ -342,6 +342,8 @@ void TabBar::_notification(int p_what) { _shape(i); } + queue_redraw(); + [[fallthrough]]; } case NOTIFICATION_RESIZED: { diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 0f39715851..f8c2e9f4ad 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -1775,10 +1775,10 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co RID ci = get_canvas_item(); - if (rtl) { + if (rtl && rect.size.width > 0) { Point2 draw_pos = rect.position; draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0); - p_cell.text_buf->set_width(MAX(0, rect.size.width)); + p_cell.text_buf->set_width(rect.size.width); if (p_ol_size > 0 && p_ol_color.a > 0) { p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color); } @@ -1800,10 +1800,10 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co rect.size.x -= bmsize.x + theme_cache.h_separation; } - if (!rtl) { + if (!rtl && rect.size.width > 0) { Point2 draw_pos = rect.position; draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0); - p_cell.text_buf->set_width(MAX(0, rect.size.width)); + p_cell.text_buf->set_width(rect.size.width); if (p_ol_size > 0 && p_ol_color.a > 0) { p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color); } diff --git a/scene/gui/view_panner.cpp b/scene/gui/view_panner.cpp index 145497fa61..51af886709 100644 --- a/scene/gui/view_panner.cpp +++ b/scene/gui/view_panner.cpp @@ -125,7 +125,7 @@ bool ViewPanner::gui_input(const Ref<InputEvent> &p_event, Rect2 p_canvas_rect) Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - callback_helper(pan_callback, varray(-pan_gesture->get_delta(), p_event)); + callback_helper(pan_callback, varray(-pan_gesture->get_delta() * scroll_speed, p_event)); } Ref<InputEventScreenDrag> screen_drag = p_event; diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index e5dcdd2afd..1c7d42ad36 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -515,12 +515,13 @@ void CanvasItem::draw_dashed_line(const Point2 &p_from, const Point2 &p_to, cons ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); float length = (p_to - p_from).length(); - if (length < p_dash) { + Vector2 step = p_dash * (p_to - p_from).normalized(); + + if (length < p_dash || step == Vector2() || p_dash <= 0.0) { RenderingServer::get_singleton()->canvas_item_add_line(canvas_item, p_from, p_to, p_color, p_width); return; } - Vector2 step = p_dash * (p_to - p_from).normalized(); int steps = (p_aligned) ? Math::ceil(length / p_dash) : Math::floor(length / p_dash); if (steps % 2 == 0) { steps--; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index a1e7555a5d..126b1d54fc 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -166,6 +166,24 @@ ViewportTexture::~ViewportTexture() { } void Viewport::_sub_window_update_order() { + if (gui.sub_windows.size() < 2) { + return; + } + + if (!gui.sub_windows[gui.sub_windows.size() - 1].window->get_flag(Window::FLAG_ALWAYS_ON_TOP)) { + int index = gui.sub_windows.size() - 1; + + while (index > 0 && gui.sub_windows[index - 1].window->get_flag(Window::FLAG_ALWAYS_ON_TOP)) { + --index; + } + + if (index != (gui.sub_windows.size() - 1)) { + SubWindow sw = gui.sub_windows[gui.sub_windows.size() - 1]; + gui.sub_windows.remove_at(gui.sub_windows.size() - 1); + gui.sub_windows.insert(index, sw); + } + } + for (int i = 0; i < gui.sub_windows.size(); i++) { RS::get_singleton()->canvas_item_set_draw_index(gui.sub_windows[i].canvas_item, i); } @@ -823,11 +841,12 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, stretch_transform_new.scale(scale); } - if (size == p_size && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override) { + Size2i new_size = p_size.max(Size2i(2, 2)); + if (size == new_size && size_allocated == p_allocated && stretch_transform == stretch_transform_new && p_size_2d_override == size_2d_override) { return; } - size = p_size; + size = new_size; size_allocated = p_allocated; size_2d_override = p_size_2d_override; stretch_transform = stretch_transform_new; diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 44df648552..b79a9ba444 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -569,6 +569,12 @@ void Window::_update_from_window() { void Window::_clear_window() { ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID); + DisplayServer::get_singleton()->window_set_rect_changed_callback(Callable(), window_id); + DisplayServer::get_singleton()->window_set_window_event_callback(Callable(), window_id); + DisplayServer::get_singleton()->window_set_input_event_callback(Callable(), window_id); + DisplayServer::get_singleton()->window_set_input_text_callback(Callable(), window_id); + DisplayServer::get_singleton()->window_set_drop_files_callback(Callable(), window_id); + if (transient_parent && transient_parent->window_id != DisplayServer::INVALID_WINDOW_ID) { DisplayServer::get_singleton()->window_set_transient(window_id, DisplayServer::INVALID_WINDOW_ID); } @@ -978,17 +984,13 @@ void Window::_update_viewport_size() { Size2 margin; Size2 offset; - //black bars and margin + if (content_scale_aspect != CONTENT_SCALE_ASPECT_EXPAND && screen_size.x < video_mode.x) { margin.x = Math::round((video_mode.x - screen_size.x) / 2.0); - //RenderingServer::get_singleton()->black_bars_set_margins(margin.x, 0, margin.x, 0); offset.x = Math::round(margin.x * viewport_size.y / screen_size.y); } else if (content_scale_aspect != CONTENT_SCALE_ASPECT_EXPAND && screen_size.y < video_mode.y) { margin.y = Math::round((video_mode.y - screen_size.y) / 2.0); - //RenderingServer::get_singleton()->black_bars_set_margins(0, margin.y, 0, margin.y); offset.y = Math::round(margin.y * viewport_size.x / screen_size.x); - } else { - //RenderingServer::get_singleton()->black_bars_set_margins(0, 0, 0, 0); } switch (content_scale_mode) { @@ -1115,6 +1117,7 @@ void Window::_notification(int p_what) { position = DisplayServer::get_singleton()->window_get_position(window_id); size = DisplayServer::get_singleton()->window_get_size(window_id); } + _update_window_size(); // Inform DisplayServer of minimum and maximum size. _update_viewport_size(); // Then feed back to the viewport. _update_window_callbacks(); RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_WHEN_VISIBLE); @@ -1422,6 +1425,9 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window."); + // Consider the current size when calling with the default value. + Size2i expected_size = p_size == Size2i() ? size : p_size; + Rect2 parent_rect; if (is_embedded()) { @@ -1436,7 +1442,7 @@ void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio Vector2i size_ratio = parent_rect.size * p_fallback_ratio; Rect2i popup_rect; - popup_rect.size = Vector2i(MIN(size_ratio.x, p_size.x), MIN(size_ratio.y, p_size.y)); + popup_rect.size = Vector2i(MIN(size_ratio.x, expected_size.x), MIN(size_ratio.y, expected_size.y)); popup_rect.size = _clamp_window_size(popup_rect.size); if (parent_rect != Rect2()) { @@ -1450,6 +1456,9 @@ void Window::popup_centered(const Size2i &p_minsize) { ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window."); + // Consider the current size when calling with the default value. + Size2i expected_size = p_minsize == Size2i() ? size : p_minsize; + Rect2 parent_rect; if (is_embedded()) { @@ -1462,7 +1471,7 @@ void Window::popup_centered(const Size2i &p_minsize) { } Rect2i popup_rect; - popup_rect.size = _clamp_window_size(p_minsize); + popup_rect.size = _clamp_window_size(expected_size); if (parent_rect != Rect2()) { popup_rect.position = parent_rect.position + (parent_rect.size - popup_rect.size) / 2; diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index cf9baa2907..a7b53244e2 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -526,6 +526,9 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { vc = indices.size(); ir = indices.ptrw(); has_indices = true; + } else { + // Ensure there are enough vertices to construct at least one triangle. + ERR_FAIL_COND_V(vertices.size() % 3 != 0, Ref<ArrayMesh>()); } HashMap<Vector3, Vector3> normal_accum; diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index ef1f6459e9..8ed68626a8 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -2890,6 +2890,18 @@ void TextMesh::_create_mesh_array(Array &p_arr) const { dirty_cache = false; } + // When a shaped text is invalidated by an external source, we want to reshape it. + if (!TS->shaped_text_is_ready(text_rid)) { + dirty_text = true; + } + + for (const RID &line_rid : lines_rid) { + if (!TS->shaped_text_is_ready(line_rid)) { + dirty_lines = true; + break; + } + } + // Update text buffer. if (dirty_text) { TS->shaped_text_clear(text_rid); @@ -3328,7 +3340,7 @@ void TextMesh::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "pixel_size", PROPERTY_HINT_RANGE, "0.0001,128,0.0001,suffix:m"), "set_pixel_size", "get_pixel_size"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "curve_step", PROPERTY_HINT_RANGE, "0.1,10,0.1,suffix:px"), "set_curve_step", "get_curve_step"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "depth", PROPERTY_HINT_RANGE, "0.0,100.0,0.001,or_greater,suffix:m"), "set_depth", "get_depth"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "width", PROPERTY_HINT_NONE, "suffix:m"), "set_width", "get_width"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "width", PROPERTY_HINT_NONE, "suffix:px"), "set_width", "get_width"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset", PROPERTY_HINT_NONE, "suffix:px"), "set_offset", "get_offset"); ADD_GROUP("BiDi", ""); diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index 16cc1c3370..ccb3ddee45 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -648,7 +648,7 @@ Array SurfaceTool::commit_to_arrays() { for (uint32_t idx = 0; idx < vertex_array.size(); idx++) { const Vertex &v = vertex_array[idx]; - if (v.bones.size() > count) { + if (v.bones.size() != count) { ERR_PRINT_ONCE(vformat("Invalid bones size %d vs count %d", v.bones.size(), count)); continue; } @@ -672,7 +672,7 @@ Array SurfaceTool::commit_to_arrays() { for (uint32_t idx = 0; idx < vertex_array.size(); idx++) { const Vertex &v = vertex_array[idx]; - if (v.weights.size() > count) { + if (v.weights.size() != count) { ERR_PRINT_ONCE(vformat("Invalid weight size %d vs count %d", v.weights.size(), count)); continue; } diff --git a/scene/resources/text_file.cpp b/scene/resources/text_file.cpp index 9b61a95edb..77ff0f55b1 100644 --- a/scene/resources/text_file.cpp +++ b/scene/resources/text_file.cpp @@ -67,5 +67,10 @@ Error TextFile::load_text(const String &p_path) { ERR_FAIL_COND_V_MSG(s.parse_utf8((const char *)w) != OK, ERR_INVALID_DATA, "Script '" + p_path + "' contains invalid unicode (UTF-8), so it was not loaded. Please ensure that scripts are saved in valid UTF-8 unicode."); text = s; path = p_path; +#ifdef TOOLS_ENABLED + if (ResourceLoader::get_timestamp_on_load()) { + set_last_modified_time(FileAccess::get_modified_time(path)); + } +#endif // TOOLS_ENABLED return OK; } diff --git a/scene/resources/text_line.cpp b/scene/resources/text_line.cpp index 93611ea2c4..38a865b170 100644 --- a/scene/resources/text_line.cpp +++ b/scene/resources/text_line.cpp @@ -101,6 +101,11 @@ void TextLine::_bind_methods() { } void TextLine::_shape() { + // When a shaped text is invalidated by an external source, we want to reshape it. + if (!TS->shaped_text_is_ready(rid)) { + dirty = true; + } + if (dirty) { if (!tab_stops.is_empty()) { TS->shaped_text_tab_align(rid, tab_stops); diff --git a/scene/resources/text_paragraph.cpp b/scene/resources/text_paragraph.cpp index dfafc7d2bc..729063245c 100644 --- a/scene/resources/text_paragraph.cpp +++ b/scene/resources/text_paragraph.cpp @@ -134,6 +134,18 @@ void TextParagraph::_bind_methods() { } void TextParagraph::_shape_lines() { + // When a shaped text is invalidated by an external source, we want to reshape it. + if (!TS->shaped_text_is_ready(rid) || !TS->shaped_text_is_ready(dropcap_rid)) { + lines_dirty = true; + } + + for (const RID &line_rid : lines_rid) { + if (!TS->shaped_text_is_ready(line_rid)) { + lines_dirty = true; + break; + } + } + if (lines_dirty) { for (const RID &line_rid : lines_rid) { TS->free_rid(line_rid); diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 58a638804d..d4b2be355e 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -3308,7 +3308,7 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { PropertyInfo property_info; // Rendering. - p_list->push_back(PropertyInfo(Variant::NIL, "Rendering", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Rendering", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < occlusion_layers.size(); i++) { p_list->push_back(PropertyInfo(Variant::INT, vformat("occlusion_layer_%d/light_mask", i), PROPERTY_HINT_LAYERS_2D_RENDER)); @@ -3321,7 +3321,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { } // Physics. - p_list->push_back(PropertyInfo(Variant::NIL, "Physics", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Physics", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < physics_layers.size(); i++) { p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/collision_layer", i), PROPERTY_HINT_LAYERS_2D_PHYSICS)); @@ -3341,7 +3341,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { } // Terrains. - p_list->push_back(PropertyInfo(Variant::NIL, "Terrains", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Terrains", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int terrain_set_index = 0; terrain_set_index < terrain_sets.size(); terrain_set_index++) { p_list->push_back(PropertyInfo(Variant::INT, vformat("terrain_set_%d/mode", terrain_set_index), PROPERTY_HINT_ENUM, "Match Corners and Sides,Match Corners,Match Sides")); p_list->push_back(PropertyInfo(Variant::NIL, vformat("terrain_set_%d/terrains", terrain_set_index), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_ARRAY, vformat("terrain_set_%d/terrain_", terrain_set_index))); @@ -3352,7 +3352,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { } // Navigation. - p_list->push_back(PropertyInfo(Variant::NIL, "Navigation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < navigation_layers.size(); i++) { p_list->push_back(PropertyInfo(Variant::INT, vformat("navigation_layer_%d/layers", i), PROPERTY_HINT_LAYERS_2D_NAVIGATION)); } @@ -3362,7 +3362,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 1; i < Variant::VARIANT_MAX; i++) { argt += "," + Variant::get_type_name(Variant::Type(i)); } - p_list->push_back(PropertyInfo(Variant::NIL, "Custom data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < custom_data_layers.size(); i++) { p_list->push_back(PropertyInfo(Variant::STRING, vformat("custom_data_layer_%d/name", i))); p_list->push_back(PropertyInfo(Variant::INT, vformat("custom_data_layer_%d/type", i), PROPERTY_HINT_ENUM, argt)); @@ -3376,10 +3376,10 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { // Tile Proxies. // Note: proxies need to be set after sources are set. - p_list->push_back(PropertyInfo(Variant::NIL, "Tile Proxies", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); - p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/source_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); - p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/coords_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); - p_list->push_back(PropertyInfo(Variant::ARRAY, "tile_proxies/alternative_level", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Tile Proxies", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/source_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); + p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/coords_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); + p_list->push_back(PropertyInfo(Variant::ARRAY, PNAME("tile_proxies/alternative_level"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR)); // Patterns. for (unsigned int pattern_index = 0; pattern_index < patterns.size(); pattern_index++) { @@ -4805,8 +4805,8 @@ void TileSetScenesCollectionSource::set_scene_tile_scene(int p_id, Ref<PackedSce scene_state = scene_state->get_base_scene_state(); } ERR_FAIL_COND_MSG(type.is_empty(), vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Could not get the type of the root node.", p_packed_scene->get_path())); - bool extends_correct_class = ClassDB::is_parent_class(type, "Control") || ClassDB::is_parent_class(type, "Node2D"); - ERR_FAIL_COND_MSG(!extends_correct_class, vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Root node should extend Control or Node2D. Found %s instead.", p_packed_scene->get_path(), type)); + bool extends_correct_class = ClassDB::is_parent_class(type, "CanvasItem"); + ERR_FAIL_COND_MSG(!extends_correct_class, vformat("Invalid PackedScene for TileSetScenesCollectionSource: %s. Root node should extend CanvasItem. Found %s instead.", p_packed_scene->get_path(), type)); scenes[p_id].scene = p_packed_scene; } else { @@ -4887,9 +4887,9 @@ bool TileSetScenesCollectionSource::_get(const StringName &p_name, Variant &r_re void TileSetScenesCollectionSource::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 0; i < scenes_ids.size(); i++) { - p_list->push_back(PropertyInfo(Variant::OBJECT, vformat("scenes/%d/scene", scenes_ids[i]), PROPERTY_HINT_RESOURCE_TYPE, "TileSetScenesCollectionSource")); + p_list->push_back(PropertyInfo(Variant::OBJECT, vformat("%s/%d/%s", PNAME("scenes"), scenes_ids[i], PNAME("scene")), PROPERTY_HINT_RESOURCE_TYPE, "TileSetScenesCollectionSource")); - PropertyInfo property_info = PropertyInfo(Variant::BOOL, vformat("scenes/%d/display_placeholder", scenes_ids[i])); + PropertyInfo property_info = PropertyInfo(Variant::BOOL, vformat("%s/%d/%s", PNAME("scenes"), scenes_ids[i], PNAME("display_placeholder"))); if (scenes[scenes_ids[i]].display_placeholder == false) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } @@ -5692,10 +5692,10 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const { // Add the groups manually. if (tile_set) { // Occlusion layers. - p_list->push_back(PropertyInfo(Variant::NIL, "Rendering", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Rendering", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < occluders.size(); i++) { // occlusion_layer_%d/polygon - property_info = PropertyInfo(Variant::OBJECT, vformat("occlusion_layer_%d/polygon", i), PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D", PROPERTY_USAGE_DEFAULT); + property_info = PropertyInfo(Variant::OBJECT, vformat("occlusion_layer_%d/%s", i, PNAME("polygon")), PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D", PROPERTY_USAGE_DEFAULT); if (!occluders[i].is_valid()) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } @@ -5703,29 +5703,29 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const { } // Physics layers. - p_list->push_back(PropertyInfo(Variant::NIL, "Physics", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Physics", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < physics.size(); i++) { - p_list->push_back(PropertyInfo(Variant::VECTOR2, vformat("physics_layer_%d/linear_velocity", i), PROPERTY_HINT_NONE)); - p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/angular_velocity", i), PROPERTY_HINT_NONE)); - p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/polygons_count", i), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); + p_list->push_back(PropertyInfo(Variant::VECTOR2, vformat("physics_layer_%d/%s", i, PNAME("linear_velocity")), PROPERTY_HINT_NONE)); + p_list->push_back(PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/%s", i, PNAME("angular_velocity")), PROPERTY_HINT_NONE)); + p_list->push_back(PropertyInfo(Variant::INT, vformat("physics_layer_%d/%s", i, PNAME("polygons_count")), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); for (int j = 0; j < physics[i].polygons.size(); j++) { // physics_layer_%d/points - property_info = PropertyInfo(Variant::ARRAY, vformat("physics_layer_%d/polygon_%d/points", i, j), PROPERTY_HINT_ARRAY_TYPE, "Vector2", PROPERTY_USAGE_DEFAULT); + property_info = PropertyInfo(Variant::ARRAY, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("points")), PROPERTY_HINT_ARRAY_TYPE, "Vector2", PROPERTY_USAGE_DEFAULT); if (physics[i].polygons[j].polygon.is_empty()) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } p_list->push_back(property_info); // physics_layer_%d/polygon_%d/one_way - property_info = PropertyInfo(Variant::BOOL, vformat("physics_layer_%d/polygon_%d/one_way", i, j)); + property_info = PropertyInfo(Variant::BOOL, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("one_way"))); if (physics[i].polygons[j].one_way == false) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } p_list->push_back(property_info); // physics_layer_%d/polygon_%d/one_way_margin - property_info = PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/polygon_%d/one_way_margin", i, j)); + property_info = PropertyInfo(Variant::FLOAT, vformat("physics_layer_%d/polygon_%d/%s", i, j, PNAME("one_way_margin"))); if (physics[i].polygons[j].one_way_margin == 1.0) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } @@ -5735,7 +5735,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const { // Terrain data if (terrain_set >= 0) { - p_list->push_back(PropertyInfo(Variant::NIL, "Terrains", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Terrains", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < TileSet::CELL_NEIGHBOR_MAX; i++) { TileSet::CellNeighbor bit = TileSet::CellNeighbor(i); if (is_valid_terrain_peering_bit(bit)) { @@ -5749,9 +5749,9 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const { } // Navigation layers. - p_list->push_back(PropertyInfo(Variant::NIL, "Navigation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Navigation", ""), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP)); for (int i = 0; i < navigation.size(); i++) { - property_info = PropertyInfo(Variant::OBJECT, vformat("navigation_layer_%d/polygon", i), PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon", PROPERTY_USAGE_DEFAULT); + property_info = PropertyInfo(Variant::OBJECT, vformat("navigation_layer_%d/%s", i, PNAME("polygon")), PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon", PROPERTY_USAGE_DEFAULT); if (!navigation[i].is_valid()) { property_info.usage ^= PROPERTY_USAGE_STORAGE; } @@ -5759,7 +5759,7 @@ void TileData::_get_property_list(List<PropertyInfo> *p_list) const { } // Custom data layers. - p_list->push_back(PropertyInfo(Variant::NIL, "Custom data", PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP)); + p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Custom Data", "custom_data_"), PROPERTY_HINT_NONE, "custom_data_", PROPERTY_USAGE_GROUP)); for (int i = 0; i < custom_data.size(); i++) { Variant default_val; Callable::CallError error; diff --git a/servers/navigation/navigation_utilities.h b/servers/navigation/navigation_utilities.h index 7897efd423..04d0ab0d98 100644 --- a/servers/navigation/navigation_utilities.h +++ b/servers/navigation/navigation_utilities.h @@ -69,10 +69,10 @@ struct PathQueryParameters { }; struct PathQueryResult { - Vector<Vector3> path; - Vector<int32_t> path_types; + PackedVector3Array path; + PackedInt32Array path_types; TypedArray<RID> path_rids; - Vector<int64_t> path_owner_ids; + PackedInt64Array path_owner_ids; }; } //namespace NavigationUtilities diff --git a/servers/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp index 85ba8ed431..273bb9ceda 100644 --- a/servers/navigation_server_2d.cpp +++ b/servers/navigation_server_2d.cpp @@ -152,14 +152,15 @@ void NavigationServer2D::_emit_map_changed(RID p_map) { emit_signal(SNAME("map_changed"), p_map); } -#ifdef DEBUG_ENABLED void NavigationServer2D::set_debug_enabled(bool p_enabled) { NavigationServer3D::get_singleton()->set_debug_enabled(p_enabled); } + bool NavigationServer2D::get_debug_enabled() const { return NavigationServer3D::get_singleton()->get_debug_enabled(); } +#ifdef DEBUG_ENABLED void NavigationServer2D::set_debug_navigation_edge_connection_color(const Color &p_color) { NavigationServer3D::get_singleton()->set_debug_navigation_edge_connection_color(p_color); } @@ -200,6 +201,22 @@ Color NavigationServer2D::get_debug_navigation_link_connection_disabled_color() return NavigationServer3D::get_singleton()->get_debug_navigation_link_connection_disabled_color(); } +void NavigationServer2D::set_debug_navigation_geometry_edge_color(const Color &p_color) { + NavigationServer3D::get_singleton()->set_debug_navigation_geometry_edge_color(p_color); +} + +Color NavigationServer2D::get_debug_navigation_geometry_edge_color() const { + return NavigationServer3D::get_singleton()->get_debug_navigation_geometry_edge_color(); +} + +void NavigationServer2D::set_debug_navigation_geometry_edge_disabled_color(const Color &p_color) { + NavigationServer3D::get_singleton()->set_debug_navigation_geometry_edge_disabled_color(p_color); +} + +Color NavigationServer2D::get_debug_navigation_geometry_edge_disabled_color() const { + return NavigationServer3D::get_singleton()->get_debug_navigation_geometry_edge_disabled_color(); +} + void NavigationServer2D::set_debug_navigation_enable_edge_connections(const bool p_value) { NavigationServer3D::get_singleton()->set_debug_navigation_enable_edge_connections(p_value); } @@ -208,6 +225,22 @@ bool NavigationServer2D::get_debug_navigation_enable_edge_connections() const { return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_connections(); } +void NavigationServer2D::set_debug_navigation_enable_geometry_face_random_color(const bool p_value) { + NavigationServer3D::get_singleton()->set_debug_navigation_enable_geometry_face_random_color(p_value); +} + +bool NavigationServer2D::get_debug_navigation_enable_geometry_face_random_color() const { + return NavigationServer3D::get_singleton()->get_debug_navigation_enable_geometry_face_random_color(); +} + +void NavigationServer2D::set_debug_navigation_enable_edge_lines(const bool p_value) { + NavigationServer3D::get_singleton()->set_debug_navigation_enable_edge_lines(p_value); +} + +bool NavigationServer2D::get_debug_navigation_enable_edge_lines() const { + return NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_lines(); +} + void NavigationServer2D::set_debug_navigation_agent_path_color(const Color &p_color) { NavigationServer3D::get_singleton()->set_debug_navigation_agent_path_color(p_color); } @@ -309,6 +342,9 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer2D::free); + ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationServer2D::set_debug_enabled); + ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationServer2D::get_debug_enabled); + ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map"))); ADD_SIGNAL(MethodInfo("navigation_debug_changed")); diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h index 746389404b..ed2e39e53c 100644 --- a/servers/navigation_server_2d.h +++ b/servers/navigation_server_2d.h @@ -225,6 +225,7 @@ public: /// Callback called at the end of the RVO process virtual void agent_set_callback(RID p_agent, Callable p_callback); + /// Returns a customized navigation path using a query parameters object virtual void query_path(const Ref<NavigationPathQueryParameters2D> &p_query_parameters, Ref<NavigationPathQueryResult2D> p_query_result) const; /// Destroy the `RID` @@ -233,10 +234,10 @@ public: NavigationServer2D(); virtual ~NavigationServer2D(); -#ifdef DEBUG_ENABLED void set_debug_enabled(bool p_enabled); bool get_debug_enabled() const; +#ifdef DEBUG_ENABLED void set_debug_navigation_edge_connection_color(const Color &p_color); Color get_debug_navigation_edge_connection_color() const; @@ -246,6 +247,12 @@ public: void set_debug_navigation_geometry_face_disabled_color(const Color &p_color); Color get_debug_navigation_geometry_face_disabled_color() const; + void set_debug_navigation_geometry_edge_color(const Color &p_color); + Color get_debug_navigation_geometry_edge_color() const; + + void set_debug_navigation_geometry_edge_disabled_color(const Color &p_color); + Color get_debug_navigation_geometry_edge_disabled_color() const; + void set_debug_navigation_link_connection_color(const Color &p_color); Color get_debug_navigation_link_connection_color() const; @@ -255,6 +262,12 @@ public: void set_debug_navigation_enable_edge_connections(const bool p_value); bool get_debug_navigation_enable_edge_connections() const; + void set_debug_navigation_enable_geometry_face_random_color(const bool p_value); + bool get_debug_navigation_enable_geometry_face_random_color() const; + + void set_debug_navigation_enable_edge_lines(const bool p_value); + bool get_debug_navigation_enable_edge_lines() const; + void set_debug_navigation_agent_path_color(const Color &p_color); Color get_debug_navigation_agent_path_color() const; diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp index 70897ae75c..e5cc426708 100644 --- a/servers/navigation_server_3d.cpp +++ b/servers/navigation_server_3d.cpp @@ -29,7 +29,6 @@ /**************************************************************************/ #include "navigation_server_3d.h" - #include "core/config/project_settings.h" NavigationServer3D *NavigationServer3D::singleton = nullptr; @@ -116,7 +115,9 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer3D::free); ClassDB::bind_method(D_METHOD("set_active", "active"), &NavigationServer3D::set_active); - ClassDB::bind_method(D_METHOD("process", "delta_time"), &NavigationServer3D::process); + + ClassDB::bind_method(D_METHOD("set_debug_enabled", "enabled"), &NavigationServer3D::set_debug_enabled); + ClassDB::bind_method(D_METHOD("get_debug_enabled"), &NavigationServer3D::get_debug_enabled); ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map"))); @@ -186,15 +187,22 @@ NavigationServer3D::~NavigationServer3D() { singleton = nullptr; } -NavigationServer3DCallback NavigationServer3DManager::create_callback = nullptr; +void NavigationServer3D::set_debug_enabled(bool p_enabled) { +#ifdef DEBUG_ENABLED + if (debug_enabled != p_enabled) { + debug_dirty = true; + } -void NavigationServer3DManager::set_default_server(NavigationServer3DCallback p_callback) { - create_callback = p_callback; + debug_enabled = p_enabled; + + if (debug_dirty) { + call_deferred("_emit_navigation_debug_changed_signal"); + } +#endif // DEBUG_ENABLED } -NavigationServer3D *NavigationServer3DManager::new_default_server() { - ERR_FAIL_COND_V(create_callback == nullptr, nullptr); - return create_callback(); +bool NavigationServer3D::get_debug_enabled() const { + return debug_enabled; } #ifdef DEBUG_ENABLED @@ -546,22 +554,6 @@ bool NavigationServer3D::get_debug_navigation_enable_link_connections_xray() con return debug_navigation_enable_link_connections_xray; } -void NavigationServer3D::set_debug_enabled(bool p_enabled) { - if (debug_enabled != p_enabled) { - debug_dirty = true; - } - - debug_enabled = p_enabled; - - if (debug_dirty) { - call_deferred("_emit_navigation_debug_changed_signal"); - } -} - -bool NavigationServer3D::get_debug_enabled() const { - return debug_enabled; -} - void NavigationServer3D::set_debug_navigation_enable_agent_paths(const bool p_value) { if (debug_navigation_enable_agent_paths != p_value) { debug_dirty = true; @@ -594,8 +586,6 @@ bool NavigationServer3D::get_debug_navigation_enable_agent_paths_xray() const { #endif // DEBUG_ENABLED -/////////////////////////////////////////////////////// - void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const { ERR_FAIL_COND(!p_query_parameters.is_valid()); ERR_FAIL_COND(!p_query_result.is_valid()); @@ -607,3 +597,19 @@ void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> & p_query_result->set_path_rids(_query_result.path_rids); p_query_result->set_path_owner_ids(_query_result.path_owner_ids); } + +/////////////////////////////////////////////////////// + +NavigationServer3DCallback NavigationServer3DManager::create_callback = nullptr; + +void NavigationServer3DManager::set_default_server(NavigationServer3DCallback p_callback) { + create_callback = p_callback; +} + +NavigationServer3D *NavigationServer3DManager::new_default_server() { + if (create_callback == nullptr) { + return nullptr; + } + + return create_callback(); +} diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h index bc4bdf2a30..05df5ca0fe 100644 --- a/servers/navigation_server_3d.h +++ b/servers/navigation_server_3d.h @@ -253,12 +253,12 @@ public: virtual void process(real_t delta_time) = 0; /// Returns a customized navigation path using a query parameters object - void query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const; + virtual void query_path(const Ref<NavigationPathQueryParameters3D> &p_query_parameters, Ref<NavigationPathQueryResult3D> p_query_result) const; virtual NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const = 0; NavigationServer3D(); - virtual ~NavigationServer3D(); + ~NavigationServer3D() override; enum ProcessInfo { INFO_ACTIVE_MAPS, @@ -274,9 +274,13 @@ public: virtual int get_process_info(ProcessInfo p_info) const = 0; -#ifdef DEBUG_ENABLED + void set_debug_enabled(bool p_enabled); + bool get_debug_enabled() const; + private: bool debug_enabled = false; + +#ifdef DEBUG_ENABLED bool debug_dirty = true; void _emit_navigation_debug_changed_signal(); @@ -313,9 +317,6 @@ private: Ref<StandardMaterial3D> debug_navigation_agent_path_point_material; public: - void set_debug_enabled(bool p_enabled); - bool get_debug_enabled() const; - void set_debug_navigation_edge_connection_color(const Color &p_color); Color get_debug_navigation_edge_connection_color() const; diff --git a/servers/navigation_server_3d_dummy.h b/servers/navigation_server_3d_dummy.h new file mode 100644 index 0000000000..fd9226e59e --- /dev/null +++ b/servers/navigation_server_3d_dummy.h @@ -0,0 +1,119 @@ +/**************************************************************************/ +/* navigation_server_3d_dummy.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef NAVIGATION_SERVER_3D_DUMMY_H +#define NAVIGATION_SERVER_3D_DUMMY_H + +#include "servers/navigation_server_3d.h" + +class NavigationServer3DDummy : public NavigationServer3D { + GDCLASS(NavigationServer3DDummy, NavigationServer3D); + +public: + TypedArray<RID> get_maps() const override { return TypedArray<RID>(); } + RID map_create() override { return RID(); } + void map_set_active(RID p_map, bool p_active) override {} + bool map_is_active(RID p_map) const override { return false; } + void map_set_up(RID p_map, Vector3 p_up) override {} + Vector3 map_get_up(RID p_map) const override { return Vector3(); } + void map_set_cell_size(RID p_map, real_t p_cell_size) override {} + real_t map_get_cell_size(RID p_map) const override { return 0; } + void map_set_edge_connection_margin(RID p_map, real_t p_connection_margin) override {} + real_t map_get_edge_connection_margin(RID p_map) const override { return 0; } + void map_set_link_connection_radius(RID p_map, real_t p_connection_radius) override {} + real_t map_get_link_connection_radius(RID p_map) const override { return 0; } + Vector<Vector3> map_get_path(RID p_map, Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers) const override { return Vector<Vector3>(); } + Vector3 map_get_closest_point_to_segment(RID p_map, const Vector3 &p_from, const Vector3 &p_to, const bool p_use_collision) const override { return Vector3(); } + Vector3 map_get_closest_point(RID p_map, const Vector3 &p_point) const override { return Vector3(); } + Vector3 map_get_closest_point_normal(RID p_map, const Vector3 &p_point) const override { return Vector3(); } + RID map_get_closest_point_owner(RID p_map, const Vector3 &p_point) const override { return RID(); } + TypedArray<RID> map_get_links(RID p_map) const override { return TypedArray<RID>(); } + TypedArray<RID> map_get_regions(RID p_map) const override { return TypedArray<RID>(); } + TypedArray<RID> map_get_agents(RID p_map) const override { return TypedArray<RID>(); } + void map_force_update(RID p_map) override {} + RID region_create() override { return RID(); } + void region_set_enter_cost(RID p_region, real_t p_enter_cost) override {} + real_t region_get_enter_cost(RID p_region) const override { return 0; } + void region_set_travel_cost(RID p_region, real_t p_travel_cost) override {} + real_t region_get_travel_cost(RID p_region) const override { return 0; } + void region_set_owner_id(RID p_region, ObjectID p_owner_id) override {} + ObjectID region_get_owner_id(RID p_region) const override { return ObjectID(); } + bool region_owns_point(RID p_region, const Vector3 &p_point) const override { return false; } + void region_set_map(RID p_region, RID p_map) override {} + RID region_get_map(RID p_region) const override { return RID(); } + void region_set_navigation_layers(RID p_region, uint32_t p_navigation_layers) override {} + uint32_t region_get_navigation_layers(RID p_region) const override { return 0; } + void region_set_transform(RID p_region, Transform3D p_transform) override {} + void region_set_navigation_mesh(RID p_region, Ref<NavigationMesh> p_navigation_mesh) override {} + void region_bake_navigation_mesh(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) override {} + int region_get_connections_count(RID p_region) const override { return 0; } + Vector3 region_get_connection_pathway_start(RID p_region, int p_connection_id) const override { return Vector3(); } + Vector3 region_get_connection_pathway_end(RID p_region, int p_connection_id) const override { return Vector3(); } + RID link_create() override { return RID(); } + void link_set_map(RID p_link, RID p_map) override {} + RID link_get_map(RID p_link) const override { return RID(); } + void link_set_bidirectional(RID p_link, bool p_bidirectional) override {} + bool link_is_bidirectional(RID p_link) const override { return false; } + void link_set_navigation_layers(RID p_link, uint32_t p_navigation_layers) override {} + uint32_t link_get_navigation_layers(RID p_link) const override { return 0; } + void link_set_start_position(RID p_link, Vector3 p_position) override {} + Vector3 link_get_start_position(RID p_link) const override { return Vector3(); } + void link_set_end_position(RID p_link, Vector3 p_position) override {} + Vector3 link_get_end_position(RID p_link) const override { return Vector3(); } + void link_set_enter_cost(RID p_link, real_t p_enter_cost) override {} + real_t link_get_enter_cost(RID p_link) const override { return 0; } + void link_set_travel_cost(RID p_link, real_t p_travel_cost) override {} + real_t link_get_travel_cost(RID p_link) const override { return 0; } + void link_set_owner_id(RID p_link, ObjectID p_owner_id) override {} + ObjectID link_get_owner_id(RID p_link) const override { return ObjectID(); } + RID agent_create() override { return RID(); } + void agent_set_map(RID p_agent, RID p_map) override {} + RID agent_get_map(RID p_agent) const override { return RID(); } + void agent_set_neighbor_distance(RID p_agent, real_t p_distance) override {} + void agent_set_max_neighbors(RID p_agent, int p_count) override {} + void agent_set_time_horizon(RID p_agent, real_t p_time) override {} + void agent_set_radius(RID p_agent, real_t p_radius) override {} + void agent_set_max_speed(RID p_agent, real_t p_max_speed) override {} + void agent_set_velocity(RID p_agent, Vector3 p_velocity) override {} + void agent_set_target_velocity(RID p_agent, Vector3 p_velocity) override {} + void agent_set_position(RID p_agent, Vector3 p_position) override {} + void agent_set_ignore_y(RID p_agent, bool p_ignore) override {} + bool agent_is_map_changed(RID p_agent) const override { return false; } + void agent_set_callback(RID p_agent, Callable p_callback) override {} + void free(RID p_object) override {} + void set_active(bool p_active) override {} + void process(real_t delta_time) override {} + NavigationUtilities::PathQueryResult _query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const override { return NavigationUtilities::PathQueryResult(); } + int get_process_info(ProcessInfo p_info) const override { return 0; } + void set_debug_enabled(bool p_enabled) {} + bool get_debug_enabled() const { return false; } +}; + +#endif // NAVIGATION_SERVER_3D_DUMMY_H diff --git a/servers/physics_2d/godot_step_2d.cpp b/servers/physics_2d/godot_step_2d.cpp index 3b5fbbced8..bbaec8be2b 100644 --- a/servers/physics_2d/godot_step_2d.cpp +++ b/servers/physics_2d/godot_step_2d.cpp @@ -30,6 +30,7 @@ #include "godot_step_2d.h" +#include "core/object/worker_thread_pool.h" #include "core/os/os.h" #define BODY_ISLAND_COUNT_RESERVE 128 diff --git a/servers/physics_2d/godot_step_2d.h b/servers/physics_2d/godot_step_2d.h index 75eeba4a3d..c08c6379de 100644 --- a/servers/physics_2d/godot_step_2d.h +++ b/servers/physics_2d/godot_step_2d.h @@ -33,7 +33,6 @@ #include "godot_space_2d.h" -#include "core/object/worker_thread_pool.h" #include "core/templates/local_vector.h" class GodotStep2D { diff --git a/servers/physics_3d/godot_step_3d.cpp b/servers/physics_3d/godot_step_3d.cpp index 4119c58897..d09a3b4e6d 100644 --- a/servers/physics_3d/godot_step_3d.cpp +++ b/servers/physics_3d/godot_step_3d.cpp @@ -32,6 +32,7 @@ #include "godot_joint_3d.h" +#include "core/object/worker_thread_pool.h" #include "core/os/os.h" #define BODY_ISLAND_COUNT_RESERVE 128 diff --git a/servers/physics_3d/godot_step_3d.h b/servers/physics_3d/godot_step_3d.h index be7266b264..1c9b0af422 100644 --- a/servers/physics_3d/godot_step_3d.h +++ b/servers/physics_3d/godot_step_3d.h @@ -33,7 +33,6 @@ #include "godot_space_3d.h" -#include "core/object/worker_thread_pool.h" #include "core/templates/local_vector.h" class GodotStep3D { diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index 6a163c86d2..c9cf8f99af 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -429,7 +429,7 @@ Vector<real_t> PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQue return ret; } -TypedArray<PackedVector2Array> PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) { +TypedArray<PackedVector3Array> PhysicsDirectSpaceState3D::_collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results) { ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array()); Vector<Vector3> ret; @@ -437,9 +437,9 @@ TypedArray<PackedVector2Array> PhysicsDirectSpaceState3D::_collide_shape(const R int rc = 0; bool res = collide_shape(p_shape_query->get_parameters(), ret.ptrw(), p_max_results, rc); if (!res) { - return TypedArray<PackedVector2Array>(); + return TypedArray<PackedVector3Array>(); } - TypedArray<PackedVector2Array> r; + TypedArray<PackedVector3Array> r; r.resize(rc * 2); for (int i = 0; i < rc * 2; i++) { r[i] = ret[i]; diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index abf22e68a4..2c7ebeea66 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -125,7 +125,7 @@ private: TypedArray<Dictionary> _intersect_point(const Ref<PhysicsPointQueryParameters3D> &p_point_query, int p_max_results = 32); TypedArray<Dictionary> _intersect_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32); Vector<real_t> _cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query); - TypedArray<PackedVector2Array> _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32); + TypedArray<PackedVector3Array> _collide_shape(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, int p_max_results = 32); Dictionary _get_rest_info(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query); protected: diff --git a/servers/rendering/renderer_rd/effects/ss_effects.cpp b/servers/rendering/renderer_rd/effects/ss_effects.cpp index 2b5d36d686..e031e33041 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.cpp +++ b/servers/rendering/renderer_rd/effects/ss_effects.cpp @@ -411,12 +411,21 @@ SSEffects::~SSEffects() { /* SS Downsampler */ -void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection) { +void SSEffects::downsample_depth(Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_view, const Projection &p_projection) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); ERR_FAIL_NULL(material_storage); + uint32_t view_count = p_render_buffers->get_view_count(); + Size2i full_screen_size = p_render_buffers->get_internal_size(); + Size2i size((full_screen_size.x + 1) / 2, (full_screen_size.y + 1) / 2); + + // Make sure our buffers exist, buffers are automatically cleared if view count or size changes. + if (!p_render_buffers->has_texture(RB_SCOPE_SSDS, RB_LINEAR_DEPTH)) { + p_render_buffers->create_texture(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, RD::DATA_FORMAT_R16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, size, view_count * 4, 5); + } + // Downsample and deinterleave the depth buffer for SSAO and SSIL RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); @@ -447,45 +456,32 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ } } + RID shader = ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, downsample_mode); int depth_index = use_half_size ? 1 : 0; RD::get_singleton()->draw_command_begin_label("Downsample Depth"); - if (p_invalidate_uniform_set || use_full_mips != ss_effects.used_full_mips_last_frame || use_half_size != ss_effects.used_half_size_last_frame || use_mips != ss_effects.used_mips_last_frame) { - if (ss_effects.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects.downsample_uniform_set)) { - RD::get_singleton()->free(ss_effects.downsample_uniform_set); - ss_effects.downsample_uniform_set = RID(); - } - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 0; - u.append_id(p_depth_mipmaps[depth_index + 1]); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 1; - u.append_id(p_depth_mipmaps[depth_index + 2]); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 2; - u.append_id(p_depth_mipmaps[depth_index + 3]); - uniforms.push_back(u); - } - if (use_full_mips) { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 3; - u.append_id(p_depth_mipmaps[4]); - uniforms.push_back(u); + RID downsample_uniform_set; + if (use_mips) { + // Grab our downsample uniform set from cache, these are automatically cleaned up if the depth textures are cleared. + // This also ensures we can switch between left eye and right eye uniform sets without recreating the uniform twice a frame. + Vector<RD::Uniform> u_depths; + + // Note, use_full_mips is true if either SSAO or SSIL uses half size, but the other full size and we're using mips. + // That means we're filling all 5 levels. + // In this scenario `depth_index` will be 0. + for (int i = 0; i < (use_full_mips ? 4 : 3); i++) { + RID depth_mipmap = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, depth_index + i + 1, 4, 1); + + RD::Uniform u_depth; + u_depth.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u_depth.binding = i; + u_depth.append_id(depth_mipmap); + u_depths.push_back(u_depth); } - ss_effects.downsample_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, use_full_mips ? 6 : 2), 2); + + // This before only used SS_EFFECTS_DOWNSAMPLE_MIPMAP or SS_EFFECTS_DOWNSAMPLE_FULL_MIPS + downsample_uniform_set = uniform_set_cache->get_cache_vec(shader, 2, u_depths); } float depth_linearize_mul = -p_projection.columns[3][2]; @@ -501,25 +497,30 @@ void SSEffects::downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_ ss_effects.downsample_push_constant.z_near = p_projection.get_z_near(); ss_effects.downsample_push_constant.z_far = p_projection.get_z_far(); } - ss_effects.downsample_push_constant.pixel_size[0] = 1.0 / p_full_screen_size.x; - ss_effects.downsample_push_constant.pixel_size[1] = 1.0 / p_full_screen_size.y; + ss_effects.downsample_push_constant.pixel_size[0] = 1.0 / full_screen_size.x; + ss_effects.downsample_push_constant.pixel_size[1] = 1.0 / full_screen_size.y; ss_effects.downsample_push_constant.radius_sq = 1.0; - RID shader = ss_effects.downsample_shader.version_get_shader(ss_effects.downsample_shader_version, downsample_mode); RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); - RD::Uniform u_depth_buffer(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_depth_buffer })); - RD::Uniform u_depth_mipmaps(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_depth_mipmaps[depth_index + 0] })); + RID depth_texture = p_render_buffers->get_depth_texture(p_view); + RID depth_mipmap = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, depth_index, 4, 1); + + RD::Uniform u_depth_buffer(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, depth_texture })); + RD::Uniform u_depth_mipmap(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_mipmap })); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ss_effects.pipelines[downsample_mode]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_depth_buffer), 0); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth_mipmaps), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth_mipmap), 1); if (use_mips) { - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ss_effects.downsample_uniform_set, 2); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, downsample_uniform_set, 2); } RD::get_singleton()->compute_list_set_push_constant(compute_list, &ss_effects.downsample_push_constant, sizeof(SSEffectsDownsamplePushConstant)); - Size2i size(MAX(1, p_full_screen_size.x >> (use_half_size ? 2 : 1)), MAX(1, p_full_screen_size.y >> (use_half_size ? 2 : 1))); + if (use_half_size) { + size.x = MAX(1, size.x >> 1); + size.y = MAX(1, size.y >> 1); + } RD::get_singleton()->compute_list_dispatch_threads(compute_list, size.x, size.y, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -543,7 +544,7 @@ void SSEffects::ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_ha ssil_fadeout_to = p_fadeout_to; } -void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> p_ssil_slices, const Vector<RID> p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set) { +void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const RID *p_ssil_slices, const RID *p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); @@ -578,12 +579,13 @@ void SSEffects::gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> RD::get_singleton()->compute_list_add_barrier(p_compute_list); } -void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings, RID p_linear_depth) { +void SSEffects::ssil_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings) { if (p_ssil_buffers.half_size != ssil_half_size) { - ssil_free(p_ssil_buffers); + p_render_buffers->clear_context(RB_SCOPE_SSIL); } - if (ssil_half_size) { + p_ssil_buffers.half_size = ssil_half_size; + if (p_ssil_buffers.half_size) { p_ssil_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4; p_ssil_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4; p_ssil_buffers.half_buffer_width = (p_settings.full_screen_size.x + 7) / 8; @@ -595,104 +597,59 @@ void SSEffects::ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const S p_ssil_buffers.half_buffer_height = (p_settings.full_screen_size.y + 3) / 4; } - if (p_ssil_buffers.ssil_final.is_null()) { - { - p_ssil_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssil_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); - } - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - tf.width = p_settings.full_screen_size.x; - tf.height = p_settings.full_screen_size.y; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; - p_ssil_buffers.ssil_final = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.ssil_final, "SSIL texture"); - RD::get_singleton()->texture_clear(p_ssil_buffers.ssil_final, Color(0, 0, 0, 0), 0, 1, 0, 1); - if (p_ssil_buffers.last_frame.is_null()) { - tf.mipmaps = 6; - p_ssil_buffers.last_frame = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.last_frame, "Last Frame Radiance"); - RD::get_singleton()->texture_clear(p_ssil_buffers.last_frame, Color(0, 0, 0, 0), 0, tf.mipmaps, 0, 1); - for (uint32_t i = 0; i < 6; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.last_frame, 0, i); - p_ssil_buffers.last_frame_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "Last Frame Radiance Mip " + itos(i) + " "); - } - } - } - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = p_ssil_buffers.buffer_width; - tf.height = p_ssil_buffers.buffer_height; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssil_buffers.deinterleaved = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.deinterleaved, "SSIL deinterleaved buffer"); - for (uint32_t i = 0; i < 4; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.deinterleaved, i, 0); - p_ssil_buffers.deinterleaved_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SSIL deinterleaved buffer array " + itos(i) + " "); - } - } + uint32_t view_count = p_render_buffers->get_view_count(); + Size2i full_size = Size2i(p_ssil_buffers.buffer_width, p_ssil_buffers.buffer_height); + Size2i half_size = Size2i(p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height); - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = p_ssil_buffers.buffer_width; - tf.height = p_ssil_buffers.buffer_height; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssil_buffers.pong = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.pong, "SSIL deinterleaved pong buffer"); - for (uint32_t i = 0; i < 4; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.pong, i, 0); - p_ssil_buffers.pong_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SSIL deinterleaved buffer pong array " + itos(i) + " "); - } - } + // We create our intermediate and final results as render buffers. + // These are automatically cached and cleaned up when our viewport resizes + // or when our viewport gets destroyed. - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8_UNORM; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = p_ssil_buffers.buffer_width; - tf.height = p_ssil_buffers.buffer_height; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssil_buffers.edges = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.edges, "SSIL edges buffer"); - for (uint32_t i = 0; i < 4; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssil_buffers.edges, i, 0); - p_ssil_buffers.edges_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SSIL edges buffer slice " + itos(i) + " "); - } - } + if (!p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_FINAL)) { // We don't strictly have to check if it exists but we only want to clear it when we create it... + RID final = p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_FINAL, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT); + RD::get_singleton()->texture_clear(final, Color(0, 0, 0, 0), 0, 1, 0, view_count); + } - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8_UNORM; - tf.width = p_ssil_buffers.half_buffer_width; - tf.height = p_ssil_buffers.half_buffer_height; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssil_buffers.importance_map[0] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.importance_map[0], "SSIL Importance Map"); - p_ssil_buffers.importance_map[1] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssil_buffers.importance_map[1], "SSIL Importance Map Pong"); - } - p_ssil_buffers.half_size = ssil_half_size; + if (!p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_LAST_FRAME)) { + RID last_frame = p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_LAST_FRAME, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT, RD::TEXTURE_SAMPLES_1, p_settings.full_screen_size, 0, 6); + RD::get_singleton()->texture_clear(last_frame, Color(0, 0, 0, 0), 0, 6, 0, view_count); } + + // As we're not clearing these, and render buffers will return the cached texture if it already exists, + // we don't first check has_texture here + + p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_DEINTERLEAVED, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count); + p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, RD::DATA_FORMAT_R16G16B16A16_SFLOAT, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count); + p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_EDGES, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count); + p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_IMPORTANCE_MAP, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size); + p_render_buffers->create_texture(RB_SCOPE_SSIL, RB_IMPORTANCE_PONG, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size); } -void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings) { +void SSEffects::screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); ERR_FAIL_NULL(material_storage); RD::get_singleton()->draw_command_begin_label("Process Screen Space Indirect Lighting"); + + // Obtain our (cached) buffer slices for the view we are rendering. + RID last_frame = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, p_view, 0, 1, 6); + RID deinterleaved = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED, p_view * 4, 0, 4, 1); + RID deinterleaved_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, 4 * p_view, 0, 4, 1); + RID edges = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_EDGES, 4 * p_view, 0, 4, 1); + RID importance_map = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_IMPORTANCE_MAP, p_view, 0); + RID importance_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_IMPORTANCE_PONG, p_view, 0); + + RID deinterleaved_slices[4]; + RID deinterleaved_pong_slices[4]; + RID edges_slices[4]; + for (uint32_t i = 0; i < 4; i++) { + deinterleaved_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED, p_view * 4 + i, 0); + deinterleaved_pong_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_DEINTERLEAVED_PONG, p_view * 4 + i, 0); + edges_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_EDGES, p_view * 4 + i, 0); + } + //Store projection info before starting the compute list SSILProjectionUniforms projection_uniforms; store_camera(p_last_projection, projection_uniforms.inv_last_frame_projection_matrix); @@ -701,7 +658,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers memset(&ssil.gather_push_constant, 0, sizeof(SSILGatherPushConstant)); - RID shader = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0); + RID shader = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, SSIL_GATHER); RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); RID default_mipmap_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); @@ -749,78 +706,69 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers ssil.gather_push_constant.quality = MAX(0, ssil_quality - 1); ssil.gather_push_constant.size_multiplier = ssil_half_size ? 2 : 1; - if (p_ssil_buffers.projection_uniform_set.is_null()) { - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - u.binding = 0; - u.append_id(default_mipmap_sampler); - u.append_id(p_ssil_buffers.last_frame); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - u.binding = 1; - u.append_id(ssil.projection_uniform_buffer); - uniforms.push_back(u); - } - p_ssil_buffers.projection_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0), 3); + // We are using our uniform cache so our uniform sets are automatically freed when our textures are freed. + // It also ensures that we're reusing the right cached entry in a multiview situation without us having to + // remember each instance of the uniform set. + + RID projection_uniform_set; + { + RD::Uniform u_last_frame; + u_last_frame.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + u_last_frame.binding = 0; + u_last_frame.append_id(default_mipmap_sampler); + u_last_frame.append_id(last_frame); + + RD::Uniform u_projection; + u_projection.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u_projection.binding = 1; + u_projection.append_id(ssil.projection_uniform_buffer); + + projection_uniform_set = uniform_set_cache->get_cache(shader, 3, u_last_frame, u_projection); } - if (p_ssil_buffers.gather_uniform_set.is_null()) { - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - u.binding = 0; - u.append_id(default_sampler); - u.append_id(p_ssil_buffers.depth_texture_view); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 1; - u.append_id(p_normal_buffer); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - u.binding = 2; - u.append_id(ss_effects.gather_constants_buffer); - uniforms.push_back(u); - } - p_ssil_buffers.gather_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 0), 0); + RID gather_uniform_set; + { + RID depth_texture_view = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, ssil_half_size ? 1 : 0, 4, 4); + + RD::Uniform u_depth_texture_view; + u_depth_texture_view.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + u_depth_texture_view.binding = 0; + u_depth_texture_view.append_id(default_sampler); + u_depth_texture_view.append_id(depth_texture_view); + + RD::Uniform u_normal_buffer; + u_normal_buffer.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u_normal_buffer.binding = 1; + u_normal_buffer.append_id(p_normal_buffer); + + RD::Uniform u_gather_constants_buffer; + u_gather_constants_buffer.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u_gather_constants_buffer.binding = 2; + u_gather_constants_buffer.append_id(ss_effects.gather_constants_buffer); + + gather_uniform_set = uniform_set_cache->get_cache(shader, 0, u_depth_texture_view, u_normal_buffer, u_gather_constants_buffer); } - if (p_ssil_buffers.importance_map_uniform_set.is_null()) { - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 0; - u.append_id(p_ssil_buffers.pong); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - u.binding = 1; - u.append_id(default_sampler); - u.append_id(p_ssil_buffers.importance_map[0]); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.binding = 2; - u.append_id(ssil.importance_map_load_counter); - uniforms.push_back(u); - } - p_ssil_buffers.importance_map_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssil.gather_shader.version_get_shader(ssil.gather_shader_version, 2), 1); + RID importance_map_uniform_set; + { + RD::Uniform u_pong; + u_pong.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u_pong.binding = 0; + u_pong.append_id(deinterleaved_pong); + + RD::Uniform u_importance_map; + u_importance_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + u_importance_map.binding = 1; + u_importance_map.append_id(default_sampler); + u_importance_map.append_id(importance_map); + + RD::Uniform u_load_counter; + u_load_counter.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u_load_counter.binding = 2; + u_load_counter.append_id(ssil.importance_map_load_counter); + + RID shader_adaptive = ssil.gather_shader.version_get_shader(ssil.gather_shader_version, SSIL_GATHER_ADAPTIVE); + importance_map_uniform_set = uniform_set_cache->get_cache(shader_adaptive, 1, u_pong, u_importance_map, u_load_counter); } if (ssil_quality == RS::ENV_SSIL_QUALITY_ULTRA) { @@ -828,38 +776,42 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers ssil.importance_map_push_constant.half_screen_pixel_size[0] = 1.0 / p_ssil_buffers.buffer_width; ssil.importance_map_push_constant.half_screen_pixel_size[1] = 1.0 / p_ssil_buffers.buffer_height; ssil.importance_map_push_constant.intensity = p_settings.intensity * Math_PI; + //base pass RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GATHER_BASE]); - gather_ssil(compute_list, p_ssil_buffers.pong_slices, p_ssil_buffers.edges_slices, p_settings, true, p_ssil_buffers.gather_uniform_set, p_ssil_buffers.importance_map_uniform_set, p_ssil_buffers.projection_uniform_set); + gather_ssil(compute_list, deinterleaved_pong_slices, edges_slices, p_settings, true, gather_uniform_set, importance_map_uniform_set, projection_uniform_set); //generate importance map - RD::Uniform u_ssil_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong })); - RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.importance_map[0] })); + RID gen_imp_shader = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 0); + RD::Uniform u_ssil_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong })); + RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_map })); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GENERATE_IMPORTANCE_MAP]); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_with_sampler), 0); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 0, u_ssil_pong_with_sampler), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 1, u_importance_map), 1); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); // process Importance Map A - RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.importance_map[0] })); - RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.importance_map[1] })); + RID proc_imp_shader_a = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 1); + RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_map })); + RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_pong })); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_PROCESS_IMPORTANCE_MAPA]); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_with_sampler), 0); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map_pong), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 0, u_importance_map_with_sampler), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 1, u_importance_map_pong), 1); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); // process Importance Map B - RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.importance_map[1] })); + RID proc_imp_shader_b = ssil.importance_map_shader.version_get_shader(ssil.importance_map_shader_version, 2); + RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_pong })); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_PROCESS_IMPORTANCE_MAPB]); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_pong_with_sampler), 0); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 0, u_importance_map_pong_with_sampler), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 1, u_importance_map), 1); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ssil.counter_uniform_set, 2); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.importance_map_push_constant, sizeof(SSILImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssil_buffers.half_buffer_width, p_ssil_buffers.half_buffer_height, 1); @@ -872,7 +824,7 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[SSIL_GATHER]); } - gather_ssil(compute_list, p_ssil_buffers.deinterleaved_slices, p_ssil_buffers.edges_slices, p_settings, false, p_ssil_buffers.gather_uniform_set, p_ssil_buffers.importance_map_uniform_set, p_ssil_buffers.projection_uniform_set); + gather_ssil(compute_list, deinterleaved_slices, edges_slices, p_settings, false, gather_uniform_set, importance_map_uniform_set, projection_uniform_set); RD::get_singleton()->draw_command_end_label(); //Gather } @@ -895,6 +847,8 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers } } + RID blur_shader = ssil.blur_shader.version_get_shader(ssil.blur_shader_version, blur_pipeline - SSIL_BLUR_PASS); + for (int i = 0; i < 4; i++) { if ((ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) && ((i == 1) || (i == 2))) { continue; @@ -903,30 +857,30 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[blur_pipeline]); if (pass % 2 == 0) { if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { - RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_slice), 0); + RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_slice), 0); } else { - RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssil_buffers.deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_slice), 0); + RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_slice), 0); } - RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_pong_slice), 1); + RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ deinterleaved_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ssil_pong_slice), 1); } else { if (ssil_quality == RS::ENV_SSIL_QUALITY_VERY_LOW) { - RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_slice), 0); + RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_pong_slice), 0); } else { - RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssil_buffers.pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ssil_pong_slice), 0); + RD::Uniform u_ssil_pong_slice(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, deinterleaved_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ssil_pong_slice), 0); } - RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_slice), 1); + RD::Uniform u_ssil_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ssil_slice), 1); } - RD::Uniform u_edges_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.edges_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_edges_slice), 2); + RD::Uniform u_edges_slice(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ edges_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 2, u_edges_slice), 2); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.blur_push_constant, sizeof(SSILBlurPushConstant)); @@ -961,18 +915,19 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssil.pipelines[interleave_pipeline]); - RD::Uniform u_destination(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.ssil_final })); + RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_FINAL, p_view, 0); + RD::Uniform u_destination(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ final })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_destination), 0); if (ssil_quality > RS::ENV_SSIL_QUALITY_VERY_LOW && ssil_blur_passes % 2 == 0) { - RD::Uniform u_ssil(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.deinterleaved })); + RD::Uniform u_ssil(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil), 1); } else { - RD::Uniform u_ssil_pong(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssil_buffers.pong })); + RD::Uniform u_ssil_pong(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, deinterleaved_pong })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ssil_pong), 1); } - RD::Uniform u_edges(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssil_buffers.edges })); + RD::Uniform u_edges(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ edges })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_edges), 2); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssil.interleave_push_constant, sizeof(SSILInterleavePushConstant)); @@ -990,34 +945,6 @@ void SSEffects::screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers RD::get_singleton()->buffer_update(ssil.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier } -void SSEffects::ssil_free(SSILRenderBuffers &p_ssil_buffers) { - if (p_ssil_buffers.ssil_final.is_valid()) { - RD::get_singleton()->free(p_ssil_buffers.ssil_final); - RD::get_singleton()->free(p_ssil_buffers.deinterleaved); - RD::get_singleton()->free(p_ssil_buffers.pong); - RD::get_singleton()->free(p_ssil_buffers.edges); - RD::get_singleton()->free(p_ssil_buffers.importance_map[0]); - RD::get_singleton()->free(p_ssil_buffers.importance_map[1]); - RD::get_singleton()->free(p_ssil_buffers.last_frame); - - p_ssil_buffers.ssil_final = RID(); - p_ssil_buffers.deinterleaved = RID(); - p_ssil_buffers.pong = RID(); - p_ssil_buffers.edges = RID(); - p_ssil_buffers.deinterleaved_slices.clear(); - p_ssil_buffers.pong_slices.clear(); - p_ssil_buffers.edges_slices.clear(); - p_ssil_buffers.importance_map[0] = RID(); - p_ssil_buffers.importance_map[1] = RID(); - p_ssil_buffers.last_frame = RID(); - p_ssil_buffers.last_frame_slices.clear(); - - p_ssil_buffers.gather_uniform_set = RID(); - p_ssil_buffers.importance_map_uniform_set = RID(); - p_ssil_buffers.projection_uniform_set = RID(); - } -} - /* SSAO */ void SSEffects::ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) { @@ -1029,13 +956,13 @@ void SSEffects::ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_ha ssao_fadeout_to = p_fadeout_to; } -void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set) { +void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const RID *p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_gather_uniform_set, 0); if ((ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) && !p_adaptive_base_pass) { - RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 0); + RD::get_singleton()->compute_list_bind_uniform_set(p_compute_list, p_importance_map_uniform_set, 1); } RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 1); // @@ -1062,11 +989,12 @@ void SSEffects::gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> RD::get_singleton()->compute_list_add_barrier(p_compute_list); } -void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings, RID p_linear_depth) { +void SSEffects::ssao_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings) { if (p_ssao_buffers.half_size != ssao_half_size) { - ssao_free(p_ssao_buffers); + p_render_buffers->clear_context(RB_SCOPE_SSAO); } + p_ssao_buffers.half_size = ssao_half_size; if (ssao_half_size) { p_ssao_buffers.buffer_width = (p_settings.full_screen_size.x + 3) / 4; p_ssao_buffers.buffer_height = (p_settings.full_screen_size.y + 3) / 4; @@ -1079,79 +1007,45 @@ void SSEffects::ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const S p_ssao_buffers.half_buffer_height = (p_settings.full_screen_size.y + 3) / 4; } - if (p_ssao_buffers.ao_deinterleaved.is_null()) { - { - p_ssao_buffers.depth_texture_view = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_linear_depth, 0, ssao_half_size ? 1 : 0, 4, RD::TEXTURE_SLICE_2D_ARRAY); - } - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8G8_UNORM; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = p_ssao_buffers.buffer_width; - tf.height = p_ssao_buffers.buffer_height; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssao_buffers.ao_deinterleaved = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_deinterleaved, "SSAO De-interleaved Array"); - for (uint32_t i = 0; i < 4; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssao_buffers.ao_deinterleaved, i, 0); - p_ssao_buffers.ao_deinterleaved_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SSAO De-interleaved Array Layer " + itos(i) + " "); - } - } + uint32_t view_count = p_render_buffers->get_view_count(); + Size2i full_size = Size2i(p_ssao_buffers.buffer_width, p_ssao_buffers.buffer_height); + Size2i half_size = Size2i(p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height); - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8G8_UNORM; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = p_ssao_buffers.buffer_width; - tf.height = p_ssao_buffers.buffer_height; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssao_buffers.ao_pong = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_pong, "SSAO De-interleaved Array Pong"); - for (uint32_t i = 0; i < 4; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssao_buffers.ao_pong, i, 0); - p_ssao_buffers.ao_pong_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SSAO De-interleaved Array Layer " + itos(i) + " Pong"); - } - } + // As we're not clearing these, and render buffers will return the cached texture if it already exists, + // we don't first check has_texture here - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8_UNORM; - tf.width = p_ssao_buffers.buffer_width; - tf.height = p_ssao_buffers.buffer_height; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssao_buffers.importance_map[0] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map[0], "SSAO Importance Map"); - p_ssao_buffers.importance_map[1] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map[1], "SSAO Importance Map Pong"); - } - { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8_UNORM; - tf.width = p_settings.full_screen_size.x; - tf.height = p_settings.full_screen_size.y; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - p_ssao_buffers.ao_final = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssao_buffers.ao_final, "SSAO Final"); - } - p_ssao_buffers.half_size = ssao_half_size; - } + p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_DEINTERLEAVED, RD::DATA_FORMAT_R8G8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count); + p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, RD::DATA_FORMAT_R8G8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, full_size, 4 * view_count); + p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_IMPORTANCE_MAP, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size); + p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_IMPORTANCE_PONG, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, half_size); + p_render_buffers->create_texture(RB_SCOPE_SSAO, RB_FINAL, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1); } -void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings) { +void SSEffects::generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); ERR_FAIL_NULL(material_storage); + // Obtain our (cached) buffer slices for the view we are rendering. + RID ao_deinterleaved = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED, p_view * 4, 0, 4, 1); + RID ao_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, p_view * 4, 0, 4, 1); + RID importance_map = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_IMPORTANCE_MAP, p_view, 0); + RID importance_pong = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_IMPORTANCE_PONG, p_view, 0); + RID ao_final = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_FINAL, p_view, 0); + + RID ao_deinterleaved_slices[4]; + RID ao_pong_slices[4]; + for (uint32_t i = 0; i < 4; i++) { + ao_deinterleaved_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED, p_view * 4 + i, 0); + ao_pong_slices[i] = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_DEINTERLEAVED_PONG, p_view * 4 + i, 0); + } + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); memset(&ssao.gather_push_constant, 0, sizeof(SSAOGatherPushConstant)); /* FIRST PASS */ - RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 0); + RID shader = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, SSAO_GATHER); RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); RD::get_singleton()->draw_command_begin_label("Process Screen Space Ambient Occlusion"); @@ -1201,60 +1095,52 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu ssao.gather_push_constant.quality = MAX(0, ssao_quality - 1); ssao.gather_push_constant.size_multiplier = ssao_half_size ? 2 : 1; - if (p_ssao_buffers.gather_uniform_set.is_null()) { - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - u.binding = 0; - u.append_id(default_sampler); - u.append_id(p_ssao_buffers.depth_texture_view); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 1; - u.append_id(p_normal_buffer); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; - u.binding = 2; - u.append_id(ss_effects.gather_constants_buffer); - uniforms.push_back(u); - } - p_ssao_buffers.gather_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, shader, 0); - RD::get_singleton()->set_resource_name(p_ssao_buffers.gather_uniform_set, "SSAO Gather Uniform Set"); + // We are using our uniform cache so our uniform sets are automatically freed when our textures are freed. + // It also ensures that we're reusing the right cached entry in a multiview situation without us having to + // remember each instance of the uniform set. + RID gather_uniform_set; + { + RID depth_texture_view = p_render_buffers->get_texture_slice(RB_SCOPE_SSDS, RB_LINEAR_DEPTH, p_view * 4, ssao_half_size ? 1 : 0, 4, 4); + + RD::Uniform u_depth_texture_view; + u_depth_texture_view.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + u_depth_texture_view.binding = 0; + u_depth_texture_view.append_id(default_sampler); + u_depth_texture_view.append_id(depth_texture_view); + + RD::Uniform u_normal_buffer; + u_normal_buffer.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u_normal_buffer.binding = 1; + u_normal_buffer.append_id(p_normal_buffer); + + RD::Uniform u_gather_constants_buffer; + u_gather_constants_buffer.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u_gather_constants_buffer.binding = 2; + u_gather_constants_buffer.append_id(ss_effects.gather_constants_buffer); + + gather_uniform_set = uniform_set_cache->get_cache(shader, 0, u_depth_texture_view, u_normal_buffer, u_gather_constants_buffer); } - if (p_ssao_buffers.importance_map_uniform_set.is_null()) { - Vector<RD::Uniform> uniforms; - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_IMAGE; - u.binding = 0; - u.append_id(p_ssao_buffers.ao_pong); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - u.binding = 1; - u.append_id(default_sampler); - u.append_id(p_ssao_buffers.importance_map[0]); - uniforms.push_back(u); - } - { - RD::Uniform u; - u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; - u.binding = 2; - u.append_id(ssao.importance_map_load_counter); - uniforms.push_back(u); - } - p_ssao_buffers.importance_map_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, ssao.gather_shader.version_get_shader(ssao.gather_shader_version, 2), 1); - RD::get_singleton()->set_resource_name(p_ssao_buffers.importance_map_uniform_set, "SSAO Importance Map Uniform Set"); + RID importance_map_uniform_set; + { + RD::Uniform u_pong; + u_pong.uniform_type = RD::UNIFORM_TYPE_IMAGE; + u_pong.binding = 0; + u_pong.append_id(ao_pong); + + RD::Uniform u_importance_map; + u_importance_map.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + u_importance_map.binding = 1; + u_importance_map.append_id(default_sampler); + u_importance_map.append_id(importance_map); + + RD::Uniform u_load_counter; + u_load_counter.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u_load_counter.binding = 2; + u_load_counter.append_id(ssao.importance_map_load_counter); + + RID shader_adaptive = ssao.gather_shader.version_get_shader(ssao.gather_shader_version, SSAO_GATHER_ADAPTIVE); + importance_map_uniform_set = uniform_set_cache->get_cache(shader_adaptive, 1, u_pong, u_importance_map, u_load_counter); } if (ssao_quality == RS::ENV_SSAO_QUALITY_ULTRA) { @@ -1266,41 +1152,44 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu //base pass RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GATHER_BASE]); - gather_ssao(compute_list, p_ssao_buffers.ao_pong_slices, p_settings, true, p_ssao_buffers.gather_uniform_set, RID()); + gather_ssao(compute_list, ao_pong_slices, p_settings, true, gather_uniform_set, RID()); //generate importance map + RID gen_imp_shader = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 0); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GENERATE_IMPORTANCE_MAP]); - RD::Uniform u_ao_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_with_sampler), 0); + RD::Uniform u_ao_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 0, u_ao_pong_with_sampler), 0); - RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.importance_map[0] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1); + RD::Uniform u_importance_map(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_map })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(gen_imp_shader, 1, u_importance_map), 1); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); //process importance map A + RID proc_imp_shader_a = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 1); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_PROCESS_IMPORTANCE_MAPA]); - RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.importance_map[0] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_with_sampler), 0); + RD::Uniform u_importance_map_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_map })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 0, u_importance_map_with_sampler), 0); - RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.importance_map[1] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map_pong), 1); + RD::Uniform u_importance_map_pong(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ importance_pong })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_a, 1, u_importance_map_pong), 1); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); //process Importance Map B + RID proc_imp_shader_b = ssao.importance_map_shader.version_get_shader(ssao.importance_map_shader_version, 2); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_PROCESS_IMPORTANCE_MAPB]); - RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.importance_map[1] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_importance_map_pong_with_sampler), 0); + RD::Uniform u_importance_map_pong_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, importance_pong })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 0, u_importance_map_pong_with_sampler), 0); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_importance_map), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(proc_imp_shader_b, 1, u_importance_map), 1); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, ssao.counter_uniform_set, 2); RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.importance_map_push_constant, sizeof(SSAOImportanceMapPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssao_buffers.half_buffer_width, p_ssao_buffers.half_buffer_height, 1); @@ -1312,7 +1201,7 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[SSAO_GATHER]); } - gather_ssao(compute_list, p_ssao_buffers.ao_deinterleaved_slices, p_settings, false, p_ssao_buffers.gather_uniform_set, p_ssao_buffers.importance_map_uniform_set); + gather_ssao(compute_list, ao_deinterleaved_slices, p_settings, false, gather_uniform_set, importance_map_uniform_set); RD::get_singleton()->draw_command_end_label(); // Gather SSAO } @@ -1344,29 +1233,30 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu continue; } + RID blur_shader = ssao.blur_shader.version_get_shader(ssao.blur_shader_version, blur_pipeline - SSAO_BLUR_PASS); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[blur_pipeline]); if (pass % 2 == 0) { if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { - RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_slices_with_sampler), 0); + RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_slices_with_sampler), 0); } else { - RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssao_buffers.ao_deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_slices_with_sampler), 0); + RD::Uniform u_ao_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, ao_deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_slices_with_sampler), 0); } - RD::Uniform u_ao_pong_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao_pong_slices), 1); + RD::Uniform u_ao_pong_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ao_pong_slices), 1); } else { if (ssao_quality == RS::ENV_SSAO_QUALITY_VERY_LOW) { - RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_slices_with_sampler), 0); + RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_pong_slices_with_sampler), 0); } else { - RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, p_ssao_buffers.ao_pong_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_ao_pong_slices_with_sampler), 0); + RD::Uniform u_ao_pong_slices_with_sampler(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ ss_effects.mirror_sampler, ao_pong_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 0, u_ao_pong_slices_with_sampler), 0); } - RD::Uniform u_ao_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_deinterleaved_slices[i] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao_slices), 1); + RD::Uniform u_ao_slices(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_deinterleaved_slices[i] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(blur_shader, 1, u_ao_slices), 1); } RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.blur_push_constant, sizeof(SSAOBlurPushConstant)); @@ -1400,17 +1290,18 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu interleave_pipeline = SSAO_INTERLEAVE_SMART; } + RID interleave_shader = ssao.interleave_shader.version_get_shader(ssao.interleave_shader_version, interleave_pipeline - SSAO_INTERLEAVE); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssao.pipelines[interleave_pipeline]); - RD::Uniform u_upscale_buffer(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssao_buffers.ao_final })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_upscale_buffer), 0); + RD::Uniform u_upscale_buffer(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ ao_final })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 0, u_upscale_buffer), 0); if (ssao_quality > RS::ENV_SSAO_QUALITY_VERY_LOW && ssao_blur_passes % 2 == 0) { - RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_deinterleaved })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao), 1); + RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_deinterleaved })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 1, u_ao), 1); } else { - RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_ssao_buffers.ao_pong })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_ao), 1); + RD::Uniform u_ao(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, ao_pong })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(interleave_shader, 1, u_ao), 1); } RD::get_singleton()->compute_list_set_push_constant(compute_list, &ssao.interleave_push_constant, sizeof(SSAOInterleavePushConstant)); @@ -1426,116 +1317,43 @@ void SSEffects::generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_bu RD::get_singleton()->buffer_update(ssao.importance_map_load_counter, 0, sizeof(uint32_t), &zero, 0); //no barrier } -void SSEffects::ssao_free(SSAORenderBuffers &p_ssao_buffers) { - if (p_ssao_buffers.ao_final.is_valid()) { - RD::get_singleton()->free(p_ssao_buffers.ao_deinterleaved); - RD::get_singleton()->free(p_ssao_buffers.ao_pong); - RD::get_singleton()->free(p_ssao_buffers.ao_final); - - RD::get_singleton()->free(p_ssao_buffers.importance_map[0]); - RD::get_singleton()->free(p_ssao_buffers.importance_map[1]); - - p_ssao_buffers.ao_deinterleaved = RID(); - p_ssao_buffers.ao_pong = RID(); - p_ssao_buffers.ao_final = RID(); - p_ssao_buffers.importance_map[0] = RID(); - p_ssao_buffers.importance_map[1] = RID(); - p_ssao_buffers.ao_deinterleaved_slices.clear(); - p_ssao_buffers.ao_pong_slices.clear(); - - p_ssao_buffers.gather_uniform_set = RID(); - p_ssao_buffers.importance_map_uniform_set = RID(); - } -} - /* Screen Space Reflection */ void SSEffects::ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) { ssr_roughness_quality = p_quality; } -void SSEffects::ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count) { - // As we are processing one view at a time, we can reuse buffers, only our output needs to have layers for each view. - if (p_ssr_buffers.size != p_screen_size || p_ssr_buffers.roughness_quality != ssr_roughness_quality) { - ssr_free(p_ssr_buffers); - } - - if (p_ssr_buffers.output.is_valid()) { - // already allocated - return; +void SSEffects::ssr_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format) { + if (p_ssr_buffers.roughness_quality != ssr_roughness_quality) { + // Buffers will already be cleared if view count or viewport size has changed, also cleared them if we change roughness. + p_render_buffers->clear_context(RB_SCOPE_SSR); } - p_ssr_buffers.size = p_screen_size; + Size2i internal_size = p_render_buffers->get_internal_size(); + p_ssr_buffers.size = Size2i(internal_size.x / 2, internal_size.y / 2); p_ssr_buffers.roughness_quality = ssr_roughness_quality; - if (p_ssr_buffers.depth_scaled.is_null()) { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R32_SFLOAT; - tf.width = p_screen_size.x; - tf.height = p_screen_size.y; - tf.texture_type = RD::TEXTURE_TYPE_2D; - tf.array_layers = 1; - tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT; - - p_ssr_buffers.depth_scaled = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.depth_scaled, "SSR Depth Scaled"); + // We are using barriers so we do not need to allocate textures for both views on anything but output... - tf.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + p_render_buffers->create_texture(RB_SCOPE_SSR, RB_DEPTH_SCALED, RD::DATA_FORMAT_R32_SFLOAT, RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1); + p_render_buffers->create_texture(RB_SCOPE_SSR, RB_NORMAL_SCALED, RD::DATA_FORMAT_R8G8B8A8_UNORM, RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1); - p_ssr_buffers.normal_scaled = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.normal_scaled, "SSR Normal Scaled"); + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_render_buffers->has_texture(RB_SCOPE_SSR, RB_BLUR_RADIUS)) { + p_render_buffers->create_texture(RB_SCOPE_SSR, RB_BLUR_RADIUS, RD::DATA_FORMAT_R8_UNORM, RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 2); // 2 layers, for our two blur stages } - if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED && !p_ssr_buffers.blur_radius[0].is_valid()) { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R8_UNORM; - tf.width = p_screen_size.x; - tf.height = p_screen_size.y; - tf.texture_type = RD::TEXTURE_TYPE_2D; - tf.array_layers = 1; - tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; - - p_ssr_buffers.blur_radius[0] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.blur_radius[0], "SSR Blur Radius 0"); - p_ssr_buffers.blur_radius[1] = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.blur_radius[1], "SSR Blur Radius 1"); - } - - if (p_ssr_buffers.intermediate.is_null()) { - RD::TextureFormat tf; - tf.format = p_color_format; - tf.width = p_screen_size.x; - tf.height = p_screen_size.y; - tf.texture_type = RD::TEXTURE_TYPE_2D; - tf.array_layers = 1; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - - p_ssr_buffers.intermediate = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.intermediate, "SSR Intermediate"); - - if (p_view_count > 1) { - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.array_layers = p_view_count; - } else { - tf.texture_type = RD::TEXTURE_TYPE_2D; - tf.array_layers = 1; - } - - p_ssr_buffers.output = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(p_ssr_buffers.output, "SSR Output"); - - for (uint32_t v = 0; v < p_view_count; v++) { - p_ssr_buffers.output_slices[v] = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), p_ssr_buffers.output, v, 0); - } - } + p_render_buffers->create_texture(RB_SCOPE_SSR, RB_INTERMEDIATE, p_color_format, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size, 1); + p_render_buffers->create_texture(RB_SCOPE_SSR, RB_OUTPUT, p_color_format, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | RD::TEXTURE_USAGE_STORAGE_BIT, RD::TEXTURE_SAMPLES_1, p_ssr_buffers.size); } -void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets) { +void SSEffects::screen_space_reflection(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const Projection *p_projections, const Vector3 *p_eye_offsets) { UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); ERR_FAIL_NULL(uniform_set_cache); MaterialStorage *material_storage = MaterialStorage::get_singleton(); ERR_FAIL_NULL(material_storage); + uint32_t view_count = p_render_buffers->get_view_count(); + RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); { @@ -1546,7 +1364,7 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R ssr.ubo = RD::get_singleton()->uniform_buffer_create(sizeof(ScreenSpaceReflectionSceneData)); } - for (uint32_t v = 0; v < p_view_count; v++) { + for (uint32_t v = 0; v < view_count; v++) { store_camera(p_projections[v], scene_data.projection[v]); store_camera(p_projections[v].inverse(), scene_data.inv_projection[v]); scene_data.eye_offset[v][0] = p_eye_offsets[v].x; @@ -1559,13 +1377,27 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R } uint32_t pipeline_specialization = 0; - if (p_view_count > 1) { + if (view_count > 1) { pipeline_specialization |= SSR_MULTIVIEW; } RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); - for (uint32_t v = 0; v < p_view_count; v++) { + for (uint32_t v = 0; v < view_count; v++) { + // get buffers we need to use for this view + RID diffuse_slice = p_render_buffers->get_internal_texture(v); + RID depth_slice = p_render_buffers->get_depth_texture(v); + RID depth_scaled = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_DEPTH_SCALED); + RID normal_scaled = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_NORMAL_SCALED); + RID intermediate = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_INTERMEDIATE); + RID output = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_OUTPUT, v, 0); + + RID blur_radius[2]; + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { + blur_radius[0] = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_BLUR_RADIUS, 0, 0); + blur_radius[1] = p_render_buffers->get_texture_slice(RB_SCOPE_SSR, RB_BLUR_RADIUS, 1, 0); + } + RD::get_singleton()->draw_command_begin_label(String("SSR View ") + itos(v)); { //scale color and depth to half @@ -1577,34 +1409,29 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.camera_z_near = p_projections[v].get_z_near(); push_constant.orthogonal = p_projections[v].is_orthogonal(); push_constant.filter = false; //enabling causes arctifacts - push_constant.screen_size[0] = p_screen_size.x; - push_constant.screen_size[1] = p_screen_size.y; + push_constant.screen_size[0] = p_ssr_buffers.size.x; + push_constant.screen_size[1] = p_ssr_buffers.size.y; RID shader = ssr_scale.shader.version_get_shader(ssr_scale.shader_version, 0); RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssr_scale.pipelines[pipeline_specialization]); - RD::Uniform u_diffuse(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_diffuse_slices[v] })); + RD::Uniform u_diffuse(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, diffuse_slice })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_diffuse), 0); - RD::Uniform u_depth(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_depth_slices[v] })); + RD::Uniform u_depth(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, depth_slice })); RD::Uniform u_normal_roughness(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 1, Vector<RID>({ default_sampler, p_normal_roughness_slices[v] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_depth, u_normal_roughness), 1); - if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { - RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output), 2); - } else { - RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2); - } + RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2); - RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.depth_scaled })); - RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.normal_scaled })); + RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_scaled })); + RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ normal_scaled })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth, u_scale_normal), 3); RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionScalePushConstant)); - RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1); + RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1619,15 +1446,15 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.camera_z_far = p_projections[v].get_z_far(); push_constant.camera_z_near = p_projections[v].get_z_near(); push_constant.orthogonal = p_projections[v].is_orthogonal(); - push_constant.screen_size[0] = p_screen_size.x; - push_constant.screen_size[1] = p_screen_size.y; + push_constant.screen_size[0] = p_ssr_buffers.size.x; + push_constant.screen_size[1] = p_ssr_buffers.size.y; push_constant.curve_fade_in = p_fade_in; push_constant.distance_fade = p_fade_out; push_constant.num_steps = p_max_steps; push_constant.depth_tolerance = p_tolerance; push_constant.use_half_res = true; - push_constant.proj_info[0] = -2.0f / (p_screen_size.width * p_projections[v].columns[0][0]); - push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].columns[1][1]); + push_constant.proj_info[0] = -2.0f / (p_ssr_buffers.size.width * p_projections[v].columns[0][0]); + push_constant.proj_info[1] = -2.0f / (p_ssr_buffers.size.height * p_projections[v].columns[1][1]); push_constant.proj_info[2] = (1.0f - p_projections[v].columns[0][2]) / p_projections[v].columns[0][0]; push_constant.proj_info[3] = (1.0f + p_projections[v].columns[1][2]) / p_projections[v].columns[1][1]; @@ -1639,35 +1466,30 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4); + // read from intermediate + RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate })); + RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ depth_scaled })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_scale_depth), 0); + if (ssr_roughness_quality != RS::ENV_SSR_ROUGHNESS_QUALITY_DISABLED) { - // read from output slices (our scale wrote into these) - RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] })); - RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.depth_scaled })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output, u_scale_depth), 0); - - // write to intermediate (our roughness pass will output into output slices) - RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate })); - RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[0] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_intermediate, u_blur_radius), 1); + // write to output and blur radius + RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output })); + RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[0] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_output, u_blur_radius), 1); } else { - // read from intermediate (our scale wrote into these) - RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate })); - RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.depth_scaled })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_scale_depth), 0); - - // We are not performing our blur so go directly to output. - RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] })); + // We are only writing output + RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_output), 1); } - RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.normal_scaled })); + RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ normal_scaled })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_scale_normal), 2); RD::Uniform u_metallic(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_metallic_slices[v] })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_metallic), 3); RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionPushConstant)); - RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1); + RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1); RD::get_singleton()->draw_command_end_label(); } @@ -1682,8 +1504,8 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.view_index = v; push_constant.orthogonal = p_projections[v].is_orthogonal(); push_constant.edge_tolerance = Math::sin(Math::deg_to_rad(15.0)); - push_constant.proj_info[0] = -2.0f / (p_screen_size.width * p_projections[v].columns[0][0]); - push_constant.proj_info[1] = -2.0f / (p_screen_size.height * p_projections[v].columns[1][1]); + push_constant.proj_info[0] = -2.0f / (p_ssr_buffers.size.width * p_projections[v].columns[0][0]); + push_constant.proj_info[1] = -2.0f / (p_ssr_buffers.size.height * p_projections[v].columns[1][1]); push_constant.proj_info[2] = (1.0f - p_projections[v].columns[0][2]) / p_projections[v].columns[0][0]; push_constant.proj_info[3] = (1.0f + p_projections[v].columns[1][2]) / p_projections[v].columns[1][1]; push_constant.vertical = 0; @@ -1698,8 +1520,8 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.increment = 1; } - push_constant.screen_size[0] = p_screen_size.width; - push_constant.screen_size[1] = p_screen_size.height; + push_constant.screen_size[0] = p_ssr_buffers.size.width; + push_constant.screen_size[1] = p_ssr_buffers.size.height; // Horizontal pass @@ -1709,25 +1531,25 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, ssr_filter.pipelines[pipeline_specialization][mode]); - RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4); - - RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.intermediate })); - RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[0] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_blur_radius), 0); + RD::Uniform u_output(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ output })); + RD::Uniform u_blur_radius(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[0] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output, u_blur_radius), 0); - RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.normal_scaled })); + RD::Uniform u_scale_normal(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ normal_scaled })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_scale_normal), 1); - RD::Uniform u_output_blur(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.output_slices[v] })); - RD::Uniform u_blur_radius2(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ p_ssr_buffers.blur_radius[1] })); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output_blur, u_blur_radius2), 2); + RD::Uniform u_intermediate(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ intermediate })); + RD::Uniform u_blur_radius2(RD::UNIFORM_TYPE_IMAGE, 1, Vector<RID>({ blur_radius[1] })); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate, u_blur_radius2), 2); - RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ p_ssr_buffers.depth_scaled })); + RD::Uniform u_scale_depth(RD::UNIFORM_TYPE_IMAGE, 0, Vector<RID>({ depth_scaled })); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth), 3); + RD::Uniform u_scene_data(RD::UNIFORM_TYPE_UNIFORM_BUFFER, 0, ssr.ubo); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionFilterPushConstant)); - RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1); + RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); // Vertical pass @@ -1739,16 +1561,16 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R push_constant.vertical = 1; - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_output_blur, u_blur_radius2), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 0, u_intermediate, u_blur_radius2), 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_scale_normal), 1); - RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_intermediate), 2); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 2, u_output), 2); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 3, u_scale_depth), 3); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 4, u_scene_data), 4); RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ScreenSpaceReflectionFilterPushConstant)); - RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_screen_size.width, p_screen_size.height, 1); + RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_ssr_buffers.size.width, p_ssr_buffers.size.height, 1); - if (v != p_view_count - 1) { + if (v != view_count - 1) { RD::get_singleton()->compute_list_add_barrier(compute_list); } @@ -1761,36 +1583,6 @@ void SSEffects::screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const R RD::get_singleton()->compute_list_end(); } -void SSEffects::ssr_free(SSRRenderBuffers &p_ssr_buffers) { - for (uint32_t v = 0; v < RendererSceneRender::MAX_RENDER_VIEWS; v++) { - p_ssr_buffers.output_slices[v] = RID(); - } - - if (p_ssr_buffers.output.is_valid()) { - RD::get_singleton()->free(p_ssr_buffers.output); - p_ssr_buffers.output = RID(); - } - - if (p_ssr_buffers.intermediate.is_valid()) { - RD::get_singleton()->free(p_ssr_buffers.intermediate); - p_ssr_buffers.intermediate = RID(); - } - - if (p_ssr_buffers.blur_radius[0].is_valid()) { - RD::get_singleton()->free(p_ssr_buffers.blur_radius[0]); - RD::get_singleton()->free(p_ssr_buffers.blur_radius[1]); - p_ssr_buffers.blur_radius[0] = RID(); - p_ssr_buffers.blur_radius[1] = RID(); - } - - if (p_ssr_buffers.depth_scaled.is_valid()) { - RD::get_singleton()->free(p_ssr_buffers.depth_scaled); - p_ssr_buffers.depth_scaled = RID(); - RD::get_singleton()->free(p_ssr_buffers.normal_scaled); - p_ssr_buffers.normal_scaled = RID(); - } -} - /* Subsurface scattering */ void SSEffects::sss_set_quality(RS::SubSurfaceScatteringQuality p_quality) { diff --git a/servers/rendering/renderer_rd/effects/ss_effects.h b/servers/rendering/renderer_rd/effects/ss_effects.h index bac1d9b786..8585277e19 100644 --- a/servers/rendering/renderer_rd/effects/ss_effects.h +++ b/servers/rendering/renderer_rd/effects/ss_effects.h @@ -48,6 +48,26 @@ #include "servers/rendering/renderer_scene_render.h" #include "servers/rendering_server.h" +#define RB_SCOPE_SSDS SNAME("rb_ssds") +#define RB_SCOPE_SSIL SNAME("rb_ssil") +#define RB_SCOPE_SSAO SNAME("rb_ssao") +#define RB_SCOPE_SSR SNAME("rb_ssr") + +#define RB_LINEAR_DEPTH SNAME("linear_depth") +#define RB_FINAL SNAME("final") +#define RB_LAST_FRAME SNAME("last_frame") +#define RB_DEINTERLEAVED SNAME("deinterleaved") +#define RB_DEINTERLEAVED_PONG SNAME("deinterleaved_pong") +#define RB_EDGES SNAME("edges") +#define RB_IMPORTANCE_MAP SNAME("importance_map") +#define RB_IMPORTANCE_PONG SNAME("importance_pong") + +#define RB_DEPTH_SCALED SNAME("depth_scaled") +#define RB_NORMAL_SCALED SNAME("normal_scaled") +#define RB_BLUR_RADIUS SNAME("blur_radius") +#define RB_INTERMEDIATE SNAME("intermediate") +#define RB_OUTPUT SNAME("output") + class RenderSceneBuffersRD; namespace RendererRD { @@ -64,7 +84,7 @@ public: /* SS Downsampler */ - void downsample_depth(RID p_depth_buffer, const Vector<RID> &p_depth_mipmaps, bool p_invalidate_uniform_set, Size2i p_full_screen_size, const Projection &p_projection); + void downsample_depth(Ref<RenderSceneBuffersRD> p_render_buffers, uint32_t p_view, const Projection &p_projection); /* SSIL */ void ssil_set_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to); @@ -75,23 +95,6 @@ public: int buffer_height; int half_buffer_width; int half_buffer_height; - - RID ssil_final; - RID deinterleaved; - Vector<RID> deinterleaved_slices; - RID pong; - Vector<RID> pong_slices; - RID edges; - Vector<RID> edges_slices; - RID importance_map[2]; - RID depth_texture_view; - - RID last_frame; - Vector<RID> last_frame_slices; - - RID gather_uniform_set; - RID importance_map_uniform_set; - RID projection_uniform_set; }; struct SSILSettings { @@ -103,9 +106,8 @@ public: Size2i full_screen_size; }; - void ssil_allocate_buffers(SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings, RID p_linear_depth); - void screen_space_indirect_lighting(SSILRenderBuffers &p_ssil_buffers, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings); - void ssil_free(SSILRenderBuffers &p_ssil_buffers); + void ssil_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, const SSILSettings &p_settings); + void screen_space_indirect_lighting(Ref<RenderSceneBuffersRD> p_render_buffers, SSILRenderBuffers &p_ssil_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const Projection &p_last_projection, const SSILSettings &p_settings); /* SSAO */ void ssao_set_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to); @@ -116,17 +118,6 @@ public: int buffer_height; int half_buffer_width; int half_buffer_height; - - RID ao_deinterleaved; - Vector<RID> ao_deinterleaved_slices; - RID ao_pong; - Vector<RID> ao_pong_slices; - RID ao_final; - RID importance_map[2]; - RID depth_texture_view; - - RID gather_uniform_set; - RID importance_map_uniform_set; }; struct SSAOSettings { @@ -140,9 +131,8 @@ public: Size2i full_screen_size; }; - void ssao_allocate_buffers(SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings, RID p_linear_depth); - void generate_ssao(SSAORenderBuffers &p_ssao_buffers, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings); - void ssao_free(SSAORenderBuffers &p_ssao_buffers); + void ssao_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, const SSAOSettings &p_settings); + void generate_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, SSAORenderBuffers &p_ssao_buffers, uint32_t p_view, RID p_normal_buffer, const Projection &p_projection, const SSAOSettings &p_settings); /* Screen Space Reflection */ void ssr_set_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality); @@ -150,18 +140,10 @@ public: struct SSRRenderBuffers { Size2i size; RenderingServer::EnvironmentSSRRoughnessQuality roughness_quality = RenderingServer::ENV_SSR_ROUGHNESS_QUALITY_DISABLED; - - RID normal_scaled; - RID depth_scaled; - RID blur_radius[2]; - RID intermediate; - RID output; - RID output_slices[RendererSceneRender::MAX_RENDER_VIEWS]; }; - void ssr_allocate_buffers(SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format, const Size2i &p_screen_size, const uint32_t p_view_count); - void screen_space_reflection(SSRRenderBuffers &p_ssr_buffers, const RID *p_diffuse_slices, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, const RID *p_depth_slices, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets); - void ssr_free(SSRRenderBuffers &p_ssr_buffers); + void ssr_allocate_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RenderingDevice::DataFormat p_color_format); + void screen_space_reflection(Ref<RenderSceneBuffersRD> p_render_buffers, SSRRenderBuffers &p_ssr_buffers, const RID *p_normal_roughness_slices, const RID *p_metallic_slices, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const Projection *p_projections, const Vector3 *p_eye_offsets); /* subsurface scattering */ void sss_set_quality(RS::SubSurfaceScatteringQuality p_quality); @@ -223,7 +205,6 @@ private: SSEffectsDownsamplePushConstant downsample_push_constant; SsEffectsDownsampleShaderRD downsample_shader; RID downsample_shader_version; - RID downsample_uniform_set; bool used_half_size_last_frame = false; bool used_mips_last_frame = false; bool used_full_mips_last_frame = false; @@ -332,7 +313,7 @@ private: RID pipelines[SSIL_MAX]; } ssil; - void gather_ssil(RD::ComputeListID p_compute_list, const Vector<RID> p_ssil_slices, const Vector<RID> p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set); + void gather_ssil(RD::ComputeListID p_compute_list, const RID *p_ssil_slices, const RID *p_edges_slices, const SSILSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set, RID p_projection_uniform_set); /* SSAO */ @@ -426,7 +407,7 @@ private: RID pipelines[SSAO_MAX]; } ssao; - void gather_ssao(RD::ComputeListID p_compute_list, const Vector<RID> p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set); + void gather_ssao(RD::ComputeListID p_compute_list, const RID *p_ao_slices, const SSAOSettings &p_settings, bool p_adaptive_base_pass, RID p_gather_uniform_set, RID p_importance_map_uniform_set); /* Screen Space Reflection */ diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index 59e1f559c7..6d5e55ee6a 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -30,6 +30,7 @@ #include "render_forward_clustered.h" #include "core/config/project_settings.h" +#include "core/object/worker_thread_pool.h" #include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" #include "servers/rendering/renderer_rd/renderer_compositor_rd.h" #include "servers/rendering/renderer_rd/storage_rd/light_storage.h" @@ -108,6 +109,10 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() { // JIC, should already have been cleared if (render_buffers) { render_buffers->clear_context(RB_SCOPE_FORWARD_CLUSTERED); + render_buffers->clear_context(RB_SCOPE_SSDS); + render_buffers->clear_context(RB_SCOPE_SSIL); + render_buffers->clear_context(RB_SCOPE_SSAO); + render_buffers->clear_context(RB_SCOPE_SSR); } if (cluster_builder) { @@ -118,21 +123,6 @@ void RenderForwardClustered::RenderBufferDataForwardClustered::free_data() { if (!render_sdfgi_uniform_set.is_null() && RD::get_singleton()->uniform_set_is_valid(render_sdfgi_uniform_set)) { RD::get_singleton()->free(render_sdfgi_uniform_set); } - - if (ss_effects_data.linear_depth.is_valid()) { - RD::get_singleton()->free(ss_effects_data.linear_depth); - ss_effects_data.linear_depth = RID(); - ss_effects_data.linear_depth_slices.clear(); - } - - if (ss_effects_data.downsample_uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(ss_effects_data.downsample_uniform_set)) { - RD::get_singleton()->free(ss_effects_data.downsample_uniform_set); - ss_effects_data.downsample_uniform_set = RID(); - } - - RenderForwardClustered::get_singleton()->get_ss_effects()->ssao_free(ss_effects_data.ssao); - RenderForwardClustered::get_singleton()->get_ss_effects()->ssil_free(ss_effects_data.ssil); - RenderForwardClustered::get_singleton()->get_ss_effects()->ssr_free(ss_effects_data.ssr); } void RenderForwardClustered::RenderBufferDataForwardClustered::configure(RenderSceneBuffersRD *p_render_buffers) { @@ -1252,7 +1242,7 @@ void RenderForwardClustered::setup_added_decal(const Transform3D &p_transform, c /* Render scene */ -void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection) { +void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections) { ERR_FAIL_NULL(ss_effects); ERR_FAIL_COND(p_render_buffers.is_null()); ERR_FAIL_COND(p_environment.is_null()); @@ -1271,11 +1261,14 @@ void RenderForwardClustered::_process_ssao(Ref<RenderSceneBuffersRD> p_render_bu settings.sharpness = environment_get_ssao_sharpness(p_environment); settings.full_screen_size = p_render_buffers->get_internal_size(); - ss_effects->ssao_allocate_buffers(rb_data->ss_effects_data.ssao, settings, rb_data->ss_effects_data.linear_depth); - ss_effects->generate_ssao(rb_data->ss_effects_data.ssao, p_normal_buffer, p_projection, settings); + ss_effects->ssao_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssao, settings); + + for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) { + ss_effects->generate_ssao(p_render_buffers, rb_data->ss_effects_data.ssao, v, p_normal_buffers[v], p_projections[v], settings); + } } -void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform) { +void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections, const Transform3D &p_transform) { ERR_FAIL_NULL(ss_effects); ERR_FAIL_COND(p_render_buffers.is_null()); ERR_FAIL_COND(p_environment.is_null()); @@ -1292,36 +1285,46 @@ void RenderForwardClustered::_process_ssil(Ref<RenderSceneBuffersRD> p_render_bu settings.normal_rejection = environment_get_ssil_normal_rejection(p_environment); settings.full_screen_size = p_render_buffers->get_internal_size(); - Projection correction; - correction.set_depth_correction(true); - Projection projection = correction * p_projection; + ss_effects->ssil_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssil, settings); + Transform3D transform = p_transform; transform.set_origin(Vector3(0.0, 0.0, 0.0)); - Projection last_frame_projection = rb_data->ss_effects_data.last_frame_projection * Projection(rb_data->ss_effects_data.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse(); - ss_effects->ssil_allocate_buffers(rb_data->ss_effects_data.ssil, settings, rb_data->ss_effects_data.linear_depth); - ss_effects->screen_space_indirect_lighting(rb_data->ss_effects_data.ssil, p_normal_buffer, p_projection, last_frame_projection, settings); - rb_data->ss_effects_data.last_frame_projection = projection; + for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) { + Projection correction; + correction.set_depth_correction(true); + Projection projection = correction * p_projections[v]; + Projection last_frame_projection = rb_data->ss_effects_data.last_frame_projections[v] * Projection(rb_data->ss_effects_data.last_frame_transform.affine_inverse()) * Projection(transform) * projection.inverse(); + + ss_effects->screen_space_indirect_lighting(p_render_buffers, rb_data->ss_effects_data.ssil, v, p_normal_buffers[v], p_projections[v], last_frame_projection, settings); + + rb_data->ss_effects_data.last_frame_projections[v] = projection; + } rb_data->ss_effects_data.last_frame_transform = transform; } void RenderForwardClustered::_copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers) { ERR_FAIL_COND(p_render_buffers.is_null()); - Ref<RenderBufferDataForwardClustered> rb_data = p_render_buffers->get_custom_data(RB_SCOPE_FORWARD_CLUSTERED); - ERR_FAIL_COND(rb_data.is_null()); - - if (rb_data->ss_effects_data.ssil.last_frame.is_valid()) { + if (p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_LAST_FRAME)) { Size2i size = p_render_buffers->get_internal_size(); - RID texture = p_render_buffers->get_internal_texture(); - copy_effects->copy_to_rect(texture, rb_data->ss_effects_data.ssil.last_frame, Rect2i(0, 0, size.x, size.y)); - - int width = size.x; - int height = size.y; - for (int i = 0; i < rb_data->ss_effects_data.ssil.last_frame_slices.size() - 1; i++) { - width = MAX(1, width >> 1); - height = MAX(1, height >> 1); - copy_effects->make_mipmap(rb_data->ss_effects_data.ssil.last_frame_slices[i], rb_data->ss_effects_data.ssil.last_frame_slices[i + 1], Size2i(width, height)); + uint32_t mipmaps = p_render_buffers->get_texture_format(RB_SCOPE_SSIL, RB_LAST_FRAME).mipmaps; + for (uint32_t v = 0; v < p_render_buffers->get_view_count(); v++) { + RID source = p_render_buffers->get_internal_texture(v); + RID dest = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, v, 0); + copy_effects->copy_to_rect(source, dest, Rect2i(0, 0, size.x, size.y)); + + int width = size.x; + int height = size.y; + for (uint32_t m = 1; m < mipmaps; m++) { + width = MAX(1, width >> 1); + height = MAX(1, height >> 1); + + source = dest; + dest = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_LAST_FRAME, v, m); + + copy_effects->make_mipmap(source, dest, Size2i(width, height)); + } } } } @@ -1421,41 +1424,23 @@ void RenderForwardClustered::_pre_opaque_render(RenderDataRD *p_render_data, boo } if (rb_data.is_valid() && ss_effects) { - if (p_use_ssao || p_use_ssil) { - Size2i size = rb->get_internal_size(); + // Note, in multiview we're allocating buffers for each eye/view we're rendering. + // This should allow most of the processing to happen in parallel even if we're doing + // drawcalls per eye/view. It will all sync up at the barrier. - bool invalidate_uniform_set = false; - if (rb_data->ss_effects_data.linear_depth.is_null()) { - RD::TextureFormat tf; - tf.format = RD::DATA_FORMAT_R16_SFLOAT; - tf.texture_type = RD::TEXTURE_TYPE_2D_ARRAY; - tf.width = (size.x + 1) / 2; - tf.height = (size.y + 1) / 2; - tf.mipmaps = 5; - tf.array_layers = 4; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; - rb_data->ss_effects_data.linear_depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - RD::get_singleton()->set_resource_name(rb_data->ss_effects_data.linear_depth, "SS Effects Depth"); - for (uint32_t i = 0; i < tf.mipmaps; i++) { - RID slice = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb_data->ss_effects_data.linear_depth, 0, i, 1, RD::TEXTURE_SLICE_2D_ARRAY); - rb_data->ss_effects_data.linear_depth_slices.push_back(slice); - RD::get_singleton()->set_resource_name(slice, "SS Effects Depth Mip " + itos(i) + " "); - } - invalidate_uniform_set = true; + if (p_use_ssao || p_use_ssil) { + // Convert our depth buffer data to linear data in + for (uint32_t v = 0; v < rb->get_view_count(); v++) { + ss_effects->downsample_depth(rb, v, p_render_data->scene_data->view_projection[v]); } - RID depth_texture = rb->get_depth_texture(); - ss_effects->downsample_depth(depth_texture, rb_data->ss_effects_data.linear_depth_slices, invalidate_uniform_set, size, p_render_data->scene_data->cam_projection); - } - - if (p_use_ssao) { - // TODO make these proper stereo - _process_ssao(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection); - } + if (p_use_ssao) { + _process_ssao(rb, p_render_data->environment, p_normal_roughness_slices, p_render_data->scene_data->view_projection); + } - if (p_use_ssil) { - // TODO make these proper stereo - _process_ssil(rb, p_render_data->environment, p_normal_roughness_slices[0], p_render_data->scene_data->cam_projection, p_render_data->scene_data->cam_transform); + if (p_use_ssil) { + _process_ssil(rb, p_render_data->environment, p_normal_roughness_slices, p_render_data->scene_data->view_projection, p_render_data->scene_data->cam_transform); + } } } @@ -1514,17 +1499,11 @@ void RenderForwardClustered::_process_ssr(Ref<RenderSceneBuffersRD> p_render_buf ERR_FAIL_COND(p_environment.is_null()); ERR_FAIL_COND(!environment_get_ssr_enabled(p_environment)); - Size2i half_size = Size2i(internal_size.x / 2, internal_size.y / 2); - ss_effects->ssr_allocate_buffers(rb_data->ss_effects_data.ssr, _render_buffers_get_color_format(), half_size, view_count); + ss_effects->ssr_allocate_buffers(p_render_buffers, rb_data->ss_effects_data.ssr, _render_buffers_get_color_format()); + ss_effects->screen_space_reflection(p_render_buffers, rb_data->ss_effects_data.ssr, p_normal_slices, p_metallic_slices, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), p_projections, p_eye_offsets); - RID texture_slices[RendererSceneRender::MAX_RENDER_VIEWS]; - RID depth_slices[RendererSceneRender::MAX_RENDER_VIEWS]; - for (uint32_t v = 0; v < view_count; v++) { - texture_slices[v] = p_render_buffers->get_internal_texture(v); - depth_slices[v] = p_render_buffers->get_depth_texture(v); - } - ss_effects->screen_space_reflection(rb_data->ss_effects_data.ssr, texture_slices, p_normal_slices, p_metallic_slices, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), view_count, p_projections, p_eye_offsets); - copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), rb_data->ss_effects_data.ssr.output, view_count); + RID output = p_render_buffers->get_texture(RB_SCOPE_SSR, RB_OUTPUT); + copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : p_render_buffers->get_internal_texture(), output, view_count); } void RenderForwardClustered::_process_sss(Ref<RenderSceneBuffersRD> p_render_buffers, const Projection &p_camera) { @@ -2129,14 +2108,16 @@ void RenderForwardClustered::_render_buffers_debug_draw(Ref<RenderSceneBuffersRD RID render_target = p_render_buffers->get_render_target(); - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSAO && rb_data->ss_effects_data.ssao.ao_final.is_valid()) { + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSAO && p_render_buffers->has_texture(RB_SCOPE_SSAO, RB_FINAL)) { + RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSAO, RB_FINAL, 0, 0); Size2i rtsize = texture_storage->render_target_get_size(render_target); - copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssao.ao_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true); + copy_effects->copy_to_fb_rect(final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, true); } - if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSIL && rb_data->ss_effects_data.ssil.ssil_final.is_valid()) { + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SSIL && p_render_buffers->has_texture(RB_SCOPE_SSIL, RB_FINAL)) { + RID final = p_render_buffers->get_texture_slice(RB_SCOPE_SSIL, RB_FINAL, 0, 0); Size2i rtsize = texture_storage->render_target_get_size(render_target); - copy_effects->copy_to_fb_rect(rb_data->ss_effects_data.ssil.ssil_final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false); + copy_effects->copy_to_fb_rect(final, texture_storage->render_target_get_rd_framebuffer(render_target), Rect2(Vector2(), rtsize), false, false); } if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_GI_BUFFER && p_render_buffers->has_texture(RB_SCOPE_GI, RB_TEX_AMBIENT)) { @@ -3058,7 +3039,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend RD::Uniform u; u.binding = 13; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID aot = rb_data.is_valid() ? rb_data->get_ao_texture() : RID(); + RID aot = rb.is_valid() && rb->has_texture(RB_SCOPE_SSAO, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSAO, RB_FINAL) : RID(); RID texture = aot.is_valid() ? aot : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); u.append_id(texture); uniforms.push_back(u); @@ -3144,7 +3125,7 @@ RID RenderForwardClustered::_setup_render_pass_uniform_set(RenderListType p_rend RD::Uniform u; u.binding = 20; u.uniform_type = RD::UNIFORM_TYPE_TEXTURE; - RID ssil = rb_data.is_valid() ? rb_data->get_ssil_texture() : RID(); + RID ssil = rb.is_valid() && rb->has_texture(RB_SCOPE_SSIL, RB_FINAL) ? rb->get_texture(RB_SCOPE_SSIL, RB_FINAL) : RID(); RID texture = ssil.is_valid() ? ssil : texture_storage->texture_rd_get_default(RendererRD::TextureStorage::DEFAULT_RD_TEXTURE_BLACK); u.append_id(texture); uniforms.push_back(u); diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index 8eb17ba6f4..e07d2f2258 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -104,16 +104,11 @@ class RenderForwardClustered : public RendererSceneRenderRD { ClusterBuilderRD *cluster_builder = nullptr; struct SSEffectsData { - RID linear_depth; - Vector<RID> linear_depth_slices; - - RID downsample_uniform_set; - - Projection last_frame_projection; + Projection last_frame_projections[RendererSceneRender::MAX_RENDER_VIEWS]; Transform3D last_frame_transform; - RendererRD::SSEffects::SSAORenderBuffers ssao; RendererRD::SSEffects::SSILRenderBuffers ssil; + RendererRD::SSEffects::SSAORenderBuffers ssao; RendererRD::SSEffects::SSRRenderBuffers ssr; } ss_effects_data; @@ -155,9 +150,6 @@ class RenderForwardClustered : public RendererSceneRenderRD { RID get_depth_fb(DepthFrameBufferType p_type = DEPTH_FB); RID get_specular_only_fb(); - RID get_ao_texture() const { return ss_effects_data.ssao.ao_final; } - RID get_ssil_texture() const { return ss_effects_data.ssil.ssil_final; } - virtual void configure(RenderSceneBuffersRD *p_render_buffers) override; virtual void free_data() override; }; @@ -600,8 +592,8 @@ class RenderForwardClustered : public RendererSceneRenderRD { void _render_shadow_end(uint32_t p_barrier = RD::BARRIER_MASK_ALL_BARRIERS); /* Render Scene */ - void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection); - void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, RID p_normal_buffer, const Projection &p_projection, const Transform3D &p_transform); + void _process_ssao(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections); + void _process_ssil(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_environment, const RID *p_normal_buffers, const Projection *p_projections, const Transform3D &p_transform); void _copy_framebuffer_to_ssil(Ref<RenderSceneBuffersRD> p_render_buffers); void _pre_opaque_render(RenderDataRD *p_render_data, bool p_use_ssao, bool p_use_ssil, bool p_use_gi, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer); void _process_ssr(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_dest_framebuffer, const RID *p_normal_buffer_slices, RID p_specular_buffer, const RID *p_metallic_slices, RID p_environment, const Projection *p_projections, const Vector3 *p_eye_offsets, bool p_use_additive); diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index f9529de6dd..45fe067a6f 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -30,6 +30,7 @@ #include "render_forward_mobile.h" #include "core/config/project_settings.h" +#include "core/object/worker_thread_pool.h" #include "servers/rendering/renderer_rd/storage_rd/light_storage.h" #include "servers/rendering/renderer_rd/storage_rd/mesh_storage.h" #include "servers/rendering/renderer_rd/storage_rd/particles_storage.h" diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 5776414b14..efd961fd89 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -1110,6 +1110,8 @@ float RendererSceneRenderRD::screen_space_roughness_limiter_get_limit() const { } TypedArray<Image> RendererSceneRenderRD::bake_render_uv2(RID p_base, const TypedArray<RID> &p_material_overrides, const Size2i &p_image_size) { + ERR_FAIL_COND_V_MSG(p_image_size.width <= 0, TypedArray<Image>(), "Image width must be greater than 0."); + ERR_FAIL_COND_V_MSG(p_image_size.height <= 0, TypedArray<Image>(), "Image height must be greater than 0."); RD::TextureFormat tf; tf.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; tf.width = p_image_size.width; // Always 64x64 diff --git a/servers/rendering/renderer_rd/shader_rd.cpp b/servers/rendering/renderer_rd/shader_rd.cpp index 533a912a34..c85ece6366 100644 --- a/servers/rendering/renderer_rd/shader_rd.cpp +++ b/servers/rendering/renderer_rd/shader_rd.cpp @@ -33,6 +33,7 @@ #include "core/io/compression.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" +#include "core/object/worker_thread_pool.h" #include "core/version.h" #include "renderer_compositor_rd.h" #include "servers/rendering/rendering_device.h" diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 21fa7fa148..c8ad1f0312 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -1390,7 +1390,11 @@ void fragment_shader(in SceneData scene_data) { #endif // !USE_LIGHTMAP if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSAO)) { +#ifdef USE_MULTIVIEW + float ssao = texture(sampler2DArray(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), vec3(screen_uv, ViewIndex)).r; +#else float ssao = texture(sampler2D(ao_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv).r; +#endif ao = min(ao, ssao); ao_light_affect = mix(ao_light_affect, max(ao_light_affect, implementation_data.ssao_light_affect), implementation_data.ssao_ao_affect); } @@ -1473,7 +1477,11 @@ void fragment_shader(in SceneData scene_data) { ambient_light *= ao; if (bool(implementation_data.ss_effects_flags & SCREEN_SPACE_EFFECTS_FLAGS_USE_SSIL)) { +#ifdef USE_MULTIVIEW + vec4 ssil = textureLod(sampler2DArray(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), vec3(screen_uv, ViewIndex), 0.0); +#else vec4 ssil = textureLod(sampler2D(ssil_buffer, material_samplers[SAMPLER_LINEAR_CLAMP]), screen_uv, 0.0); +#endif // USE_MULTIVIEW ambient_light *= 1.0 - ssil.a; ambient_light += ssil.rgb * albedo.rgb; } diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl index 8ff7a784dc..043bba1e4e 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered_inc.glsl @@ -275,6 +275,7 @@ layout(r32ui, set = 1, binding = 13) uniform restrict uimage3D geom_facing_grid; layout(set = 1, binding = 10) uniform texture2DArray depth_buffer; layout(set = 1, binding = 11) uniform texture2DArray color_buffer; layout(set = 1, binding = 12) uniform texture2DArray normal_roughness_buffer; +layout(set = 1, binding = 13) uniform texture2DArray ao_buffer; layout(set = 1, binding = 14) uniform texture2DArray ambient_buffer; layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer; #define multiviewSampler sampler2DArray @@ -282,11 +283,11 @@ layout(set = 1, binding = 15) uniform texture2DArray reflection_buffer; layout(set = 1, binding = 10) uniform texture2D depth_buffer; layout(set = 1, binding = 11) uniform texture2D color_buffer; layout(set = 1, binding = 12) uniform texture2D normal_roughness_buffer; +layout(set = 1, binding = 13) uniform texture2D ao_buffer; layout(set = 1, binding = 14) uniform texture2D ambient_buffer; layout(set = 1, binding = 15) uniform texture2D reflection_buffer; #define multiviewSampler sampler2D #endif -layout(set = 1, binding = 13) uniform texture2D ao_buffer; layout(set = 1, binding = 16) uniform texture2DArray sdfgi_lightprobe_texture; layout(set = 1, binding = 17) uniform texture3D sdfgi_occlusion_cascades; @@ -312,7 +313,11 @@ voxel_gi_instances; layout(set = 1, binding = 19) uniform texture3D volumetric_fog_texture; +#ifdef USE_MULTIVIEW +layout(set = 1, binding = 20) uniform texture2DArray ssil_buffer; +#else layout(set = 1, binding = 20) uniform texture2D ssil_buffer; +#endif // USE_MULTIVIEW #endif diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index d631a89dd2..6f67d628a9 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -2803,6 +2803,7 @@ void MaterialStorage::material_set_render_priority(RID p_material, int priority) if (material->data) { material->data->set_render_priority(priority); } + material->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_MATERIAL); } bool MaterialStorage::material_is_animated(RID p_material) { diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index 7d2cd12959..813c1fa4ff 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -31,6 +31,7 @@ #include "renderer_scene_cull.h" #include "core/config/project_settings.h" +#include "core/object/worker_thread_pool.h" #include "core/os/os.h" #include "rendering_server_default.h" #include "rendering_server_globals.h" diff --git a/servers/rendering/renderer_viewport.cpp b/servers/rendering/renderer_viewport.cpp index aecd0593bc..0e2a3c682d 100644 --- a/servers/rendering/renderer_viewport.cpp +++ b/servers/rendering/renderer_viewport.cpp @@ -31,6 +31,7 @@ #include "renderer_viewport.h" #include "core/config/project_settings.h" +#include "core/object/worker_thread_pool.h" #include "renderer_canvas_cull.h" #include "renderer_scene_cull.h" #include "rendering_server_globals.h" @@ -229,6 +230,7 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { bool scenario_draw_canvas_bg = false; //draw canvas, or some layer of it, as BG for 3D instead of in front int scenario_canvas_max_layer = 0; + bool force_clear_render_target = false; for (int i = 0; i < RS::VIEWPORT_RENDER_INFO_TYPE_MAX; i++) { for (int j = 0; j < RS::VIEWPORT_RENDER_INFO_MAX; j++) { @@ -236,11 +238,16 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { } } - if (!p_viewport->disable_2d && !viewport_is_environment_disabled(p_viewport) && RSG::scene->is_scenario(p_viewport->scenario)) { + if (RSG::scene->is_scenario(p_viewport->scenario)) { RID environment = RSG::scene->scenario_get_environment(p_viewport->scenario); if (RSG::scene->is_environment(environment)) { - scenario_draw_canvas_bg = RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS; - scenario_canvas_max_layer = RSG::scene->environment_get_canvas_max_layer(environment); + if (!p_viewport->disable_2d && !viewport_is_environment_disabled(p_viewport)) { + scenario_draw_canvas_bg = RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS; + scenario_canvas_max_layer = RSG::scene->environment_get_canvas_max_layer(environment); + } else if (RSG::scene->environment_get_background(environment) == RS::ENV_BG_CANVAS) { + // The scene renderer will still copy over the last frame, so we need to clear the render target. + force_clear_render_target = true; + } } } @@ -263,6 +270,9 @@ void RendererViewport::_draw_viewport(Viewport *p_viewport) { } if (!scenario_draw_canvas_bg && can_draw_3d) { + if (force_clear_render_target) { + RSG::texture_storage->render_target_do_clear_request(p_viewport->render_target); + } _draw_3d(p_viewport); } @@ -844,7 +854,7 @@ void RendererViewport::viewport_set_scaling_3d_scale(RID p_viewport, float p_sca } void RendererViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) { - ERR_FAIL_COND(p_width < 0 && p_height < 0); + ERR_FAIL_COND(p_width < 0 || p_height < 0); Viewport *viewport = viewport_owner.get_or_null(p_viewport); ERR_FAIL_COND(!viewport); diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 28f872761a..286d1b683f 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -746,7 +746,7 @@ void RenderingDevice::_bind_methods() { ClassDB::bind_method(D_METHOD("buffer_update", "buffer", "offset", "size_bytes", "data", "post_barrier"), &RenderingDevice::_buffer_update, DEFVAL(BARRIER_MASK_ALL_BARRIERS)); ClassDB::bind_method(D_METHOD("buffer_clear", "buffer", "offset", "size_bytes", "post_barrier"), &RenderingDevice::buffer_clear, DEFVAL(BARRIER_MASK_ALL_BARRIERS)); - ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer"), &RenderingDevice::buffer_get_data); + ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer", "offset_bytes", "size_bytes"), &RenderingDevice::buffer_get_data, DEFVAL(0), DEFVAL(0)); ClassDB::bind_method(D_METHOD("render_pipeline_create", "shader", "framebuffer_format", "vertex_format", "primitive", "rasterization_state", "multisample_state", "stencil_state", "color_blend_state", "dynamic_state_flags", "for_render_pass", "specialization_constants"), &RenderingDevice::_render_pipeline_create, DEFVAL(0), DEFVAL(0), DEFVAL(TypedArray<RDPipelineSpecializationConstant>())); ClassDB::bind_method(D_METHOD("render_pipeline_is_valid", "render_pipeline"), &RenderingDevice::render_pipeline_is_valid); diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 9117669124..447627b08e 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -828,7 +828,7 @@ public: virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS) = 0; virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS) = 0; - virtual Vector<uint8_t> buffer_get_data(RID p_buffer) = 0; //this causes stall, only use to retrieve large buffers for saving + virtual Vector<uint8_t> buffer_get_data(RID p_buffer, uint32_t p_offset = 0, uint32_t p_size = 0) = 0; // This causes stall, only use to retrieve large buffers for saving. /******************************************/ /**** PIPELINE SPECIALIZATION CONSTANT ****/ diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 4f52a63b2f..a3bdf7d146 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -31,6 +31,7 @@ #ifndef RENDERING_SERVER_DEFAULT_H #define RENDERING_SERVER_DEFAULT_H +#include "core/os/thread.h" #include "core/templates/command_queue_mt.h" #include "core/templates/hash_map.h" #include "renderer_canvas_cull.h" diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index 2710724066..8737d3b217 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -1151,6 +1151,9 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene bool is_texture_func = false; bool is_screen_texture = false; + bool texture_func_no_uv = false; + bool texture_func_returns_data = false; + if (onode->op == SL::OP_STRUCT) { code += _mkid(vnode->name); } else if (onode->op == SL::OP_CONSTRUCT) { @@ -1164,6 +1167,8 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene if (is_internal_func) { code += vnode->name; is_texture_func = texture_functions.has(vnode->name); + texture_func_no_uv = (vnode->name == "textureSize" || vnode->name == "textureQueryLevels"); + texture_func_returns_data = texture_func_no_uv || vnode->name == "textureQueryLod"; } else if (p_default_actions.renames.has(vnode->name)) { code += p_default_actions.renames[vnode->name]; } else { @@ -1313,7 +1318,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } else { code += node_code; } - } else if (multiview_uv_needed && i == 2) { + } else if (multiview_uv_needed && !texture_func_no_uv && i == 2) { // UV coordinate after using color, depth or normal roughness texture. node_code = "multiview_uv(" + node_code + ".xy)"; @@ -1323,7 +1328,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } } code += ")"; - if (is_screen_texture && actions.apply_luminance_multiplier) { + if (is_screen_texture && !texture_func_returns_data && actions.apply_luminance_multiplier) { code = "(" + code + " * vec4(vec3(sc_luminance_multiplier), 1.0))"; } } break; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 848b6d01d4..3d0443b494 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -31,6 +31,7 @@ #include "rendering_server.h" #include "core/config/project_settings.h" +#include "core/object/worker_thread_pool.h" #include "core/variant/typed_array.h" #include "servers/rendering/rendering_server_globals.h" #include "servers/rendering/shader_language.h" @@ -2855,8 +2856,8 @@ RenderingServer::RenderingServer() { } void RenderingServer::init() { - GLOBAL_DEF_RST("rendering/textures/vram_compression/import_s3tc_bptc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_S3TC_BPTC); - GLOBAL_DEF_RST("rendering/textures/vram_compression/import_etc2_astc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_ETC2_ASTC); + GLOBAL_DEF_RST_NOVAL_BASIC("rendering/textures/vram_compression/import_s3tc_bptc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_S3TC_BPTC); + GLOBAL_DEF_RST_NOVAL_BASIC("rendering/textures/vram_compression/import_etc2_astc", OS::get_singleton()->get_preferred_texture_format() == OS::PREFERRED_TEXTURE_FORMAT_ETC2_ASTC); GLOBAL_DEF("rendering/textures/lossless_compression/force_png", false); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 1f9bff7c3f..b53b7d2ff9 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -35,7 +35,6 @@ #include "core/math/geometry_3d.h" #include "core/math/transform_2d.h" #include "core/object/class_db.h" -#include "core/object/worker_thread_pool.h" #include "core/templates/rid.h" #include "core/variant/typed_array.h" #include "core/variant/variant.h" diff --git a/tests/core/math/test_vector3.h b/tests/core/math/test_vector3.h index c3488954ce..ca0aa02882 100644 --- a/tests/core/math/test_vector3.h +++ b/tests/core/math/test_vector3.h @@ -354,6 +354,14 @@ TEST_CASE("[Vector3] Other methods") { CHECK_MESSAGE( vector.snapped(Vector3(0.25, 0.25, 0.25)) == Vector3(1.25, 3.5, 5.5), "Vector3 snapped to 0.25 should give exact results."); + + CHECK_MESSAGE( + Vector3(1.2, 2.5, 2.0).is_equal_approx(vector.min(Vector3(3.0, 2.5, 2.0))), + "Vector3 min should return expected value."); + + CHECK_MESSAGE( + Vector3(5.3, 3.4, 5.6).is_equal_approx(vector.max(Vector3(5.3, 2.0, 3.0))), + "Vector3 max should return expected value."); } TEST_CASE("[Vector3] Plane methods") { diff --git a/tests/core/math/test_vector3i.h b/tests/core/math/test_vector3i.h index 6eef129a36..485a500715 100644 --- a/tests/core/math/test_vector3i.h +++ b/tests/core/math/test_vector3i.h @@ -131,6 +131,13 @@ TEST_CASE("[Vector3i] Other methods") { const Vector3i vector = Vector3i(1, 3, -7); CHECK_MESSAGE( + vector.min(Vector3i(3, 2, 5)) == Vector3i(1, 2, -7), + "Vector3i min should return expected value."); + CHECK_MESSAGE( + vector.max(Vector3i(5, 2, 4)) == Vector3i(5, 3, 4), + "Vector3i max should return expected value."); + + CHECK_MESSAGE( vector.snapped(Vector3i(4, 2, 5)) == Vector3i(0, 4, -5), "Vector3i snapped should work as expected."); } diff --git a/tests/core/math/test_vector4.h b/tests/core/math/test_vector4.h index b85cc710e0..331e0fcfd5 100644 --- a/tests/core/math/test_vector4.h +++ b/tests/core/math/test_vector4.h @@ -255,6 +255,14 @@ TEST_CASE("[Vector4] Other methods") { CHECK_MESSAGE( vector.snapped(Vector4(0.25, 0.25, 0.25, 0.25)) == Vector4(1.25, 3.5, 5.5, 1.5), "Vector4 snapped to 0.25 should give exact results."); + + CHECK_MESSAGE( + Vector4(1.2, 2.5, 2.0, 1.6).is_equal_approx(vector.min(Vector4(3.0, 2.5, 2.0, 3.4))), + "Vector4 min should return expected value."); + + CHECK_MESSAGE( + Vector4(5.3, 3.4, 5.6, 4.2).is_equal_approx(vector.max(Vector4(5.3, 2.0, 3.0, 4.2))), + "Vector4 max should return expected value."); } TEST_CASE("[Vector4] Rounding methods") { diff --git a/tests/core/math/test_vector4i.h b/tests/core/math/test_vector4i.h index e5b47af7c4..5fda6f1778 100644 --- a/tests/core/math/test_vector4i.h +++ b/tests/core/math/test_vector4i.h @@ -134,6 +134,14 @@ TEST_CASE("[Vector3i] Other methods") { const Vector4i vector = Vector4i(1, 3, -7, 13); CHECK_MESSAGE( + vector.min(Vector4i(3, 2, 5, 8)) == Vector4i(1, 2, -7, 8), + "Vector4i min should return expected value."); + + CHECK_MESSAGE( + vector.max(Vector4i(5, 2, 4, 8)) == Vector4i(5, 3, 4, 13), + "Vector4i max should return expected value."); + + CHECK_MESSAGE( vector.snapped(Vector4i(4, 2, 5, 8)) == Vector4i(0, 4, -5, 16), "Vector4i snapped should work as expected."); } diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index 0cf3448a48..5d19b5a164 100644 --- a/tests/core/string/test_string.h +++ b/tests/core/string/test_string.h @@ -512,6 +512,14 @@ TEST_CASE("[String] Splitting") { CHECK(l[i] == slices_3[i]); } + s = ""; + l = s.split(); + CHECK(l.size() == 1); + CHECK(l[0] == ""); + + l = s.split("", false); + CHECK(l.size() == 0); + s = "Mars Jupiter Saturn Uranus"; const char *slices_s[4] = { "Mars", "Jupiter", "Saturn", "Uranus" }; l = s.split_spaces(); diff --git a/tests/display_server_mock.h b/tests/display_server_mock.h index 1736f2c452..fe36fa0b69 100644 --- a/tests/display_server_mock.h +++ b/tests/display_server_mock.h @@ -42,6 +42,7 @@ private: friend class DisplayServer; Point2i mouse_position = Point2i(-1, -1); // Outside of Window. + CursorShape cursor_shape = CursorShape::CURSOR_ARROW; bool window_over = false; Callable event_callback; Callable input_event_callback; @@ -103,6 +104,7 @@ public: bool has_feature(Feature p_feature) const override { switch (p_feature) { case FEATURE_MOUSE: + case FEATURE_CURSOR_SHAPE: return true; default: { } @@ -115,12 +117,24 @@ public: // You can simulate DisplayServer-events by calling this function. // The events will be deliverd to Godot's Input-system. // Mouse-events (Button & Motion) will additionally update the DisplayServer's mouse position. + // For Mouse motion events, the `relative`-property is set based on the distance to the previous mouse position. void simulate_event(Ref<InputEvent> p_event) { + Ref<InputEvent> event = p_event; Ref<InputEventMouse> me = p_event; if (me.is_valid()) { + Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid()) { + mm->set_relative(mm->get_position() - mouse_position); + event = mm; + } _set_mouse_position(me->get_position()); } - Input::get_singleton()->parse_input_event(p_event); + Input::get_singleton()->parse_input_event(event); + } + + // Returns the current cursor shape. + CursorShape get_cursor_shape() { + return cursor_shape; } virtual Point2i mouse_get_position() const override { return mouse_position; } @@ -129,6 +143,10 @@ public: return Size2i(1920, 1080); } + virtual void cursor_set_shape(CursorShape p_shape) override { + cursor_shape = p_shape; + } + virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID) override { event_callback = p_callable; } diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h index d42ef8859a..64ad3bd5b0 100644 --- a/tests/scene/test_text_edit.h +++ b/tests/scene/test_text_edit.h @@ -1134,7 +1134,6 @@ TEST_CASE("[SceneTree][TextEdit] text entry") { SUBCASE("[TextEdit] text drag") { TextEdit *target_text_edit = memnew(TextEdit); SceneTree::get_singleton()->get_root()->add_child(target_text_edit); - text_edit->get_viewport()->set_embedding_subwindows(true); // Bypass display server for drop handling. target_text_edit->set_size(Size2(200, 200)); target_text_edit->set_position(Point2(400, 0)); @@ -3083,8 +3082,6 @@ TEST_CASE("[SceneTree][TextEdit] context menu") { TextEdit *text_edit = memnew(TextEdit); SceneTree::get_singleton()->get_root()->add_child(text_edit); - text_edit->get_viewport()->set_embedding_subwindows(true); // Bypass display server for drop handling. - text_edit->set_size(Size2(800, 200)); text_edit->set_line(0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vasius mattis leo, sed porta ex lacinia bibendum. Nunc bibendum pellentesque."); MessageQueue::get_singleton()->flush(); diff --git a/tests/scene/test_viewport.h b/tests/scene/test_viewport.h new file mode 100644 index 0000000000..62f4635927 --- /dev/null +++ b/tests/scene/test_viewport.h @@ -0,0 +1,718 @@ +/**************************************************************************/ +/* test_viewport.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_VIEWPORT_H +#define TEST_VIEWPORT_H + +#include "scene/2d/node_2d.h" +#include "scene/gui/control.h" +#include "scene/main/window.h" + +#include "tests/test_macros.h" + +namespace TestViewport { + +class NotificationControl : public Control { + GDCLASS(NotificationControl, Control); + +protected: + void _notification(int p_what) { + switch (p_what) { + case NOTIFICATION_MOUSE_ENTER: { + mouse_over = true; + } break; + + case NOTIFICATION_MOUSE_EXIT: { + mouse_over = false; + } break; + } + } + +public: + bool mouse_over = false; +}; + +// `NotificationControl`-derived class that additionally +// - allows start Dragging +// - stores mouse information of last event +class DragStart : public NotificationControl { + GDCLASS(DragStart, NotificationControl); + +public: + MouseButton last_mouse_button; + Point2i last_mouse_move_position; + StringName drag_data_name = SNAME("Drag Data"); + + virtual Variant get_drag_data(const Point2 &p_point) override { + return drag_data_name; + } + + virtual void gui_input(const Ref<InputEvent> &p_event) override { + Ref<InputEventMouseButton> mb = p_event; + if (mb.is_valid()) { + last_mouse_button = mb->get_button_index(); + return; + } + + Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid()) { + last_mouse_move_position = mm->get_position(); + return; + } + } +}; + +// `NotificationControl`-derived class that acts as a Drag and Drop target. +class DragTarget : public NotificationControl { + GDCLASS(DragTarget, NotificationControl); + +public: + Variant drag_data; + virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override { + StringName string_data = p_data; + // Verify drag data is compatible. + if (string_data != SNAME("Drag Data")) { + return false; + } + // Only the left half is droppable area. + if (p_point.x * 2 > get_size().x) { + return false; + } + return true; + } + + virtual void drop_data(const Point2 &p_point, const Variant &p_data) override { + drag_data = p_data; + } +}; + +TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") { + DragStart *node_a = memnew(DragStart); + Control *node_b = memnew(Control); + Node2D *node_c = memnew(Node2D); + DragTarget *node_d = memnew(DragTarget); + Control *node_e = memnew(Control); + Node *node_f = memnew(Node); + Control *node_g = memnew(Control); + + node_a->set_name(SNAME("NodeA")); + node_b->set_name(SNAME("NodeB")); + node_c->set_name(SNAME("NodeC")); + node_d->set_name(SNAME("NodeD")); + node_e->set_name(SNAME("NodeE")); + node_f->set_name(SNAME("NodeF")); + node_g->set_name(SNAME("NodeG")); + + node_a->set_position(Point2i(0, 0)); + node_b->set_position(Point2i(10, 10)); + node_c->set_position(Point2i(0, 0)); + node_d->set_position(Point2i(10, 10)); + node_e->set_position(Point2i(10, 100)); + node_g->set_position(Point2i(10, 100)); + node_a->set_size(Point2i(30, 30)); + node_b->set_size(Point2i(30, 30)); + node_d->set_size(Point2i(30, 30)); + node_e->set_size(Point2i(10, 10)); + node_g->set_size(Point2i(10, 10)); + node_a->set_focus_mode(Control::FOCUS_CLICK); + node_b->set_focus_mode(Control::FOCUS_CLICK); + node_d->set_focus_mode(Control::FOCUS_CLICK); + node_e->set_focus_mode(Control::FOCUS_CLICK); + node_g->set_focus_mode(Control::FOCUS_CLICK); + Window *root = SceneTree::get_singleton()->get_root(); + DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton()); + + // Scene tree: + // - root + // - a (Control) + // - b (Control) + // - c (Node2D) + // - d (Control) + // - e (Control) + // - f (Node) + // - g (Control) + root->add_child(node_a); + root->add_child(node_b); + node_b->add_child(node_c); + node_c->add_child(node_d); + root->add_child(node_e); + node_e->add_child(node_f); + node_f->add_child(node_g); + + Point2i on_a = Point2i(5, 5); + Point2i on_b = Point2i(15, 15); + Point2i on_d = Point2i(25, 25); + Point2i on_e = Point2i(15, 105); + Point2i on_g = Point2i(15, 105); + Point2i on_background = Point2i(500, 500); + Point2i on_outside = Point2i(-1, -1); + + // Unit tests for Viewport::gui_find_control and Viewport::_gui_find_control_at_pos + SUBCASE("[VIEWPORT][GuiFindControl] Finding Controls at a Viewport-position") { + // FIXME: It is extremely difficult to create a situation where the Control has a zero determinant. + // Leaving that if-branch untested. + + SUBCASE("[VIEWPORT][GuiFindControl] Basic position tests") { + CHECK(root->gui_find_control(on_a) == node_a); + CHECK(root->gui_find_control(on_b) == node_b); + CHECK(root->gui_find_control(on_d) == node_d); + CHECK(root->gui_find_control(on_e) == node_g); // Node F makes G a Root Control at the same position as E + CHECK(root->gui_find_control(on_g) == node_g); + CHECK_FALSE(root->gui_find_control(on_background)); + } + + SUBCASE("[VIEWPORT][GuiFindControl] Invisible nodes are not considered as results.") { + // Non-Root Control + node_d->hide(); + CHECK(root->gui_find_control(on_d) == node_b); + // Root Control + node_b->hide(); + CHECK(root->gui_find_control(on_b) == node_a); + } + + SUBCASE("[VIEWPORT][GuiFindControl] Root Control with CanvasItem as parent is affected by parent's transform.") { + node_b->remove_child(node_c); + node_c->set_position(Point2i(50, 50)); + root->add_child(node_c); + CHECK(root->gui_find_control(Point2i(65, 65)) == node_d); + } + + SUBCASE("[VIEWPORT][GuiFindControl] Control Contents Clipping clips accessible position of children.") { + CHECK_FALSE(node_b->is_clipping_contents()); + CHECK(root->gui_find_control(on_d + Point2i(20, 20)) == node_d); + node_b->set_clip_contents(true); + CHECK(root->gui_find_control(on_d) == node_d); + CHECK_FALSE(root->gui_find_control(on_d + Point2i(20, 20))); + } + + SUBCASE("[VIEWPORT][GuiFindControl] Top Level Control as descendant of CanvasItem isn't affected by parent's transform.") { + CHECK(root->gui_find_control(on_d + Point2i(20, 20)) == node_d); + node_d->set_as_top_level(true); + CHECK_FALSE(root->gui_find_control(on_d + Point2i(20, 20))); + CHECK(root->gui_find_control(on_b) == node_d); + } + } + + SUBCASE("[Viewport][GuiInputEvent] nullptr as argument doesn't lead to a crash.") { + CHECK_NOTHROW(root->push_input(nullptr)); + } + + // Unit tests for Viewport::_gui_input_event (Mouse Buttons) + SUBCASE("[Viewport][GuiInputEvent] Mouse Button Down/Up.") { + SUBCASE("[Viewport][GuiInputEvent] Mouse Button Control Focus Change.") { + SUBCASE("[Viewport][GuiInputEvent] Grab Focus while no Control has focus.") { + CHECK_FALSE(root->gui_get_focus_owner()); + + // Click on A + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_a->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + } + + SUBCASE("[Viewport][GuiInputEvent] Grab Focus from other Control.") { + node_a->grab_focus(); + CHECK(node_a->has_focus()); + + // Click on D + SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_d->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + } + + SUBCASE("[Viewport][GuiInputEvent] Non-CanvasItem breaks Transform hierarchy.") { + CHECK_FALSE(root->gui_get_focus_owner()); + + // Click on G absolute coordinates + SEND_GUI_MOUSE_BUTTON_EVENT(Point2i(15, 105), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_g->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(Point2i(15, 105), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + } + + SUBCASE("[Viewport][GuiInputEvent] No Focus change when clicking in background.") { + CHECK_FALSE(root->gui_get_focus_owner()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_get_focus_owner()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + + node_a->grab_focus(); + CHECK(node_a->has_focus()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->has_focus()); + } + + SUBCASE("[Viewport][GuiInputEvent] Mouse Button No Focus Steal while other Mouse Button is pressed.") { + CHECK_FALSE(root->gui_get_focus_owner()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_a->has_focus()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::RIGHT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE); + CHECK(node_a->has_focus()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::RIGHT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->has_focus()); + } + + SUBCASE("[Viewport][GuiInputEvent] Allow Focus Steal with LMB while other Mouse Button is held down and was initially pressed without being over a Control.") { + // TODO: Not sure, if this is intended behavior, but this is an edge case. + CHECK_FALSE(root->gui_get_focus_owner()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_background, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE); + CHECK_FALSE(root->gui_get_focus_owner()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE); + CHECK(node_a->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::RIGHT, Key::NONE); + CHECK(node_a->has_focus()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, (int)MouseButtonMask::LEFT | (int)MouseButtonMask::RIGHT, Key::NONE); + CHECK(node_b->has_focus()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::RIGHT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_b->has_focus()); + } + + SUBCASE("[Viewport][GuiInputEvent] Ignore Focus from Mouse Buttons when mouse-filter is set to ignore.") { + node_d->grab_focus(); + node_d->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); + CHECK(node_d->has_focus()); + + // Click on overlapping area B&D. + SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_b->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + } + + SUBCASE("[Viewport][GuiInputEvent] RMB doesn't grab focus.") { + node_a->grab_focus(); + CHECK(node_a->has_focus()); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->has_focus()); + } + + SUBCASE("[Viewport][GuiInputEvent] LMB on unfocusable Control doesn't grab focus.") { + CHECK_FALSE(node_g->has_focus()); + node_g->set_focus_mode(Control::FOCUS_NONE); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(node_g->has_focus()); + + // Now verify the opposite with FOCUS_CLICK + node_g->set_focus_mode(Control::FOCUS_CLICK); + SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_g->has_focus()); + node_g->set_focus_mode(Control::FOCUS_CLICK); + } + + SUBCASE("[Viewport][GuiInputEvent] Signal 'gui_focus_changed' is only emitted if a previously unfocused Control grabs focus.") { + SIGNAL_WATCH(root, SNAME("gui_focus_changed")); + Array node_array; + node_array.push_back(node_a); + Array signal_args; + signal_args.push_back(node_array); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + SIGNAL_CHECK(SNAME("gui_focus_changed"), signal_args); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->has_focus()); + SIGNAL_CHECK_FALSE(SNAME("gui_focus_changed")); + + SIGNAL_UNWATCH(root, SNAME("gui_focus_changed")); + } + + SUBCASE("[Viewport][GuiInputEvent] Focus Propagation to parent items.") { + SUBCASE("[Viewport][GuiInputEvent] Unfocusable Control with MOUSE_FILTER_PASS propagates focus to parent CanvasItem.") { + node_d->set_focus_mode(Control::FOCUS_NONE); + node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_d + Point2i(20, 20), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK(node_b->has_focus()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d + Point2i(20, 20), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + + // Verify break condition for Root Control. + node_a->set_focus_mode(Control::FOCUS_NONE); + node_a->set_mouse_filter(Control::MOUSE_FILTER_PASS); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_b->has_focus()); + } + + SUBCASE("[Viewport][GuiInputEvent] Top Level CanvasItem stops focus propagation.") { + node_d->set_focus_mode(Control::FOCUS_NONE); + node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS); + node_c->set_as_top_level(true); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_get_focus_owner()); + + node_d->set_focus_mode(Control::FOCUS_CLICK); + SEND_GUI_MOUSE_BUTTON_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_b, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_d->has_focus()); + } + } + } + + SUBCASE("[Viewport][GuiInputEvent] Process-Mode affects, if GUI Mouse Button Events are processed.") { + node_a->last_mouse_button = MouseButton::NONE; + node_a->set_process_mode(Node::PROCESS_MODE_DISABLED); + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->last_mouse_button == MouseButton::NONE); + + // Now verify that with allowed processing the event is processed. + node_a->set_process_mode(Node::PROCESS_MODE_ALWAYS); + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->last_mouse_button == MouseButton::LEFT); + } + } + + // Unit tests for Viewport::_gui_input_event (Mouse Motion) + SUBCASE("[Viewport][GuiInputEvent] Mouse Motion") { + // FIXME: Tooltips are not yet tested. They likely require an internal clock. + + SUBCASE("[Viewport][GuiInputEvent] Mouse Motion changes the Control, that it is over.") { + SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(node_a->mouse_over); + + // Move over Control. + SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->mouse_over); + + // No change. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(1, 1), MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->mouse_over); + + // Move over other Control. + SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(node_a->mouse_over); + CHECK(node_d->mouse_over); + + // Move to background + SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(node_d->mouse_over); + } + + SUBCASE("[Viewport][GuiInputEvent] Window Mouse Enter/Exit signals.") { + SIGNAL_WATCH(root, SNAME("mouse_entered")); + SIGNAL_WATCH(root, SNAME("mouse_exited")); + Array signal_args; + signal_args.push_back(Array()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_outside, MouseButtonMask::NONE, Key::NONE); + SIGNAL_CHECK_FALSE(SNAME("mouse_entered")); + SIGNAL_CHECK(SNAME("mouse_exited"), signal_args); + + SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE); + SIGNAL_CHECK(SNAME("mouse_entered"), signal_args); + SIGNAL_CHECK_FALSE(SNAME("mouse_exited")); + + SIGNAL_UNWATCH(root, SNAME("mouse_entered")); + SIGNAL_UNWATCH(root, SNAME("mouse_exited")); + } + + SUBCASE("[Viewport][GuiInputEvent] Process-Mode affects, if GUI Mouse Motion Events are processed.") { + node_a->last_mouse_move_position = on_outside; + node_a->set_process_mode(Node::PROCESS_MODE_DISABLED); + SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->last_mouse_move_position == on_outside); + + // Now verify that with allowed processing the event is processed. + node_a->set_process_mode(Node::PROCESS_MODE_ALWAYS); + SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE); + CHECK(node_a->last_mouse_move_position == on_a); + } + } + + // Unit tests for Viewport::_gui_input_event (Drag and Drop) + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop") { + // FIXME: Drag-Preview will likely change. Tests for this part would have to be rewritten anyway. + // See https://github.com/godotengine/godot/pull/67531#issuecomment-1385353430 for details. + // FIXME: Testing Drag and Drop with non-embedded windows would require DisplayServerMock additions + // FIXME: Drag and Drop currently doesn't work with embedded Windows and SubViewports - not testing. + // See https://github.com/godotengine/godot/issues/28522 for example. + int min_grab_movement = 11; + SUBCASE("[Viewport][GuiInputEvent] Drag from one Control to another in the same viewport.") { + SUBCASE("[Viewport][GuiInputEvent] Perform successful Drag and Drop on a different Control.") { + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + // Move above a Control, that is a Drop target and allows dropping at this point. + SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_CAN_DROP); + + CHECK(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK(root->gui_is_drag_successful()); + CHECK((StringName)node_d->drag_data == SNAME("Drag Data")); + } + + SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop on Control.") { + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + // Move, but don't trigger DnD yet. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement - 1), MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + // Move and trigger DnD. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + // Move above a Control, that is not a Drop target. + SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_FORBIDDEN); + + // Move above a Control, that is a Drop target, but has disallowed this point. + SEND_GUI_MOUSE_MOTION_EVENT(on_d + Point2i(20, 0), MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_FORBIDDEN); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d + Point2i(20, 0), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + } + + SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop on No-Control.") { + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + // Move, but don't trigger DnD yet. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement - 1, 0), MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + // Move and trigger DnD. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + // Move away from Controls. + SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW); // This could also be CURSOR_FORBIDDEN. + + CHECK(root->gui_is_dragging()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + } + + SUBCASE("[Viewport][GuiInputEvent] Perform unsuccessful drop outside of window.") { + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + // Move and trigger DnD. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_CAN_DROP); + + // Move outside of window. + SEND_GUI_MOUSE_MOTION_EVENT(on_outside, MouseButtonMask::LEFT, Key::NONE); + CHECK(DS->get_cursor_shape() == DisplayServer::CURSOR_ARROW); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_outside, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop doesn't work with other Mouse Buttons than LMB.") { + SEND_GUI_MOUSE_BUTTON_EVENT(on_a, MouseButton::MIDDLE, MouseButtonMask::MIDDLE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(min_grab_movement, 0), MouseButtonMask::MIDDLE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::MIDDLE, MouseButtonMask::NONE, Key::NONE); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop parent propagation.") { + Node2D *node_aa = memnew(Node2D); + Control *node_aaa = memnew(Control); + Node2D *node_dd = memnew(Node2D); + Control *node_ddd = memnew(Control); + node_aaa->set_size(Size2i(10, 10)); + node_aaa->set_position(Point2i(0, 5)); + node_ddd->set_size(Size2i(10, 10)); + node_ddd->set_position(Point2i(0, 5)); + node_a->add_child(node_aa); + node_aa->add_child(node_aaa); + node_d->add_child(node_dd); + node_dd->add_child(node_ddd); + Point2i on_aaa = on_a + Point2i(-2, 2); + Point2i on_ddd = on_d + Point2i(-2, 2); + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop propagation to parent Controls.") { + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS); + node_ddd->set_mouse_filter(Control::MOUSE_FILTER_PASS); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_ddd, MouseButtonMask::LEFT, Key::NONE); + + CHECK(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_ddd, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK(root->gui_is_drag_successful()); + + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP); + node_ddd->set_mouse_filter(Control::MOUSE_FILTER_STOP); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop grab-propagation stopped by Top Level.") { + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS); + node_aaa->set_as_top_level(true); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + node_aaa->set_as_top_level(false); + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop target-propagation stopped by Top Level.") { + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_PASS); + node_ddd->set_mouse_filter(Control::MOUSE_FILTER_PASS); + node_ddd->set_as_top_level(true); + node_ddd->set_position(Point2i(30, 100)); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_aaa, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_aaa + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(Point2i(35, 105), MouseButtonMask::LEFT, Key::NONE); + + CHECK(root->gui_is_dragging()); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(Point2i(35, 105), MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK_FALSE(root->gui_is_drag_successful()); + + node_ddd->set_position(Point2i(0, 5)); + node_ddd->set_as_top_level(false); + node_aaa->set_mouse_filter(Control::MOUSE_FILTER_STOP); + node_ddd->set_mouse_filter(Control::MOUSE_FILTER_STOP); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop grab-propagation stopped by non-CanvasItem.") { + node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_MOTION_EVENT(on_g + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_background, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + node_g->set_mouse_filter(Control::MOUSE_FILTER_STOP); + } + + SUBCASE("[Viewport][GuiInputEvent] Drag and Drop target-propagation stopped by non-CanvasItem.") { + node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS); + + SEND_GUI_MOUSE_BUTTON_EVENT(on_a - Point2i(1, 1), MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); // Offset for node_aaa. + SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(0, min_grab_movement), MouseButtonMask::LEFT, Key::NONE); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_g, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_g, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + + node_g->set_mouse_filter(Control::MOUSE_FILTER_STOP); + } + + memdelete(node_ddd); + memdelete(node_dd); + memdelete(node_aaa); + memdelete(node_aa); + } + + SUBCASE("[Viewport][GuiInputEvent] Force Drag and Drop.") { + SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + node_a->force_drag(SNAME("Drag Data"), nullptr); + CHECK(root->gui_is_dragging()); + + SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE); + + // Force Drop doesn't get triggered by mouse Buttons other than LMB. + SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::RIGHT, MouseButtonMask::RIGHT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_a, MouseButton::RIGHT, MouseButtonMask::NONE, Key::NONE); + CHECK(root->gui_is_dragging()); + + // Force Drop with LMB-Down. + SEND_GUI_MOUSE_BUTTON_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + CHECK_FALSE(root->gui_is_dragging()); + CHECK(root->gui_is_drag_successful()); + + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(on_d, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); + } + } + } + + memdelete(node_g); + memdelete(node_f); + memdelete(node_e); + memdelete(node_d); + memdelete(node_c); + memdelete(node_b); + memdelete(node_a); +} + +} // namespace TestViewport + +#endif // TEST_VIEWPORT_H diff --git a/tests/test_macros.h b/tests/test_macros.h index 9fd95465f6..5d1bcdecf4 100644 --- a/tests/test_macros.h +++ b/tests/test_macros.h @@ -209,7 +209,6 @@ int register_test_command(String p_command, TestFunc p_function); event.instantiate(); \ event->set_position(m_screen_pos); \ event->set_button_mask(m_mask); \ - event->set_relative(Vector2(10, 10)); \ _UPDATE_EVENT_MODIFERS(event, m_modifers); \ _SEND_DISPLAYSERVER_EVENT(event); \ MessageQueue::get_singleton()->flush(); \ diff --git a/tests/test_main.cpp b/tests/test_main.cpp index ea6058f707..e029ea7190 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -101,6 +101,7 @@ #include "tests/scene/test_sprite_frames.h" #include "tests/scene/test_text_edit.h" #include "tests/scene/test_theme.h" +#include "tests/scene/test_viewport.h" #include "tests/scene/test_visual_shader.h" #include "tests/servers/test_text_server.h" #include "tests/test_validate_testing.h" @@ -233,6 +234,9 @@ struct GodotTestCaseListener : public doctest::IReporter { memnew(SceneTree); SceneTree::get_singleton()->initialize(); + if (!DisplayServer::get_singleton()->has_feature(DisplayServer::Feature::FEATURE_SUBWINDOWS)) { + SceneTree::get_singleton()->get_root()->set_embedding_subwindows(true); + } return; } diff --git a/thirdparty/README.md b/thirdparty/README.md index 38ace2c2e3..f883a3a6da 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -346,7 +346,7 @@ Files extracted from upstream source: ## libwebp - Upstream: https://chromium.googlesource.com/webm/libwebp/ -- Version: 1.2.4 (0d1f12546bd803099a60c070517a552483f3790e, 2022) +- Version: 1.3.0 (b557776962a3dcc985d83bd4ed94e1e2e50d0fa2, 2022) - License: BSD-3-Clause Files extracted from upstream source: diff --git a/thirdparty/libwebp/AUTHORS b/thirdparty/libwebp/AUTHORS index 3efcbe25b6..2f0c537d1c 100644 --- a/thirdparty/libwebp/AUTHORS +++ b/thirdparty/libwebp/AUTHORS @@ -11,11 +11,13 @@ Contributors: - Djordje Pesut (djordje dot pesut at imgtec dot com) - Frank Barchard (fbarchard at google dot com) - Hui Su (huisu at google dot com) +- H. Vetinari (h dot vetinari at gmx dot com) - Ilya Kurdyukov (jpegqs at gmail dot com) - Ingvar Stepanyan (rreverser at google dot com) - James Zern (jzern at google dot com) - Jan Engelhardt (jengelh at medozas dot de) - Jehan (jehan at girinstud dot io) +- Jeremy Maitin-Shepard (jbms at google dot com) - Johann Koenig (johann dot koenig at duck dot com) - Jovan Zelincevic (jovan dot zelincevic at imgtec dot com) - Jyrki Alakuijala (jyrki at google dot com) diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv.c b/thirdparty/libwebp/sharpyuv/sharpyuv.c index 8b3ab7216b..7de34fb0b2 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv.c @@ -15,16 +15,22 @@ #include <assert.h> #include <limits.h> -#include <math.h> +#include <stddef.h> #include <stdlib.h> #include <string.h> #include "src/webp/types.h" -#include "src/dsp/cpu.h" +#include "sharpyuv/sharpyuv_cpu.h" #include "sharpyuv/sharpyuv_dsp.h" #include "sharpyuv/sharpyuv_gamma.h" //------------------------------------------------------------------------------ + +int SharpYuvGetVersion(void) { + return SHARPYUV_VERSION; +} + +//------------------------------------------------------------------------------ // Sharp RGB->YUV conversion static const int kNumIterations = 4; @@ -414,24 +420,45 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr, } #undef SAFE_ALLOC +#if defined(WEBP_USE_THREAD) && !defined(_WIN32) +#include <pthread.h> // NOLINT + +#define LOCK_ACCESS \ + static pthread_mutex_t sharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; \ + if (pthread_mutex_lock(&sharpyuv_lock)) return +#define UNLOCK_ACCESS_AND_RETURN \ + do { \ + (void)pthread_mutex_unlock(&sharpyuv_lock); \ + return; \ + } while (0) +#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32)) +#define LOCK_ACCESS do {} while (0) +#define UNLOCK_ACCESS_AND_RETURN return +#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32) + // Hidden exported init function. -// By default SharpYuvConvert calls it with NULL. If needed, users can declare -// it as extern and call it with a VP8CPUInfo function. -extern void SharpYuvInit(VP8CPUInfo cpu_info_func); +// By default SharpYuvConvert calls it with SharpYuvGetCPUInfo. If needed, +// users can declare it as extern and call it with an alternate VP8CPUInfo +// function. +SHARPYUV_EXTERN void SharpYuvInit(VP8CPUInfo cpu_info_func); void SharpYuvInit(VP8CPUInfo cpu_info_func) { static volatile VP8CPUInfo sharpyuv_last_cpuinfo_used = (VP8CPUInfo)&sharpyuv_last_cpuinfo_used; - const int initialized = - (sharpyuv_last_cpuinfo_used != (VP8CPUInfo)&sharpyuv_last_cpuinfo_used); - if (cpu_info_func == NULL && initialized) return; - if (sharpyuv_last_cpuinfo_used == cpu_info_func) return; - - SharpYuvInitDsp(cpu_info_func); - if (!initialized) { - SharpYuvInitGammaTables(); + LOCK_ACCESS; + // Only update SharpYuvGetCPUInfo when called from external code to avoid a + // race on reading the value in SharpYuvConvert(). + if (cpu_info_func != (VP8CPUInfo)&SharpYuvGetCPUInfo) { + SharpYuvGetCPUInfo = cpu_info_func; + } + if (sharpyuv_last_cpuinfo_used == SharpYuvGetCPUInfo) { + UNLOCK_ACCESS_AND_RETURN; } - sharpyuv_last_cpuinfo_used = cpu_info_func; + SharpYuvInitDsp(); + SharpYuvInitGammaTables(); + + sharpyuv_last_cpuinfo_used = SharpYuvGetCPUInfo; + UNLOCK_ACCESS_AND_RETURN; } int SharpYuvConvert(const void* r_ptr, const void* g_ptr, @@ -467,7 +494,8 @@ int SharpYuvConvert(const void* r_ptr, const void* g_ptr, // Stride should be even for uint16_t buffers. return 0; } - SharpYuvInit(NULL); + // The address of the function pointer is used to avoid a read race. + SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo); // Add scaling factor to go from rgb_bit_depth to yuv_bit_depth, to the // rgb->yuv conversion matrix. diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv.h b/thirdparty/libwebp/sharpyuv/sharpyuv.h index 9386ea2185..181b20a0bc 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv.h +++ b/thirdparty/libwebp/sharpyuv/sharpyuv.h @@ -12,15 +12,31 @@ #ifndef WEBP_SHARPYUV_SHARPYUV_H_ #define WEBP_SHARPYUV_SHARPYUV_H_ -#include <inttypes.h> - #ifdef __cplusplus extern "C" { #endif +#ifndef SHARPYUV_EXTERN +#ifdef WEBP_EXTERN +#define SHARPYUV_EXTERN WEBP_EXTERN +#else +// This explicitly marks library functions and allows for changing the +// signature for e.g., Windows DLL builds. +#if defined(__GNUC__) && __GNUC__ >= 4 +#define SHARPYUV_EXTERN extern __attribute__((visibility("default"))) +#else +#if defined(_MSC_VER) && defined(WEBP_DLL) +#define SHARPYUV_EXTERN __declspec(dllexport) +#else +#define SHARPYUV_EXTERN extern +#endif /* _MSC_VER && WEBP_DLL */ +#endif /* __GNUC__ >= 4 */ +#endif /* WEBP_EXTERN */ +#endif /* SHARPYUV_EXTERN */ + // SharpYUV API version following the convention from semver.org #define SHARPYUV_VERSION_MAJOR 0 -#define SHARPYUV_VERSION_MINOR 1 +#define SHARPYUV_VERSION_MINOR 2 #define SHARPYUV_VERSION_PATCH 0 // Version as a uint32_t. The major number is the high 8 bits. // The minor number is the middle 8 bits. The patch number is the low 16 bits. @@ -30,6 +46,10 @@ extern "C" { SHARPYUV_MAKE_VERSION(SHARPYUV_VERSION_MAJOR, SHARPYUV_VERSION_MINOR, \ SHARPYUV_VERSION_PATCH) +// Returns the library's version number, packed in hexadecimal. See +// SHARPYUV_VERSION. +SHARPYUV_EXTERN int SharpYuvGetVersion(void); + // RGB to YUV conversion matrix, in 16 bit fixed point. // y = rgb_to_y[0] * r + rgb_to_y[1] * g + rgb_to_y[2] * b + rgb_to_y[3] // u = rgb_to_u[0] * r + rgb_to_u[1] * g + rgb_to_u[2] * b + rgb_to_u[3] @@ -65,11 +85,13 @@ typedef struct { // adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they // should be multiples of 2. // width, height: width and height of the image in pixels -int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr, - int rgb_step, int rgb_stride, int rgb_bit_depth, - void* y_ptr, int y_stride, void* u_ptr, int u_stride, - void* v_ptr, int v_stride, int yuv_bit_depth, int width, - int height, const SharpYuvConversionMatrix* yuv_matrix); +SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr, + const void* b_ptr, int rgb_step, + int rgb_stride, int rgb_bit_depth, + void* y_ptr, int y_stride, void* u_ptr, + int u_stride, void* v_ptr, int v_stride, + int yuv_bit_depth, int width, int height, + const SharpYuvConversionMatrix* yuv_matrix); // TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422 // support (it's rarely used in practice, especially for images). diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c new file mode 100644 index 0000000000..29425a0c49 --- /dev/null +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.c @@ -0,0 +1,14 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +#include "sharpyuv/sharpyuv_cpu.h" + +// Include src/dsp/cpu.c to create SharpYuvGetCPUInfo from VP8GetCPUInfo. The +// function pointer is renamed in sharpyuv_cpu.h. +#include "src/dsp/cpu.c" diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h new file mode 100644 index 0000000000..176ca3eb16 --- /dev/null +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_cpu.h @@ -0,0 +1,22 @@ +// Copyright 2022 Google Inc. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the COPYING file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// ----------------------------------------------------------------------------- +// +#ifndef WEBP_SHARPYUV_SHARPYUV_CPU_H_ +#define WEBP_SHARPYUV_SHARPYUV_CPU_H_ + +#include "sharpyuv/sharpyuv.h" + +// Avoid exporting SharpYuvGetCPUInfo in shared object / DLL builds. +// SharpYuvInit() replaces the use of the function pointer. +#undef WEBP_EXTERN +#define WEBP_EXTERN extern +#define VP8GetCPUInfo SharpYuvGetCPUInfo +#include "src/dsp/cpu.h" + +#endif // WEBP_SHARPYUV_SHARPYUV_CPU_H_ diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c index 5334fa64fa..0ad22be945 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.c @@ -13,7 +13,7 @@ #include <assert.h> #include <math.h> -#include <string.h> +#include <stddef.h> static int ToFixed16(float f) { return (int)floor(f * (1 << 16) + 0.5f); } diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h index 63c99ef5cd..3214e3ac60 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_csp.h @@ -35,8 +35,9 @@ typedef struct { } SharpYuvColorSpace; // Fills in 'matrix' for the given YUVColorSpace. -void SharpYuvComputeConversionMatrix(const SharpYuvColorSpace* yuv_color_space, - SharpYuvConversionMatrix* matrix); +SHARPYUV_EXTERN void SharpYuvComputeConversionMatrix( + const SharpYuvColorSpace* yuv_color_space, + SharpYuvConversionMatrix* matrix); // Enums for precomputed conversion matrices. typedef enum { @@ -49,7 +50,7 @@ typedef enum { } SharpYuvMatrixType; // Returns a pointer to a matrix for one of the predefined colorspaces. -const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( +SHARPYUV_EXTERN const SharpYuvConversionMatrix* SharpYuvGetConversionMatrix( SharpYuvMatrixType matrix_type); #ifdef __cplusplus diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c index 956fa7ce55..31c272c408 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.c @@ -16,7 +16,7 @@ #include <assert.h> #include <stdlib.h> -#include "src/dsp/cpu.h" +#include "sharpyuv/sharpyuv_cpu.h" //----------------------------------------------------------------------------- @@ -75,23 +75,24 @@ void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len, extern void InitSharpYuvSSE2(void); extern void InitSharpYuvNEON(void); -void SharpYuvInitDsp(VP8CPUInfo cpu_info_func) { - (void)cpu_info_func; - +void SharpYuvInitDsp(void) { #if !WEBP_NEON_OMIT_C_CODE SharpYuvUpdateY = SharpYuvUpdateY_C; SharpYuvUpdateRGB = SharpYuvUpdateRGB_C; SharpYuvFilterRow = SharpYuvFilterRow_C; #endif + if (SharpYuvGetCPUInfo != NULL) { #if defined(WEBP_HAVE_SSE2) - if (cpu_info_func == NULL || cpu_info_func(kSSE2)) { - InitSharpYuvSSE2(); - } + if (SharpYuvGetCPUInfo(kSSE2)) { + InitSharpYuvSSE2(); + } #endif // WEBP_HAVE_SSE2 + } #if defined(WEBP_HAVE_NEON) - if (WEBP_NEON_OMIT_C_CODE || cpu_info_func == NULL || cpu_info_func(kNEON)) { + if (WEBP_NEON_OMIT_C_CODE || + (SharpYuvGetCPUInfo != NULL && SharpYuvGetCPUInfo(kNEON))) { InitSharpYuvNEON(); } #endif // WEBP_HAVE_NEON diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h index e561d8d3d0..805fbadbf6 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_dsp.h @@ -12,9 +12,8 @@ #ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_ #define WEBP_SHARPYUV_SHARPYUV_DSP_H_ -#include <stdint.h> - -#include "src/dsp/cpu.h" +#include "sharpyuv/sharpyuv_cpu.h" +#include "src/webp/types.h" extern uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref, uint16_t* dst, int len, int bit_depth); @@ -24,6 +23,6 @@ extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len, const uint16_t* best_y, uint16_t* out, int bit_depth); -void SharpYuvInitDsp(VP8CPUInfo cpu_info_func); +void SharpYuvInitDsp(void); #endif // WEBP_SHARPYUV_SHARPYUV_DSP_H_ diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c index 05b5436f83..20ab2da6bc 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.c @@ -13,7 +13,6 @@ #include <assert.h> #include <math.h> -#include <stdint.h> #include "src/webp/types.h" diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h index 2f1a3ff4a0..d13aff59e1 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_gamma.h @@ -12,7 +12,7 @@ #ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_ #define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_ -#include <stdint.h> +#include "src/webp/types.h" #ifdef __cplusplus extern "C" { diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c b/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c index 5cf6aaffb0..5840914865 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_neon.c @@ -17,11 +17,6 @@ #include <assert.h> #include <stdlib.h> #include <arm_neon.h> -#endif - -extern void InitSharpYuvNEON(void); - -#if defined(WEBP_USE_NEON) static uint16_t clip_NEON(int v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; @@ -169,6 +164,8 @@ static void SharpYuvFilterRow_NEON(const int16_t* A, const int16_t* B, int len, //------------------------------------------------------------------------------ +extern void InitSharpYuvNEON(void); + WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) { SharpYuvUpdateY = SharpYuvUpdateY_NEON; SharpYuvUpdateRGB = SharpYuvUpdateRGB_NEON; @@ -177,6 +174,8 @@ WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvNEON(void) { #else // !WEBP_USE_NEON +extern void InitSharpYuvNEON(void); + void InitSharpYuvNEON(void) {} #endif // WEBP_USE_NEON diff --git a/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c b/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c index 1943873748..9744d1bb6c 100644 --- a/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c +++ b/thirdparty/libwebp/sharpyuv/sharpyuv_sse2.c @@ -16,11 +16,6 @@ #if defined(WEBP_USE_SSE2) #include <stdlib.h> #include <emmintrin.h> -#endif - -extern void InitSharpYuvSSE2(void); - -#if defined(WEBP_USE_SSE2) static uint16_t clip_SSE2(int v, int max) { return (v < 0) ? 0 : (v > max) ? max : (uint16_t)v; @@ -199,6 +194,8 @@ WEBP_TSAN_IGNORE_FUNCTION void InitSharpYuvSSE2(void) { } #else // !WEBP_USE_SSE2 +extern void InitSharpYuvSSE2(void); + void InitSharpYuvSSE2(void) {} #endif // WEBP_USE_SSE2 diff --git a/thirdparty/libwebp/src/dec/vp8i_dec.h b/thirdparty/libwebp/src/dec/vp8i_dec.h index 30c1bd3ef9..83791ecd25 100644 --- a/thirdparty/libwebp/src/dec/vp8i_dec.h +++ b/thirdparty/libwebp/src/dec/vp8i_dec.h @@ -31,8 +31,8 @@ extern "C" { // version numbers #define DEC_MAJ_VERSION 1 -#define DEC_MIN_VERSION 2 -#define DEC_REV_VERSION 4 +#define DEC_MIN_VERSION 3 +#define DEC_REV_VERSION 0 // YUV-cache parameters. Cache is 32-bytes wide (= one cacheline). // Constraints are: We need to store one 16x16 block of luma samples (y), diff --git a/thirdparty/libwebp/src/dec/vp8l_dec.c b/thirdparty/libwebp/src/dec/vp8l_dec.c index 1348055128..c0ea0181e5 100644 --- a/thirdparty/libwebp/src/dec/vp8l_dec.c +++ b/thirdparty/libwebp/src/dec/vp8l_dec.c @@ -1336,7 +1336,7 @@ static int ReadTransform(int* const xsize, int const* ysize, ok = ok && ExpandColorMap(num_colors, transform); break; } - case SUBTRACT_GREEN: + case SUBTRACT_GREEN_TRANSFORM: break; default: assert(0); // can't happen diff --git a/thirdparty/libwebp/src/dec/webp_dec.c b/thirdparty/libwebp/src/dec/webp_dec.c index 77a54c55d2..3f4f7bb659 100644 --- a/thirdparty/libwebp/src/dec/webp_dec.c +++ b/thirdparty/libwebp/src/dec/webp_dec.c @@ -179,7 +179,7 @@ static VP8StatusCode ParseOptionalChunks(const uint8_t** const data, return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size. } // For odd-sized chunk-payload, there's one byte padding at the end. - disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1; + disk_chunk_size = (CHUNK_HEADER_SIZE + chunk_size + 1) & ~1u; total_size += disk_chunk_size; // Check that total bytes skipped so far does not exceed riff_size. diff --git a/thirdparty/libwebp/src/demux/demux.c b/thirdparty/libwebp/src/demux/demux.c index 41387ec2d6..324e5eb993 100644 --- a/thirdparty/libwebp/src/demux/demux.c +++ b/thirdparty/libwebp/src/demux/demux.c @@ -24,8 +24,8 @@ #include "src/webp/format_constants.h" #define DMUX_MAJ_VERSION 1 -#define DMUX_MIN_VERSION 2 -#define DMUX_REV_VERSION 4 +#define DMUX_MIN_VERSION 3 +#define DMUX_REV_VERSION 0 typedef struct { size_t start_; // start location of the data diff --git a/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c b/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c index a5f8c9f7c7..f0843d0feb 100644 --- a/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c +++ b/thirdparty/libwebp/src/dsp/alpha_processing_sse2.c @@ -26,8 +26,8 @@ static int DispatchAlpha_SSE2(const uint8_t* WEBP_RESTRICT alpha, uint32_t alpha_and = 0xff; int i, j; const __m128i zero = _mm_setzero_si128(); - const __m128i rgb_mask = _mm_set1_epi32(0xffffff00u); // to preserve RGB - const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u); + const __m128i rgb_mask = _mm_set1_epi32((int)0xffffff00); // to preserve RGB + const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte @@ -106,8 +106,8 @@ static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride, // value is not 0xff if any of the alpha[] is not equal to 0xff. uint32_t alpha_and = 0xff; int i, j; - const __m128i a_mask = _mm_set1_epi32(0xffu); // to preserve alpha - const __m128i all_0xff = _mm_set_epi32(0, 0, ~0u, ~0u); + const __m128i a_mask = _mm_set1_epi32(0xff); // to preserve alpha + const __m128i all_0xff = _mm_set_epi32(0, 0, ~0, ~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte @@ -178,7 +178,7 @@ static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride, static void ApplyAlphaMultiply_SSE2(uint8_t* rgba, int alpha_first, int w, int h, int stride) { const __m128i zero = _mm_setzero_si128(); - const __m128i kMult = _mm_set1_epi16(0x8081u); + const __m128i kMult = _mm_set1_epi16((short)0x8081); const __m128i kMask = _mm_set_epi16(0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0); const int kSpan = 4; while (h-- > 0) { @@ -267,7 +267,7 @@ static int HasAlpha32b_SSE2(const uint8_t* src, int length) { } static void AlphaReplace_SSE2(uint32_t* src, int length, uint32_t color) { - const __m128i m_color = _mm_set1_epi32(color); + const __m128i m_color = _mm_set1_epi32((int)color); const __m128i zero = _mm_setzero_si128(); int i = 0; for (; i + 8 <= length; i += 8) { diff --git a/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c b/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c index cdf877ce49..1156ac3417 100644 --- a/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c +++ b/thirdparty/libwebp/src/dsp/alpha_processing_sse41.c @@ -26,7 +26,7 @@ static int ExtractAlpha_SSE41(const uint8_t* WEBP_RESTRICT argb, // value is not 0xff if any of the alpha[] is not equal to 0xff. uint32_t alpha_and = 0xff; int i, j; - const __m128i all_0xff = _mm_set1_epi32(~0u); + const __m128i all_0xff = _mm_set1_epi32(~0); __m128i all_alphas = all_0xff; // We must be able to access 3 extra bytes after the last written byte diff --git a/thirdparty/libwebp/src/dsp/cpu.c b/thirdparty/libwebp/src/dsp/cpu.c index a4ba7f2cb7..62de73f750 100644 --- a/thirdparty/libwebp/src/dsp/cpu.c +++ b/thirdparty/libwebp/src/dsp/cpu.c @@ -212,7 +212,7 @@ VP8CPUInfo VP8GetCPUInfo = wasmCPUInfo; #elif defined(WEBP_HAVE_NEON) // In most cases this function doesn't check for NEON support (it's assumed by // the configuration), but enables turning off NEON at runtime, for testing -// purposes, by setting VP8DecGetCPUInfo = NULL. +// purposes, by setting VP8GetCPUInfo = NULL. static int armCPUInfo(CPUFeature feature) { if (feature != kNEON) return 0; #if defined(__linux__) && defined(WEBP_HAVE_NEON_RTCD) diff --git a/thirdparty/libwebp/src/dsp/cpu.h b/thirdparty/libwebp/src/dsp/cpu.h index 57a40d87d4..be80727c0d 100644 --- a/thirdparty/libwebp/src/dsp/cpu.h +++ b/thirdparty/libwebp/src/dsp/cpu.h @@ -14,6 +14,8 @@ #ifndef WEBP_DSP_CPU_H_ #define WEBP_DSP_CPU_H_ +#include <stddef.h> + #ifdef HAVE_CONFIG_H #include "src/webp/config.h" #endif diff --git a/thirdparty/libwebp/src/dsp/dec_sse2.c b/thirdparty/libwebp/src/dsp/dec_sse2.c index 873aa59e8a..01e6bcb636 100644 --- a/thirdparty/libwebp/src/dsp/dec_sse2.c +++ b/thirdparty/libwebp/src/dsp/dec_sse2.c @@ -158,10 +158,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) { dst3 = _mm_loadl_epi64((__m128i*)(dst + 3 * BPS)); } else { // Load four bytes/pixels per line. - dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS)); - dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS)); - dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS)); - dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS)); + dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS)); + dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS)); + dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS)); + dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS)); } // Convert to 16b. dst0 = _mm_unpacklo_epi8(dst0, zero); @@ -187,10 +187,10 @@ static void Transform_SSE2(const int16_t* in, uint8_t* dst, int do_two) { _mm_storel_epi64((__m128i*)(dst + 3 * BPS), dst3); } else { // Store four bytes/pixels per line. - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); } } } @@ -213,10 +213,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) { const __m128i m3 = _mm_subs_epi16(B, d4); const __m128i zero = _mm_setzero_si128(); // Load the source pixels. - __m128i dst0 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 0 * BPS)); - __m128i dst1 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 1 * BPS)); - __m128i dst2 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 2 * BPS)); - __m128i dst3 = _mm_cvtsi32_si128(WebPMemToUint32(dst + 3 * BPS)); + __m128i dst0 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 0 * BPS)); + __m128i dst1 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 1 * BPS)); + __m128i dst2 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 2 * BPS)); + __m128i dst3 = _mm_cvtsi32_si128(WebPMemToInt32(dst + 3 * BPS)); // Convert to 16b. dst0 = _mm_unpacklo_epi8(dst0, zero); dst1 = _mm_unpacklo_epi8(dst1, zero); @@ -233,10 +233,10 @@ static void TransformAC3(const int16_t* in, uint8_t* dst) { dst2 = _mm_packus_epi16(dst2, dst2); dst3 = _mm_packus_epi16(dst3, dst3); // Store the results. - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(dst0)); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(dst1)); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(dst2)); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(dst3)); } #undef MUL #endif // USE_TRANSFORM_AC3 @@ -477,11 +477,11 @@ static WEBP_INLINE void Load8x4_SSE2(const uint8_t* const b, int stride, // A0 = 63 62 61 60 23 22 21 20 43 42 41 40 03 02 01 00 // A1 = 73 72 71 70 33 32 31 30 53 52 51 50 13 12 11 10 const __m128i A0 = _mm_set_epi32( - WebPMemToUint32(&b[6 * stride]), WebPMemToUint32(&b[2 * stride]), - WebPMemToUint32(&b[4 * stride]), WebPMemToUint32(&b[0 * stride])); + WebPMemToInt32(&b[6 * stride]), WebPMemToInt32(&b[2 * stride]), + WebPMemToInt32(&b[4 * stride]), WebPMemToInt32(&b[0 * stride])); const __m128i A1 = _mm_set_epi32( - WebPMemToUint32(&b[7 * stride]), WebPMemToUint32(&b[3 * stride]), - WebPMemToUint32(&b[5 * stride]), WebPMemToUint32(&b[1 * stride])); + WebPMemToInt32(&b[7 * stride]), WebPMemToInt32(&b[3 * stride]), + WebPMemToInt32(&b[5 * stride]), WebPMemToInt32(&b[1 * stride])); // B0 = 53 43 52 42 51 41 50 40 13 03 12 02 11 01 10 00 // B1 = 73 63 72 62 71 61 70 60 33 23 32 22 31 21 30 20 @@ -540,7 +540,7 @@ static WEBP_INLINE void Store4x4_SSE2(__m128i* const x, uint8_t* dst, int stride) { int i; for (i = 0; i < 4; ++i, dst += stride) { - WebPUint32ToMem(dst, _mm_cvtsi128_si32(*x)); + WebPInt32ToMem(dst, _mm_cvtsi128_si32(*x)); *x = _mm_srli_si128(*x, 4); } } @@ -908,10 +908,10 @@ static void VE4_SSE2(uint8_t* dst) { // vertical const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one); const __m128i b = _mm_subs_epu8(a, lsb); const __m128i avg = _mm_avg_epu8(b, BCDEFGH0); - const uint32_t vals = _mm_cvtsi128_si32(avg); + const int vals = _mm_cvtsi128_si32(avg); int i; for (i = 0; i < 4; ++i) { - WebPUint32ToMem(dst + i * BPS, vals); + WebPInt32ToMem(dst + i * BPS, vals); } } @@ -925,10 +925,10 @@ static void LD4_SSE2(uint8_t* dst) { // Down-Left const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static void VR4_SSE2(uint8_t* dst) { // Vertical-Right @@ -946,10 +946,10 @@ static void VR4_SSE2(uint8_t* dst) { // Vertical-Right const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i efgh = _mm_avg_epu8(avg2, XABCD); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); // these two are hard to implement in SSE2, so we keep the C-version: DST(0, 2) = AVG3(J, I, X); @@ -970,11 +970,12 @@ static void VL4_SSE2(uint8_t* dst) { // Vertical-Left const __m128i abbc = _mm_or_si128(ab, bc); const __m128i lsb2 = _mm_and_si128(abbc, lsb1); const __m128i avg4 = _mm_subs_epu8(avg3, lsb2); - const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); + const uint32_t extra_out = + (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); // these two are hard to get and irregular DST(3, 2) = (extra_out >> 0) & 0xff; @@ -990,7 +991,7 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right const uint32_t K = dst[-1 + 2 * BPS]; const uint32_t L = dst[-1 + 3 * BPS]; const __m128i LKJI_____ = - _mm_cvtsi32_si128(L | (K << 8) | (J << 16) | (I << 24)); + _mm_cvtsi32_si128((int)(L | (K << 8) | (J << 16) | (I << 24))); const __m128i LKJIXABCD = _mm_or_si128(LKJI_____, ____XABCD); const __m128i KJIXABCD_ = _mm_srli_si128(LKJIXABCD, 1); const __m128i JIXABCD__ = _mm_srli_si128(LKJIXABCD, 2); @@ -998,10 +999,10 @@ static void RD4_SSE2(uint8_t* dst) { // Down-right const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } #undef DST @@ -1015,13 +1016,13 @@ static WEBP_INLINE void TrueMotion_SSE2(uint8_t* dst, int size) { const __m128i zero = _mm_setzero_si128(); int y; if (size == 4) { - const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top)); + const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top)); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); for (y = 0; y < 4; ++y, dst += BPS) { const int val = dst[-1] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); - WebPUint32ToMem(dst, _mm_cvtsi128_si32(out)); + WebPInt32ToMem(dst, _mm_cvtsi128_si32(out)); } } else if (size == 8) { const __m128i top_values = _mm_loadl_epi64((const __m128i*)top); @@ -1062,7 +1063,7 @@ static void VE16_SSE2(uint8_t* dst) { static void HE16_SSE2(uint8_t* dst) { // horizontal int j; for (j = 16; j > 0; --j) { - const __m128i values = _mm_set1_epi8(dst[-1]); + const __m128i values = _mm_set1_epi8((char)dst[-1]); _mm_storeu_si128((__m128i*)dst, values); dst += BPS; } @@ -1070,7 +1071,7 @@ static void HE16_SSE2(uint8_t* dst) { // horizontal static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) { int j; - const __m128i values = _mm_set1_epi8(v); + const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 16; ++j) { _mm_storeu_si128((__m128i*)(dst + j * BPS), values); } @@ -1130,7 +1131,7 @@ static void VE8uv_SSE2(uint8_t* dst) { // vertical // helper for chroma-DC predictions static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) { int j; - const __m128i values = _mm_set1_epi8(v); + const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), values); } diff --git a/thirdparty/libwebp/src/dsp/dec_sse41.c b/thirdparty/libwebp/src/dsp/dec_sse41.c index 8f18506d54..08a3630272 100644 --- a/thirdparty/libwebp/src/dsp/dec_sse41.c +++ b/thirdparty/libwebp/src/dsp/dec_sse41.c @@ -23,7 +23,7 @@ static void HE16_SSE41(uint8_t* dst) { // horizontal int j; const __m128i kShuffle3 = _mm_set1_epi8(3); for (j = 16; j > 0; --j) { - const __m128i in = _mm_cvtsi32_si128(WebPMemToUint32(dst - 4)); + const __m128i in = _mm_cvtsi32_si128(WebPMemToInt32(dst - 4)); const __m128i values = _mm_shuffle_epi8(in, kShuffle3); _mm_storeu_si128((__m128i*)dst, values); dst += BPS; diff --git a/thirdparty/libwebp/src/dsp/enc_neon.c b/thirdparty/libwebp/src/dsp/enc_neon.c index 601962ba76..3a04111c55 100644 --- a/thirdparty/libwebp/src/dsp/enc_neon.c +++ b/thirdparty/libwebp/src/dsp/enc_neon.c @@ -764,9 +764,14 @@ static WEBP_INLINE void AccumulateSSE16_NEON(const uint8_t* const a, // Horizontal sum of all four uint32_t values in 'sum'. static int SumToInt_NEON(uint32x4_t sum) { +#if defined(__aarch64__) + return (int)vaddvq_u32(sum); +#else const uint64x2_t sum2 = vpaddlq_u32(sum); - const uint64_t sum3 = vgetq_lane_u64(sum2, 0) + vgetq_lane_u64(sum2, 1); - return (int)sum3; + const uint32x2_t sum3 = vadd_u32(vreinterpret_u32_u64(vget_low_u64(sum2)), + vreinterpret_u32_u64(vget_high_u64(sum2))); + return (int)vget_lane_u32(sum3, 0); +#endif } static int SSE16x16_NEON(const uint8_t* a, const uint8_t* b) { diff --git a/thirdparty/libwebp/src/dsp/enc_sse2.c b/thirdparty/libwebp/src/dsp/enc_sse2.c index b2e78ed941..1d1055668f 100644 --- a/thirdparty/libwebp/src/dsp/enc_sse2.c +++ b/thirdparty/libwebp/src/dsp/enc_sse2.c @@ -156,10 +156,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst, ref3 = _mm_loadl_epi64((const __m128i*)&ref[3 * BPS]); } else { // Load four bytes/pixels per line. - ref0 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[0 * BPS])); - ref1 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[1 * BPS])); - ref2 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[2 * BPS])); - ref3 = _mm_cvtsi32_si128(WebPMemToUint32(&ref[3 * BPS])); + ref0 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[0 * BPS])); + ref1 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[1 * BPS])); + ref2 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[2 * BPS])); + ref3 = _mm_cvtsi32_si128(WebPMemToInt32(&ref[3 * BPS])); } // Convert to 16b. ref0 = _mm_unpacklo_epi8(ref0, zero); @@ -185,10 +185,10 @@ static void ITransform_SSE2(const uint8_t* ref, const int16_t* in, uint8_t* dst, _mm_storel_epi64((__m128i*)&dst[3 * BPS], ref3); } else { // Store four bytes/pixels per line. - WebPUint32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0)); - WebPUint32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1)); - WebPUint32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2)); - WebPUint32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3)); + WebPInt32ToMem(&dst[0 * BPS], _mm_cvtsi128_si32(ref0)); + WebPInt32ToMem(&dst[1 * BPS], _mm_cvtsi128_si32(ref1)); + WebPInt32ToMem(&dst[2 * BPS], _mm_cvtsi128_si32(ref2)); + WebPInt32ToMem(&dst[3 * BPS], _mm_cvtsi128_si32(ref3)); } } } @@ -481,7 +481,7 @@ static void CollectHistogram_SSE2(const uint8_t* ref, const uint8_t* pred, // helper for chroma-DC predictions static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) { int j; - const __m128i values = _mm_set1_epi8(v); + const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 8; ++j) { _mm_storel_epi64((__m128i*)(dst + j * BPS), values); } @@ -489,7 +489,7 @@ static WEBP_INLINE void Put8x8uv_SSE2(uint8_t v, uint8_t* dst) { static WEBP_INLINE void Put16_SSE2(uint8_t v, uint8_t* dst) { int j; - const __m128i values = _mm_set1_epi8(v); + const __m128i values = _mm_set1_epi8((char)v); for (j = 0; j < 16; ++j) { _mm_store_si128((__m128i*)(dst + j * BPS), values); } @@ -540,7 +540,7 @@ static WEBP_INLINE void VerticalPred_SSE2(uint8_t* dst, static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) { int j; for (j = 0; j < 8; ++j) { - const __m128i values = _mm_set1_epi8(left[j]); + const __m128i values = _mm_set1_epi8((char)left[j]); _mm_storel_epi64((__m128i*)dst, values); dst += BPS; } @@ -549,7 +549,7 @@ static WEBP_INLINE void HE8uv_SSE2(uint8_t* dst, const uint8_t* left) { static WEBP_INLINE void HE16_SSE2(uint8_t* dst, const uint8_t* left) { int j; for (j = 0; j < 16; ++j) { - const __m128i values = _mm_set1_epi8(left[j]); + const __m128i values = _mm_set1_epi8((char)left[j]); _mm_store_si128((__m128i*)dst, values); dst += BPS; } @@ -722,10 +722,10 @@ static WEBP_INLINE void VE4_SSE2(uint8_t* dst, const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGH00), one); const __m128i b = _mm_subs_epu8(a, lsb); const __m128i avg = _mm_avg_epu8(b, BCDEFGH0); - const uint32_t vals = _mm_cvtsi128_si32(avg); + const int vals = _mm_cvtsi128_si32(avg); int i; for (i = 0; i < 4; ++i) { - WebPUint32ToMem(dst + i * BPS, vals); + WebPInt32ToMem(dst + i * BPS, vals); } } @@ -760,10 +760,10 @@ static WEBP_INLINE void LD4_SSE2(uint8_t* dst, const __m128i lsb = _mm_and_si128(_mm_xor_si128(ABCDEFGH, CDEFGHH0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, BCDEFGH0); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcdefg )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static WEBP_INLINE void VR4_SSE2(uint8_t* dst, @@ -782,10 +782,10 @@ static WEBP_INLINE void VR4_SSE2(uint8_t* dst, const __m128i lsb = _mm_and_si128(_mm_xor_si128(IXABCD, ABCD0), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i efgh = _mm_avg_epu8(avg2, XABCD); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( abcd )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( efgh )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(abcd, 1))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_slli_si128(efgh, 1))); // these two are hard to implement in SSE2, so we keep the C-version: DST(0, 2) = AVG3(J, I, X); @@ -807,11 +807,12 @@ static WEBP_INLINE void VL4_SSE2(uint8_t* dst, const __m128i abbc = _mm_or_si128(ab, bc); const __m128i lsb2 = _mm_and_si128(abbc, lsb1); const __m128i avg4 = _mm_subs_epu8(avg3, lsb2); - const uint32_t extra_out = _mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); + const uint32_t extra_out = + (uint32_t)_mm_cvtsi128_si32(_mm_srli_si128(avg4, 4)); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32( avg1 )); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32( avg4 )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg1, 1))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(avg4, 1))); // these two are hard to get and irregular DST(3, 2) = (extra_out >> 0) & 0xff; @@ -829,10 +830,10 @@ static WEBP_INLINE void RD4_SSE2(uint8_t* dst, const __m128i lsb = _mm_and_si128(_mm_xor_si128(JIXABCD__, LKJIXABCD), one); const __m128i avg2 = _mm_subs_epu8(avg1, lsb); const __m128i abcdefg = _mm_avg_epu8(avg2, KJIXABCD_); - WebPUint32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); - WebPUint32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); - WebPUint32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); - WebPUint32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); + WebPInt32ToMem(dst + 3 * BPS, _mm_cvtsi128_si32( abcdefg )); + WebPInt32ToMem(dst + 2 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 1))); + WebPInt32ToMem(dst + 1 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 2))); + WebPInt32ToMem(dst + 0 * BPS, _mm_cvtsi128_si32(_mm_srli_si128(abcdefg, 3))); } static WEBP_INLINE void HU4_SSE2(uint8_t* dst, const uint8_t* top) { @@ -875,14 +876,14 @@ static WEBP_INLINE void HD4_SSE2(uint8_t* dst, const uint8_t* top) { static WEBP_INLINE void TM4_SSE2(uint8_t* dst, const uint8_t* top) { const __m128i zero = _mm_setzero_si128(); - const __m128i top_values = _mm_cvtsi32_si128(WebPMemToUint32(top)); + const __m128i top_values = _mm_cvtsi32_si128(WebPMemToInt32(top)); const __m128i top_base = _mm_unpacklo_epi8(top_values, zero); int y; for (y = 0; y < 4; ++y, dst += BPS) { const int val = top[-2 - y] - top[-1]; const __m128i base = _mm_set1_epi16(val); const __m128i out = _mm_packus_epi16(_mm_add_epi16(base, top_base), zero); - WebPUint32ToMem(dst, _mm_cvtsi128_si32(out)); + WebPInt32ToMem(dst, _mm_cvtsi128_si32(out)); } } diff --git a/thirdparty/libwebp/src/dsp/lossless.c b/thirdparty/libwebp/src/dsp/lossless.c index 84a54296fd..fb86e58d4a 100644 --- a/thirdparty/libwebp/src/dsp/lossless.c +++ b/thirdparty/libwebp/src/dsp/lossless.c @@ -49,7 +49,7 @@ static WEBP_INLINE uint32_t Clip255(uint32_t a) { } static WEBP_INLINE int AddSubtractComponentFull(int a, int b, int c) { - return Clip255(a + b - c); + return Clip255((uint32_t)(a + b - c)); } static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1, @@ -66,7 +66,7 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull(uint32_t c0, uint32_t c1, } static WEBP_INLINE int AddSubtractComponentHalf(int a, int b) { - return Clip255(a + (a - b) / 2); + return Clip255((uint32_t)(a + (a - b) / 2)); } static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1, @@ -293,10 +293,10 @@ void VP8LTransformColorInverse_C(const VP8LMultipliers* const m, const uint32_t red = argb >> 16; int new_red = red & 0xff; int new_blue = argb & 0xff; - new_red += ColorTransformDelta(m->green_to_red_, green); + new_red += ColorTransformDelta((int8_t)m->green_to_red_, green); new_red &= 0xff; - new_blue += ColorTransformDelta(m->green_to_blue_, green); - new_blue += ColorTransformDelta(m->red_to_blue_, (int8_t)new_red); + new_blue += ColorTransformDelta((int8_t)m->green_to_blue_, green); + new_blue += ColorTransformDelta((int8_t)m->red_to_blue_, (int8_t)new_red); new_blue &= 0xff; dst[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue); } @@ -395,7 +395,7 @@ void VP8LInverseTransform(const VP8LTransform* const transform, assert(row_start < row_end); assert(row_end <= transform->ysize_); switch (transform->type_) { - case SUBTRACT_GREEN: + case SUBTRACT_GREEN_TRANSFORM: VP8LAddGreenToBlueAndRed(in, (row_end - row_start) * width, out); break; case PREDICTOR_TRANSFORM: diff --git a/thirdparty/libwebp/src/dsp/lossless_enc.c b/thirdparty/libwebp/src/dsp/lossless_enc.c index de6c4ace5f..b1f9f26d72 100644 --- a/thirdparty/libwebp/src/dsp/lossless_enc.c +++ b/thirdparty/libwebp/src/dsp/lossless_enc.c @@ -522,11 +522,11 @@ static void GetCombinedEntropyUnrefined_C(const uint32_t X[], void VP8LSubtractGreenFromBlueAndRed_C(uint32_t* argb_data, int num_pixels) { int i; for (i = 0; i < num_pixels; ++i) { - const int argb = argb_data[i]; + const int argb = (int)argb_data[i]; const int green = (argb >> 8) & 0xff; const uint32_t new_r = (((argb >> 16) & 0xff) - green) & 0xff; const uint32_t new_b = (((argb >> 0) & 0xff) - green) & 0xff; - argb_data[i] = (argb & 0xff00ff00u) | (new_r << 16) | new_b; + argb_data[i] = ((uint32_t)argb & 0xff00ff00u) | (new_r << 16) | new_b; } } @@ -547,10 +547,10 @@ void VP8LTransformColor_C(const VP8LMultipliers* const m, uint32_t* data, const int8_t red = U32ToS8(argb >> 16); int new_red = red & 0xff; int new_blue = argb & 0xff; - new_red -= ColorTransformDelta(m->green_to_red_, green); + new_red -= ColorTransformDelta((int8_t)m->green_to_red_, green); new_red &= 0xff; - new_blue -= ColorTransformDelta(m->green_to_blue_, green); - new_blue -= ColorTransformDelta(m->red_to_blue_, red); + new_blue -= ColorTransformDelta((int8_t)m->green_to_blue_, green); + new_blue -= ColorTransformDelta((int8_t)m->red_to_blue_, red); new_blue &= 0xff; data[i] = (argb & 0xff00ff00u) | (new_red << 16) | (new_blue); } @@ -560,7 +560,7 @@ static WEBP_INLINE uint8_t TransformColorRed(uint8_t green_to_red, uint32_t argb) { const int8_t green = U32ToS8(argb >> 8); int new_red = argb >> 16; - new_red -= ColorTransformDelta(green_to_red, green); + new_red -= ColorTransformDelta((int8_t)green_to_red, green); return (new_red & 0xff); } @@ -569,9 +569,9 @@ static WEBP_INLINE uint8_t TransformColorBlue(uint8_t green_to_blue, uint32_t argb) { const int8_t green = U32ToS8(argb >> 8); const int8_t red = U32ToS8(argb >> 16); - uint8_t new_blue = argb & 0xff; - new_blue -= ColorTransformDelta(green_to_blue, green); - new_blue -= ColorTransformDelta(red_to_blue, red); + int new_blue = argb & 0xff; + new_blue -= ColorTransformDelta((int8_t)green_to_blue, green); + new_blue -= ColorTransformDelta((int8_t)red_to_blue, red); return (new_blue & 0xff); } diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c index 948001a3d5..66cbaab772 100644 --- a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c +++ b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c @@ -54,8 +54,8 @@ static void TransformColor_SSE2(const VP8LMultipliers* const m, const __m128i mults_rb = MK_CST_16(CST_5b(m->green_to_red_), CST_5b(m->green_to_blue_)); const __m128i mults_b2 = MK_CST_16(CST_5b(m->red_to_blue_), 0); - const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks - const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks + const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks + const __m128i mask_rb = _mm_set1_epi32(0x00ff00ff); // red-blue masks int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]); // argb @@ -376,7 +376,7 @@ static void BundleColorMap_SSE2(const uint8_t* const row, int width, int xbits, break; } case 2: { - const __m128i mask_or = _mm_set1_epi32(0xff000000); + const __m128i mask_or = _mm_set1_epi32((int)0xff000000); const __m128i mul_cst = _mm_set1_epi16(0x0104); const __m128i mask_mul = _mm_set1_epi16(0x0f00); for (x = 0; x + 16 <= width; x += 16, dst += 4) { @@ -427,7 +427,7 @@ static WEBP_INLINE void Average2_m128i(const __m128i* const a0, static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; - const __m128i black = _mm_set1_epi32(ARGB_BLACK); + const __m128i black = _mm_set1_epi32((int)ARGB_BLACK); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i res = _mm_sub_epi8(src, black); diff --git a/thirdparty/libwebp/src/dsp/lossless_sse2.c b/thirdparty/libwebp/src/dsp/lossless_sse2.c index 396cb0bdfc..4b6a532c23 100644 --- a/thirdparty/libwebp/src/dsp/lossless_sse2.c +++ b/thirdparty/libwebp/src/dsp/lossless_sse2.c @@ -27,23 +27,22 @@ static WEBP_INLINE uint32_t ClampedAddSubtractFull_SSE2(uint32_t c0, uint32_t c1, uint32_t c2) { const __m128i zero = _mm_setzero_si128(); - const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero); - const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero); - const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero); + const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero); + const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero); + const __m128i C2 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero); const __m128i V1 = _mm_add_epi16(C0, C1); const __m128i V2 = _mm_sub_epi16(V1, C2); const __m128i b = _mm_packus_epi16(V2, V2); - const uint32_t output = _mm_cvtsi128_si32(b); - return output; + return (uint32_t)_mm_cvtsi128_si32(b); } static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0, uint32_t c1, uint32_t c2) { const __m128i zero = _mm_setzero_si128(); - const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c0), zero); - const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c1), zero); - const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(c2), zero); + const __m128i C0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c0), zero); + const __m128i C1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c1), zero); + const __m128i B0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)c2), zero); const __m128i avg = _mm_add_epi16(C1, C0); const __m128i A0 = _mm_srli_epi16(avg, 1); const __m128i A1 = _mm_sub_epi16(A0, B0); @@ -52,16 +51,15 @@ static WEBP_INLINE uint32_t ClampedAddSubtractHalf_SSE2(uint32_t c0, const __m128i A3 = _mm_srai_epi16(A2, 1); const __m128i A4 = _mm_add_epi16(A0, A3); const __m128i A5 = _mm_packus_epi16(A4, A4); - const uint32_t output = _mm_cvtsi128_si32(A5); - return output; + return (uint32_t)_mm_cvtsi128_si32(A5); } static WEBP_INLINE uint32_t Select_SSE2(uint32_t a, uint32_t b, uint32_t c) { int pa_minus_pb; const __m128i zero = _mm_setzero_si128(); - const __m128i A0 = _mm_cvtsi32_si128(a); - const __m128i B0 = _mm_cvtsi32_si128(b); - const __m128i C0 = _mm_cvtsi32_si128(c); + const __m128i A0 = _mm_cvtsi32_si128((int)a); + const __m128i B0 = _mm_cvtsi32_si128((int)b); + const __m128i C0 = _mm_cvtsi32_si128((int)c); const __m128i AC0 = _mm_subs_epu8(A0, C0); const __m128i CA0 = _mm_subs_epu8(C0, A0); const __m128i BC0 = _mm_subs_epu8(B0, C0); @@ -94,8 +92,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0, __m128i* const avg) { // (a + b) >> 1 = ((a + b + 1) >> 1) - ((a ^ b) & 1) const __m128i ones = _mm_set1_epi8(1); - const __m128i A0 = _mm_cvtsi32_si128(a0); - const __m128i A1 = _mm_cvtsi32_si128(a1); + const __m128i A0 = _mm_cvtsi32_si128((int)a0); + const __m128i A1 = _mm_cvtsi32_si128((int)a1); const __m128i avg1 = _mm_avg_epu8(A0, A1); const __m128i one = _mm_and_si128(_mm_xor_si128(A0, A1), ones); *avg = _mm_sub_epi8(avg1, one); @@ -103,8 +101,8 @@ static WEBP_INLINE void Average2_uint32_SSE2(const uint32_t a0, static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) { const __m128i zero = _mm_setzero_si128(); - const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a0), zero); - const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero); + const __m128i A0 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a0), zero); + const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero); const __m128i sum = _mm_add_epi16(A1, A0); return _mm_srli_epi16(sum, 1); } @@ -112,19 +110,18 @@ static WEBP_INLINE __m128i Average2_uint32_16_SSE2(uint32_t a0, uint32_t a1) { static WEBP_INLINE uint32_t Average2_SSE2(uint32_t a0, uint32_t a1) { __m128i output; Average2_uint32_SSE2(a0, a1, &output); - return _mm_cvtsi128_si32(output); + return (uint32_t)_mm_cvtsi128_si32(output); } static WEBP_INLINE uint32_t Average3_SSE2(uint32_t a0, uint32_t a1, uint32_t a2) { const __m128i zero = _mm_setzero_si128(); const __m128i avg1 = Average2_uint32_16_SSE2(a0, a2); - const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(a1), zero); + const __m128i A1 = _mm_unpacklo_epi8(_mm_cvtsi32_si128((int)a1), zero); const __m128i sum = _mm_add_epi16(avg1, A1); const __m128i avg2 = _mm_srli_epi16(sum, 1); const __m128i A2 = _mm_packus_epi16(avg2, avg2); - const uint32_t output = _mm_cvtsi128_si32(A2); - return output; + return (uint32_t)_mm_cvtsi128_si32(A2); } static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1, @@ -134,8 +131,7 @@ static WEBP_INLINE uint32_t Average4_SSE2(uint32_t a0, uint32_t a1, const __m128i sum = _mm_add_epi16(avg2, avg1); const __m128i avg3 = _mm_srli_epi16(sum, 1); const __m128i A0 = _mm_packus_epi16(avg3, avg3); - const uint32_t output = _mm_cvtsi128_si32(A0); - return output; + return (uint32_t)_mm_cvtsi128_si32(A0); } static uint32_t Predictor5_SSE2(const uint32_t* const left, @@ -192,7 +188,7 @@ static uint32_t Predictor13_SSE2(const uint32_t* const left, static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; - const __m128i black = _mm_set1_epi32(ARGB_BLACK); + const __m128i black = _mm_set1_epi32((int)ARGB_BLACK); for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); const __m128i res = _mm_add_epi8(src, black); @@ -208,7 +204,7 @@ static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper, static void PredictorAdd1_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; - __m128i prev = _mm_set1_epi32(out[-1]); + __m128i prev = _mm_set1_epi32((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { // a | b | c | d const __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); @@ -285,12 +281,12 @@ GENERATE_PREDICTOR_2(9, upper[i + 1]) #undef GENERATE_PREDICTOR_2 // Predictor10: average of (average of (L,TL), average of (T, TR)). -#define DO_PRED10(OUT) do { \ - __m128i avgLTL, avg; \ - Average2_m128i(&L, &TL, &avgLTL); \ - Average2_m128i(&avgTTR, &avgLTL, &avg); \ - L = _mm_add_epi8(avg, src); \ - out[i + (OUT)] = _mm_cvtsi128_si32(L); \ +#define DO_PRED10(OUT) do { \ + __m128i avgLTL, avg; \ + Average2_m128i(&L, &TL, &avgLTL); \ + Average2_m128i(&avgTTR, &avgLTL, &avg); \ + L = _mm_add_epi8(avg, src); \ + out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \ } while (0) #define DO_PRED10_SHIFT do { \ @@ -303,7 +299,7 @@ GENERATE_PREDICTOR_2(9, upper[i + 1]) static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; - __m128i L = _mm_cvtsi32_si128(out[-1]); + __m128i L = _mm_cvtsi32_si128((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { __m128i src = _mm_loadu_si128((const __m128i*)&in[i]); __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); @@ -336,7 +332,7 @@ static void PredictorAdd10_SSE2(const uint32_t* in, const uint32_t* upper, const __m128i B = _mm_andnot_si128(mask, T); \ const __m128i pred = _mm_or_si128(A, B); /* pred = (pa > b)? L : T*/ \ L = _mm_add_epi8(src, pred); \ - out[i + (OUT)] = _mm_cvtsi128_si32(L); \ + out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(L); \ } while (0) #define DO_PRED11_SHIFT do { \ @@ -351,7 +347,7 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; __m128i pa; - __m128i L = _mm_cvtsi32_si128(out[-1]); + __m128i L = _mm_cvtsi32_si128((int)out[-1]); for (i = 0; i + 4 <= num_pixels; i += 4) { __m128i T = _mm_loadu_si128((const __m128i*)&upper[i]); __m128i TL = _mm_loadu_si128((const __m128i*)&upper[i - 1]); @@ -384,12 +380,12 @@ static void PredictorAdd11_SSE2(const uint32_t* in, const uint32_t* upper, #undef DO_PRED11_SHIFT // Predictor12: ClampedAddSubtractFull. -#define DO_PRED12(DIFF, LANE, OUT) do { \ - const __m128i all = _mm_add_epi16(L, (DIFF)); \ - const __m128i alls = _mm_packus_epi16(all, all); \ - const __m128i res = _mm_add_epi8(src, alls); \ - out[i + (OUT)] = _mm_cvtsi128_si32(res); \ - L = _mm_unpacklo_epi8(res, zero); \ +#define DO_PRED12(DIFF, LANE, OUT) do { \ + const __m128i all = _mm_add_epi16(L, (DIFF)); \ + const __m128i alls = _mm_packus_epi16(all, all); \ + const __m128i res = _mm_add_epi8(src, alls); \ + out[i + (OUT)] = (uint32_t)_mm_cvtsi128_si32(res); \ + L = _mm_unpacklo_epi8(res, zero); \ } while (0) #define DO_PRED12_SHIFT(DIFF, LANE) do { \ @@ -402,7 +398,7 @@ static void PredictorAdd12_SSE2(const uint32_t* in, const uint32_t* upper, int num_pixels, uint32_t* out) { int i; const __m128i zero = _mm_setzero_si128(); - const __m128i L8 = _mm_cvtsi32_si128(out[-1]); + const __m128i L8 = _mm_cvtsi32_si128((int)out[-1]); __m128i L = _mm_unpacklo_epi8(L8, zero); for (i = 0; i + 4 <= num_pixels; i += 4) { // Load 4 pixels at a time. @@ -468,7 +464,7 @@ static void TransformColorInverse_SSE2(const VP8LMultipliers* const m, const __m128i mults_b2 = MK_CST_16(CST(red_to_blue_), 0); #undef MK_CST_16 #undef CST - const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); // alpha-green masks + const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); // alpha-green masks int i; for (i = 0; i + 4 <= num_pixels; i += 4) { const __m128i in = _mm_loadu_si128((const __m128i*)&src[i]); // argb @@ -532,7 +528,7 @@ static void ConvertBGRAToRGB_SSE2(const uint32_t* src, int num_pixels, static void ConvertBGRAToRGBA_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { - const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ffu); + const __m128i red_blue_mask = _mm_set1_epi32(0x00ff00ff); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 8) { @@ -561,7 +557,7 @@ static void ConvertBGRAToRGBA_SSE2(const uint32_t* src, static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { const __m128i mask_0x0f = _mm_set1_epi8(0x0f); - const __m128i mask_0xf0 = _mm_set1_epi8(0xf0); + const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; while (num_pixels >= 8) { @@ -596,8 +592,8 @@ static void ConvertBGRAToRGBA4444_SSE2(const uint32_t* src, static void ConvertBGRAToRGB565_SSE2(const uint32_t* src, int num_pixels, uint8_t* dst) { - const __m128i mask_0xe0 = _mm_set1_epi8(0xe0); - const __m128i mask_0xf8 = _mm_set1_epi8(0xf8); + const __m128i mask_0xe0 = _mm_set1_epi8((char)0xe0); + const __m128i mask_0xf8 = _mm_set1_epi8((char)0xf8); const __m128i mask_0x07 = _mm_set1_epi8(0x07); const __m128i* in = (const __m128i*)src; __m128i* out = (__m128i*)dst; diff --git a/thirdparty/libwebp/src/dsp/lossless_sse41.c b/thirdparty/libwebp/src/dsp/lossless_sse41.c index b0d6daa7fe..bb7ce7611f 100644 --- a/thirdparty/libwebp/src/dsp/lossless_sse41.c +++ b/thirdparty/libwebp/src/dsp/lossless_sse41.c @@ -25,11 +25,12 @@ static void TransformColorInverse_SSE41(const VP8LMultipliers* const m, int num_pixels, uint32_t* dst) { // sign-extended multiplying constants, pre-shifted by 5. #define CST(X) (((int16_t)(m->X << 8)) >> 5) // sign-extend - const __m128i mults_rb = _mm_set1_epi32((uint32_t)CST(green_to_red_) << 16 | - (CST(green_to_blue_) & 0xffff)); + const __m128i mults_rb = + _mm_set1_epi32((int)((uint32_t)CST(green_to_red_) << 16 | + (CST(green_to_blue_) & 0xffff))); const __m128i mults_b2 = _mm_set1_epi32(CST(red_to_blue_)); #undef CST - const __m128i mask_ag = _mm_set1_epi32(0xff00ff00); + const __m128i mask_ag = _mm_set1_epi32((int)0xff00ff00); const __m128i perm1 = _mm_setr_epi8(-1, 1, -1, 1, -1, 5, -1, 5, -1, 9, -1, 9, -1, 13, -1, 13); const __m128i perm2 = _mm_setr_epi8(-1, 2, -1, -1, -1, 6, -1, -1, diff --git a/thirdparty/libwebp/src/dsp/quant.h b/thirdparty/libwebp/src/dsp/quant.h index 5e8dba8d19..fc099bf9d6 100644 --- a/thirdparty/libwebp/src/dsp/quant.h +++ b/thirdparty/libwebp/src/dsp/quant.h @@ -21,10 +21,15 @@ #define IsFlat IsFlat_NEON -static uint32x2_t horizontal_add_uint32x4(const uint32x4_t a) { +static uint32_t horizontal_add_uint32x4(const uint32x4_t a) { +#if defined(__aarch64__) + return vaddvq_u32(a); +#else const uint64x2_t b = vpaddlq_u32(a); - return vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)), - vreinterpret_u32_u64(vget_high_u64(b))); + const uint32x2_t c = vadd_u32(vreinterpret_u32_u64(vget_low_u64(b)), + vreinterpret_u32_u64(vget_high_u64(b))); + return vget_lane_u32(c, 0); +#endif } static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks, @@ -45,7 +50,7 @@ static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks, levels += 16; } - return thresh >= (int32_t)vget_lane_u32(horizontal_add_uint32x4(sum), 0); + return thresh >= (int)horizontal_add_uint32x4(sum); } #else diff --git a/thirdparty/libwebp/src/dsp/rescaler_sse2.c b/thirdparty/libwebp/src/dsp/rescaler_sse2.c index d7effea16e..3f18e94e93 100644 --- a/thirdparty/libwebp/src/dsp/rescaler_sse2.c +++ b/thirdparty/libwebp/src/dsp/rescaler_sse2.c @@ -85,7 +85,7 @@ static void RescalerImportRowExpand_SSE2(WebPRescaler* const wrk, const __m128i mult = _mm_cvtsi32_si128(((x_add - accum) << 16) | accum); const __m128i out = _mm_madd_epi16(cur_pixels, mult); assert(sizeof(*frow) == sizeof(uint32_t)); - WebPUint32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out)); + WebPInt32ToMem((uint8_t*)frow, _mm_cvtsi128_si32(out)); frow += 1; if (frow >= frow_end) break; accum -= wrk->x_sub; @@ -132,7 +132,7 @@ static void RescalerImportRowShrink_SSE2(WebPRescaler* const wrk, __m128i base = zero; accum += wrk->x_add; while (accum > 0) { - const __m128i A = _mm_cvtsi32_si128(WebPMemToUint32(src)); + const __m128i A = _mm_cvtsi32_si128(WebPMemToInt32(src)); src += 4; base = _mm_unpacklo_epi8(A, zero); // To avoid overflow, we need: base * x_add / x_sub < 32768 @@ -198,7 +198,7 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0, const __m128i* const mult, uint8_t* const dst) { const __m128i rounder = _mm_set_epi32(0, ROUNDER, 0, ROUNDER); - const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0); + const __m128i mask = _mm_set_epi32(~0, 0, ~0, 0); const __m128i B0 = _mm_mul_epu32(*A0, *mult); const __m128i B1 = _mm_mul_epu32(*A1, *mult); const __m128i B2 = _mm_mul_epu32(*A2, *mult); diff --git a/thirdparty/libwebp/src/dsp/upsampling_sse2.c b/thirdparty/libwebp/src/dsp/upsampling_sse2.c index 340f1e2ac2..08b6d0b1cf 100644 --- a/thirdparty/libwebp/src/dsp/upsampling_sse2.c +++ b/thirdparty/libwebp/src/dsp/upsampling_sse2.c @@ -121,7 +121,7 @@ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y, \ int uv_pos, pos; \ /* 16byte-aligned array to cache reconstructed u and v */ \ uint8_t uv_buf[14 * 32 + 15] = { 0 }; \ - uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15); \ + uint8_t* const r_u = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~(uintptr_t)15); \ uint8_t* const r_v = r_u + 32; \ \ assert(top_y != NULL); \ diff --git a/thirdparty/libwebp/src/dsp/yuv_sse2.c b/thirdparty/libwebp/src/dsp/yuv_sse2.c index 970bbb7884..01a48f9af2 100644 --- a/thirdparty/libwebp/src/dsp/yuv_sse2.c +++ b/thirdparty/libwebp/src/dsp/yuv_sse2.c @@ -15,10 +15,12 @@ #if defined(WEBP_USE_SSE2) -#include "src/dsp/common_sse2.h" #include <stdlib.h> #include <emmintrin.h> +#include "src/dsp/common_sse2.h" +#include "src/utils/utils.h" + //----------------------------------------------------------------------------- // Convert spans of 32 pixels to various RGB formats for the fancy upsampler. @@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE2(const uint8_t* src) { // Load and replicate the U/V samples static WEBP_INLINE __m128i Load_UV_HI_8_SSE2(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); - const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src); + const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src)); const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0); return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples } @@ -130,7 +132,7 @@ static WEBP_INLINE void PackAndStore4444_SSE2(const __m128i* const R, const __m128i rg0 = _mm_packus_epi16(*B, *A); const __m128i ba0 = _mm_packus_epi16(*R, *G); #endif - const __m128i mask_0xf0 = _mm_set1_epi8(0xf0); + const __m128i mask_0xf0 = _mm_set1_epi8((char)0xf0); const __m128i rb1 = _mm_unpacklo_epi8(rg0, ba0); // rbrbrbrbrb... const __m128i ga1 = _mm_unpackhi_epi8(rg0, ba0); // gagagagaga... const __m128i rb2 = _mm_and_si128(rb1, mask_0xf0); @@ -147,9 +149,10 @@ static WEBP_INLINE void PackAndStore565_SSE2(const __m128i* const R, const __m128i r0 = _mm_packus_epi16(*R, *R); const __m128i g0 = _mm_packus_epi16(*G, *G); const __m128i b0 = _mm_packus_epi16(*B, *B); - const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8(0xf8)); + const __m128i r1 = _mm_and_si128(r0, _mm_set1_epi8((char)0xf8)); const __m128i b1 = _mm_and_si128(_mm_srli_epi16(b0, 3), _mm_set1_epi8(0x1f)); - const __m128i g1 = _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0xe0)), 5); + const __m128i g1 = + _mm_srli_epi16(_mm_and_si128(g0, _mm_set1_epi8((char)0xe0)), 5); const __m128i g2 = _mm_slli_epi16(_mm_and_si128(g0, _mm_set1_epi8(0x1c)), 3); const __m128i rg = _mm_or_si128(r1, g1); const __m128i gb = _mm_or_si128(g2, b1); diff --git a/thirdparty/libwebp/src/dsp/yuv_sse41.c b/thirdparty/libwebp/src/dsp/yuv_sse41.c index 579d1f7402..f79b802e47 100644 --- a/thirdparty/libwebp/src/dsp/yuv_sse41.c +++ b/thirdparty/libwebp/src/dsp/yuv_sse41.c @@ -15,10 +15,12 @@ #if defined(WEBP_USE_SSE41) -#include "src/dsp/common_sse41.h" #include <stdlib.h> #include <smmintrin.h> +#include "src/dsp/common_sse41.h" +#include "src/utils/utils.h" + //----------------------------------------------------------------------------- // Convert spans of 32 pixels to various RGB formats for the fancy upsampler. @@ -74,7 +76,7 @@ static WEBP_INLINE __m128i Load_HI_16_SSE41(const uint8_t* src) { // Load and replicate the U/V samples static WEBP_INLINE __m128i Load_UV_HI_8_SSE41(const uint8_t* src) { const __m128i zero = _mm_setzero_si128(); - const __m128i tmp0 = _mm_cvtsi32_si128(*(const uint32_t*)src); + const __m128i tmp0 = _mm_cvtsi32_si128(WebPMemToInt32(src)); const __m128i tmp1 = _mm_unpacklo_epi8(zero, tmp0); return _mm_unpacklo_epi16(tmp1, tmp1); // replicate samples } diff --git a/thirdparty/libwebp/src/enc/analysis_enc.c b/thirdparty/libwebp/src/enc/analysis_enc.c index ebb784261c..a0001ac034 100644 --- a/thirdparty/libwebp/src/enc/analysis_enc.c +++ b/thirdparty/libwebp/src/enc/analysis_enc.c @@ -391,12 +391,14 @@ static int DoSegmentsJob(void* arg1, void* arg2) { return ok; } +#ifdef WEBP_USE_THREAD static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) { int i; for (i = 0; i <= MAX_ALPHA; ++i) dst->alphas[i] += src->alphas[i]; dst->alpha += src->alpha; dst->uv_alpha += src->uv_alpha; } +#endif // initialize the job struct with some tasks to perform static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job, @@ -425,10 +427,10 @@ int VP8EncAnalyze(VP8Encoder* const enc) { (enc->method_ <= 1); // for method 0 - 1, we need preds_[] to be filled. if (do_segments) { const int last_row = enc->mb_h_; - // We give a little more than a half work to the main thread. - const int split_row = (9 * last_row + 15) >> 4; const int total_mb = last_row * enc->mb_w_; #ifdef WEBP_USE_THREAD + // We give a little more than a half work to the main thread. + const int split_row = (9 * last_row + 15) >> 4; const int kMinSplitRow = 2; // minimal rows needed for mt to be worth it const int do_mt = (enc->thread_level_ > 0) && (split_row >= kMinSplitRow); #else @@ -438,6 +440,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) { WebPGetWorkerInterface(); SegmentJob main_job; if (do_mt) { +#ifdef WEBP_USE_THREAD SegmentJob side_job; // Note the use of '&' instead of '&&' because we must call the functions // no matter what. @@ -455,6 +458,7 @@ int VP8EncAnalyze(VP8Encoder* const enc) { } worker_interface->End(&side_job.worker); if (ok) MergeJobs(&side_job, &main_job); // merge results together +#endif // WEBP_USE_THREAD } else { // Even for single-thread case, we use the generic Worker tools. InitSegmentJob(enc, &main_job, 0, last_row); diff --git a/thirdparty/libwebp/src/enc/picture_csp_enc.c b/thirdparty/libwebp/src/enc/picture_csp_enc.c index fabebcf202..78c8ca479b 100644 --- a/thirdparty/libwebp/src/enc/picture_csp_enc.c +++ b/thirdparty/libwebp/src/enc/picture_csp_enc.c @@ -69,10 +69,12 @@ static int CheckNonOpaque(const uint8_t* alpha, int width, int height, int WebPPictureHasTransparency(const WebPPicture* picture) { if (picture == NULL) return 0; if (picture->use_argb) { - const int alpha_offset = ALPHA_OFFSET; - return CheckNonOpaque((const uint8_t*)picture->argb + alpha_offset, - picture->width, picture->height, - 4, picture->argb_stride * sizeof(*picture->argb)); + if (picture->argb != NULL) { + return CheckNonOpaque((const uint8_t*)picture->argb + ALPHA_OFFSET, + picture->width, picture->height, + 4, picture->argb_stride * sizeof(*picture->argb)); + } + return 0; } return CheckNonOpaque(picture->a, picture->width, picture->height, 1, picture->a_stride); @@ -170,21 +172,6 @@ static const int kMinDimensionIterativeConversion = 4; //------------------------------------------------------------------------------ // Main function -extern void SharpYuvInit(VP8CPUInfo cpu_info_func); - -static void SafeInitSharpYuv(void) { -#if defined(WEBP_USE_THREAD) && !defined(_WIN32) - static pthread_mutex_t initsharpyuv_lock = PTHREAD_MUTEX_INITIALIZER; - if (pthread_mutex_lock(&initsharpyuv_lock)) return; -#endif - - SharpYuvInit(VP8GetCPUInfo); - -#if defined(WEBP_USE_THREAD) && !defined(_WIN32) - (void)pthread_mutex_unlock(&initsharpyuv_lock); -#endif -} - static int PreprocessARGB(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, @@ -481,6 +468,8 @@ static WEBP_INLINE void ConvertRowsToUV(const uint16_t* rgb, } } +extern void SharpYuvInit(VP8CPUInfo cpu_info_func); + static int ImportYUVAFromRGBA(const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr, @@ -516,7 +505,7 @@ static int ImportYUVAFromRGBA(const uint8_t* r_ptr, } if (use_iterative_conversion) { - SafeInitSharpYuv(); + SharpYuvInit(VP8GetCPUInfo); if (!PreprocessARGB(r_ptr, g_ptr, b_ptr, step, rgb_stride, picture)) { return 0; } diff --git a/thirdparty/libwebp/src/enc/vp8i_enc.h b/thirdparty/libwebp/src/enc/vp8i_enc.h index 71f76702ae..c9927c47d8 100644 --- a/thirdparty/libwebp/src/enc/vp8i_enc.h +++ b/thirdparty/libwebp/src/enc/vp8i_enc.h @@ -31,8 +31,8 @@ extern "C" { // version numbers #define ENC_MAJ_VERSION 1 -#define ENC_MIN_VERSION 2 -#define ENC_REV_VERSION 4 +#define ENC_MIN_VERSION 3 +#define ENC_REV_VERSION 0 enum { MAX_LF_LEVELS = 64, // Maximum loop filter level MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost diff --git a/thirdparty/libwebp/src/enc/vp8l_enc.c b/thirdparty/libwebp/src/enc/vp8l_enc.c index 2b345df610..0b07e529a9 100644 --- a/thirdparty/libwebp/src/enc/vp8l_enc.c +++ b/thirdparty/libwebp/src/enc/vp8l_enc.c @@ -361,10 +361,11 @@ typedef enum { kHistoTotal // Must be last. } HistoIx; -static void AddSingleSubGreen(int p, uint32_t* const r, uint32_t* const b) { - const int green = p >> 8; // The upper bits are masked away later. - ++r[((p >> 16) - green) & 0xff]; - ++b[((p >> 0) - green) & 0xff]; +static void AddSingleSubGreen(uint32_t p, + uint32_t* const r, uint32_t* const b) { + const int green = (int)p >> 8; // The upper bits are masked away later. + ++r[(((int)p >> 16) - green) & 0xff]; + ++b[(((int)p >> 0) - green) & 0xff]; } static void AddSingle(uint32_t p, @@ -1354,7 +1355,7 @@ static int EncodeImageInternal( static void ApplySubtractGreen(VP8LEncoder* const enc, int width, int height, VP8LBitWriter* const bw) { VP8LPutBits(bw, TRANSFORM_PRESENT, 1); - VP8LPutBits(bw, SUBTRACT_GREEN, 2); + VP8LPutBits(bw, SUBTRACT_GREEN_TRANSFORM, 2); VP8LSubtractGreenFromBlueAndRed(enc->argb_, width * height); } diff --git a/thirdparty/libwebp/src/mux/muxi.h b/thirdparty/libwebp/src/mux/muxi.h index 0f4af1784d..7929138c44 100644 --- a/thirdparty/libwebp/src/mux/muxi.h +++ b/thirdparty/libwebp/src/mux/muxi.h @@ -28,8 +28,8 @@ extern "C" { // Defines and constants. #define MUX_MAJ_VERSION 1 -#define MUX_MIN_VERSION 2 -#define MUX_REV_VERSION 4 +#define MUX_MIN_VERSION 3 +#define MUX_REV_VERSION 0 // Chunk object. typedef struct WebPChunk WebPChunk; diff --git a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h index 404b9a6d8c..24f3af7b54 100644 --- a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h +++ b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h @@ -148,9 +148,9 @@ int VP8GetSigned(VP8BitReader* WEBP_RESTRICT const br, int v, const range_t value = (range_t)(br->value_ >> pos); const int32_t mask = (int32_t)(split - value) >> 31; // -1 or 0 br->bits_ -= 1; - br->range_ += mask; + br->range_ += (range_t)mask; br->range_ |= 1; - br->value_ -= (bit_t)((split + 1) & mask) << pos; + br->value_ -= (bit_t)((split + 1) & (uint32_t)mask) << pos; BT_TRACK(br); return (v ^ mask) - mask; } diff --git a/thirdparty/libwebp/src/utils/huffman_utils.c b/thirdparty/libwebp/src/utils/huffman_utils.c index 0cba0fbb7d..90c2fbf7c1 100644 --- a/thirdparty/libwebp/src/utils/huffman_utils.c +++ b/thirdparty/libwebp/src/utils/huffman_utils.c @@ -142,7 +142,7 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits, { int step; // step size to replicate values in current table - uint32_t low = -1; // low bits for current root entry + uint32_t low = 0xffffffffu; // low bits for current root entry uint32_t mask = total_size - 1; // mask for low bits uint32_t key = 0; // reversed prefix code int num_nodes = 1; // number of Huffman tree nodes diff --git a/thirdparty/libwebp/src/utils/utils.h b/thirdparty/libwebp/src/utils/utils.h index ef04f108fe..c5ee873357 100644 --- a/thirdparty/libwebp/src/utils/utils.h +++ b/thirdparty/libwebp/src/utils/utils.h @@ -64,7 +64,8 @@ WEBP_EXTERN void WebPSafeFree(void* const ptr); // Alignment #define WEBP_ALIGN_CST 31 -#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & ~WEBP_ALIGN_CST) +#define WEBP_ALIGN(PTR) (((uintptr_t)(PTR) + WEBP_ALIGN_CST) & \ + ~(uintptr_t)WEBP_ALIGN_CST) #include <string.h> // memcpy() is the safe way of moving potentially unaligned 32b memory. @@ -73,10 +74,19 @@ static WEBP_INLINE uint32_t WebPMemToUint32(const uint8_t* const ptr) { memcpy(&A, ptr, sizeof(A)); return A; } + +static WEBP_INLINE int32_t WebPMemToInt32(const uint8_t* const ptr) { + return (int32_t)WebPMemToUint32(ptr); +} + static WEBP_INLINE void WebPUint32ToMem(uint8_t* const ptr, uint32_t val) { memcpy(ptr, &val, sizeof(val)); } +static WEBP_INLINE void WebPInt32ToMem(uint8_t* const ptr, int val) { + WebPUint32ToMem(ptr, (uint32_t)val); +} + //------------------------------------------------------------------------------ // Reading/writing data. diff --git a/thirdparty/libwebp/src/webp/format_constants.h b/thirdparty/libwebp/src/webp/format_constants.h index eca6981a47..999035c5d2 100644 --- a/thirdparty/libwebp/src/webp/format_constants.h +++ b/thirdparty/libwebp/src/webp/format_constants.h @@ -55,7 +55,7 @@ typedef enum { PREDICTOR_TRANSFORM = 0, CROSS_COLOR_TRANSFORM = 1, - SUBTRACT_GREEN = 2, + SUBTRACT_GREEN_TRANSFORM = 2, COLOR_INDEXING_TRANSFORM = 3 } VP8LImageTransformType; diff --git a/thirdparty/libwebp/src/webp/types.h b/thirdparty/libwebp/src/webp/types.h index 47f7f2b007..f255432e41 100644 --- a/thirdparty/libwebp/src/webp/types.h +++ b/thirdparty/libwebp/src/webp/types.h @@ -42,7 +42,11 @@ typedef long long int int64_t; # if defined(__GNUC__) && __GNUC__ >= 4 # define WEBP_EXTERN extern __attribute__ ((visibility ("default"))) # else -# define WEBP_EXTERN extern +# if defined(_MSC_VER) && defined(WEBP_DLL) +# define WEBP_EXTERN __declspec(dllexport) +# else +# define WEBP_EXTERN extern +# endif # endif /* __GNUC__ >= 4 */ #endif /* WEBP_EXTERN */ |