diff options
229 files changed, 5620 insertions, 4043 deletions
@@ -40,6 +40,7 @@ Gilles Roudiere <gilles.roudiere@gmail.com> <gilles.roudiere@laas.fr> Gordon MacPherson <gordon@gordonite.tech> Guilherme Felipe <guilhermefelipecgs@gmail.com> Hanif Bin Ariffin <hanif.ariffin.4326@gmail.com> +HaSa1002 <johawitt@outlook.de> Hein-Pieter van Braam-Stewart <hp@tmm.cx> Hubert Jarosz <marqin.pl@gmail.com> Hubert Jarosz <marqin.pl@gmail.com> <marqin.pl+git@gmail.com> diff --git a/AUTHORS.md b/AUTHORS.md index 2faaf2d2c0..8c26d2892b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -163,6 +163,7 @@ name is available. Ray Koopa (RayKoopa) Rémi Verschelde (akien-mga) Rhody Lugo (rraallvv) + Ricardo Subtil (Ev1lbl0w) Roberto F. Arroyo (robfram) Robin Hübner (profan) romulox-x diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4387750f28..d7a4f976bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -241,25 +241,21 @@ discussions and support, others more for development discussions. To communicate with developers (e.g. to discuss a feature you want to implement or a bug you want to fix), the following channels can be used: -- [GitHub issues](https://github.com/godotengine/godot/issues): If there is an - existing issue about a topic you want to discuss, just add a comment to it - - all developers watch the repository and will get an email notification. You - can also create a new issue - please keep in mind to create issues only to - discuss quite specific points about the development, and not general user - feedback or support requests. -- [#godotengine-devel IRC channel on - Freenode](https://webchat.freenode.net/?channels=godotengine-devel): You will - find most core developers there, so it's the go-to channel for direct chat +- [Godot Contributors Chat](https://chat.godotengine.org): You will + find most core developers there, so it's the go-to platform for direct chat about Godot Engine development. Feel free to start discussing something there to get some early feedback before writing up a detailed proposal in a GitHub issue. -- [devel@godotengine.org mailing - list](https://listengine.tuxfamily.org/godotengine.org/devel/): Mailing list - for Godot developers, used primarily to announce developer meetings on IRC - and other important discussions that need to reach people directly in their - mailbox. See the [index - page](https://listengine.tuxfamily.org/godotengine.org/devel/) for - subscription instructions. +- [Bug tracker](https://github.com/godotengine/godot/issues): If there is an + existing issue about a topic you want to discuss, just add a comment to it - + many developers watch the repository and will get a notification. You can + also create a new issue - please keep in mind to create issues only to + discuss quite specific points about the development, and not general user + feedback or support requests. +- [Feature proposals](https://github.com/godotengine/godot-proposals/issues): + To propose a new feature, we have a dedicated issue tracker for that. Don't + hesitate to start by talking about your idea on the Godot Contributors Chat + to make sure that it makes sense in Godot's context. Thanks for your interest in contributing! @@ -32,6 +32,7 @@ generous deed immortalized in the next stable release of Godot Engine. Garry Newman Gordon MacPherson Hunter Dickson + Kyle Szklenski ## Mini sponsors @@ -39,6 +40,8 @@ generous deed immortalized in the next stable release of Godot Engine. Alejandro Saucedo alex brown Andrew Dunai + Ben Nolan + blurp CD Christian Baune Christoffer Sundbom @@ -58,6 +61,7 @@ generous deed immortalized in the next stable release of Godot Engine. John G Gentzel Jonah Stich Justin Arnold + Kamil Brzezinski Marcel Kräml Matthieu Huvé Maxim Karsten @@ -67,6 +71,7 @@ generous deed immortalized in the next stable release of Godot Engine. Patrick Horn Patrick Schmidt Péter Magyar + Rami Ronnie Cheng Slobodan Milnovic Stephan Lanfermann @@ -75,6 +80,7 @@ generous deed immortalized in the next stable release of Godot Engine. Tristan Pemble VilliHaukka Violin Iliev + Xwdit ## Gold donors @@ -82,7 +88,7 @@ generous deed immortalized in the next stable release of Godot Engine. albinaask Alvaro A Baena R Asher Glick - Bernhard Werner + Barugon Carlo Cabanilla Chris Goddard Christopher Case @@ -96,11 +102,9 @@ generous deed immortalized in the next stable release of Godot Engine. Florian Rämisch Forge Gamejunkey - Grady Hoojib Jakub Grzesik Javier Roman - Jeff Nyte Joan Fons Johnny IV Young Jon Woodward @@ -115,13 +119,9 @@ generous deed immortalized in the next stable release of Godot Engine. Matthew Hillier Michael m kaersten - Mohamed Ikbel Boulabiar Monster Vial Officine Pixel S.n.c. - Pixel Booty - Rami Rene - Rene Tailleur Retro Village Rob Messick Roland Fredenhagen @@ -142,7 +142,6 @@ generous deed immortalized in the next stable release of Godot Engine. Xeno Coliseum Zaven Muradyan - Aaron Winter Adam Nakonieczny Adrian Adamiak Aleksey Korotkevich @@ -154,14 +153,12 @@ generous deed immortalized in the next stable release of Godot Engine. Andreas Funke André Frélicot Andrew Cunningham - Anm Antanas Paskauskas Antoni Batchelli Arisaka Mayuki Arthur S. Muszynski - Aubin Detrez - Barugon Ben Botwin + Brandon Hawkinson Caleb Sizemore Can Eris Charlie Whitfield @@ -170,8 +167,6 @@ generous deed immortalized in the next stable release of Godot Engine. Chris Petrich Chris Serino Christian Leth Jeppesen - Cody Brooks - Conrad Curry Craig Ostrin Craig Smith Cristopher @@ -191,15 +186,13 @@ generous deed immortalized in the next stable release of Godot Engine. Gabrielius VaiÅ¡kÅ«nas Gary Hulst gavlig + General Chicken GGGames.org - GiulianoB - Green Fox Guilherme Felipe de C. G. da Silva Harvey Fong Heath Hayes Horváth Péter Hu Hund - Idilio Alfaro Jake Burga James Couzens Jared @@ -209,6 +202,7 @@ generous deed immortalized in the next stable release of Godot Engine. Joel Höglund Johnathan Kupferer Jose Malheiro + Jose Manuel Muñoz Perez Joseph Crane Joshie Sparks Joshua Flores @@ -223,9 +217,11 @@ generous deed immortalized in the next stable release of Godot Engine. kickmaniac kinfox Kos + kuku Lachie Lain Ballard Laszlo Kiss + leetNightshade Leo Fidel R Liban Liam Smyth Luc-Frédéric Langis @@ -234,10 +230,8 @@ generous deed immortalized in the next stable release of Godot Engine. Marcelo Dornbusch Lopes Marcus Dobler Marcus Richter - Marisa Clardy + Marek Belski Mark Barrett - Mark Diaz - Markus Fehr Martin Eigel Martin Kotz Martin Soucek @@ -249,16 +243,17 @@ generous deed immortalized in the next stable release of Godot Engine. Michael Dürwald Michael Noll Michael Policastro + MightyPossum MikadoSC MuffinManKen Nick Abousselam Nick Barovic Oliver Dick Oscar Campos - Patrick Brock Patrick Ting Paul Hocker Paul Von Zimmerman + Pavel Kotlyar Pedro Silva Pete Goodwin Petr Malac @@ -266,6 +261,7 @@ generous deed immortalized in the next stable release of Godot Engine. pl Raymond Harris Raz A + Rene Tailleur Ricardo Alcantara Robert Larnach Robert Willes @@ -277,11 +273,11 @@ generous deed immortalized in the next stable release of Godot Engine. Ryan Scott Ryszard Sommefeldt Samuel Judd - Scott Pilet Sean Morgan Sebastian Hutter Sébastien Serban Serafimescu + Sergey Fonaryov Sergey Minakov Shishir Tandale SKison @@ -290,12 +286,11 @@ generous deed immortalized in the next stable release of Godot Engine. Stephan Hennion Steven Landow Stoned Xander - TheLevelOfDetail Thomas Bjarnelöf Thomas Kurz Tim Howard - tinyBigGAMES LLC Tobias Bocanegra + Todd Smith Turntsnaco tweaklab Valryia @@ -303,7 +298,6 @@ generous deed immortalized in the next stable release of Godot Engine. Vlad Ceru Opran VoidPointer voxelv - William Foster Wojciech Chojnacki xzibiting Yuancheng Zhang @@ -341,9 +335,9 @@ generous deed immortalized in the next stable release of Godot Engine. Alexander Walter (SilvanuZ) Alexandre Beaudoin alex clavelle + Alex Schmidt Allan Davis Allen Schade - Ancient Phoenix Anders Marstein Kruke Andreas Krampitz Andre Stackhouse @@ -352,11 +346,11 @@ generous deed immortalized in the next stable release of Godot Engine. Andrew Thomas Ano Nim Anthony Avina + Anton Bouwer aomimezura11 AP Condomines Arch Toasty Arda Erol - Aria Armin Preiml Arseniy M Ashley Claymore @@ -365,10 +359,10 @@ generous deed immortalized in the next stable release of Godot Engine. AzulCrescent Balázs Batári Bartosz Bielecki - Bekhoucha Danyl Benedikt Ben Vercammen Bernd Jänichen + Bernhard Werner Bjarne Voigtländer Black Block blackjacksike @@ -383,6 +377,7 @@ generous deed immortalized in the next stable release of Godot Engine. Bronson Zgeb Bùi Việt Thà nh Burney Waring + bwhirt Caleb Gartner Cameron Meyer Carlos Cejudo @@ -401,8 +396,8 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Winter Christoffer Dahlblom Christophe Gagnier + Christopher Chin Christopher Schmitt - Christoph Woinke Chris Truebe Clay Heaton Cody Parker @@ -422,6 +417,7 @@ generous deed immortalized in the next stable release of Godot Engine. Dmitry Fisher Dmytro Korchynskyi Dominik Wetzel + Douglas Plumley Dragontrapper Dr Ewan Murray Dr.Raccoon @@ -435,11 +431,10 @@ generous deed immortalized in the next stable release of Godot Engine. Elgenzay Elias Nykrem Ephemeral - Eric Ellingson + Eric Walkingshaw Eric Williams Erkki Seppälä Evan Rose - Fain Faisal Alkubaisi Fancy Ants Studios Fekinox @@ -449,15 +444,15 @@ generous deed immortalized in the next stable release of Godot Engine. Francois Holland Frank FuDiggity - Gadzhi Kharkharov gamedev by Celio Game Endeavor + Gareth Knowles Gary Thomas George Marques - Gerard Ruiz Torruella + georgios katsanakis + GFizz Greg Lincoln Greg Olson - GREGORY C FEIN Greyson Richey Grid Guillaume Audirac @@ -467,7 +462,6 @@ generous deed immortalized in the next stable release of Godot Engine. Hal A helija Heribert Hirth - Hieu Thanh Hunter Jones Ian Williams Iiari @@ -484,10 +478,9 @@ generous deed immortalized in the next stable release of Godot Engine. James James A F Manley James Thomas - Jamiee H Jamie Massey + Jan Vetulani JARKKO PARVIAINEN - Jasiek Vetulani Jason Uechi Jean-Baptiste LEPESME Jeff Hungerford @@ -496,6 +489,7 @@ generous deed immortalized in the next stable release of Godot Engine. Jhon Adams Joe Klemmer John Gabriel + Jonah Branch Jonas Jonas Bernemann Jonas Rudlang @@ -507,21 +501,23 @@ generous deed immortalized in the next stable release of Godot Engine. Jon Sully Jordy Goodridge Jorge Antunes - Jorge Javier Araya Navarro + Jorge Araya Navarro Jose C. Rubio Joseph Catrambone Josh Taylor Josue David + jromkjrom Juanfran + Juan Uys Jueast Julian Murgia June Little Justin Hamilton Justin Oaksford Justin Spedding + Justin W. Flory KaDokta Kalin - Kauzig Keedong Park Keinan Powers Keith Bradner @@ -539,8 +535,8 @@ generous deed immortalized in the next stable release of Godot Engine. KsyTek Games kycho Kyle Jacobs - Kyle Szklenski Kyuppin + Lasse le Dous Laurent CHEA Laurent Tréguier Laxman Pradhan @@ -558,19 +554,16 @@ generous deed immortalized in the next stable release of Godot Engine. Malcolm Marco Lardelli Mark Jad - Mark Krenz Mark Malone Markus Martin Markus Michael Egger Martin FIbik Martin Holas - Martin Linklater Martin Trbola Marvin Mathieu Matt Edwards Matthew Booe - Max Brister Max Fiedler Maxime Blade Maxwell @@ -582,13 +575,13 @@ generous deed immortalized in the next stable release of Godot Engine. Michael Bruce-Lockhart Michael Haney MichaÅ‚ Skwarek + MidoriBunn 'tis BS Mikayla Mike Birkhead Mike Cunningham Mitchell J. Wagner Molinghu Molly Jameson - MoM MrAZIE Nathan Fish Nathaniel @@ -612,30 +605,31 @@ generous deed immortalized in the next stable release of Godot Engine. OKV Oleg Reva Oleksandr Kryvonos - Olivier Omar Delarosa + Oriol Muñoz Princep Oscar Domingo Parinya Teerakasemsuk patricio lara briones + Patrick Brock Patrick Dully Patrick Nafarrete Paul Gieske - Paul Mason PaweÅ‚ Kowal PaweÅ‚ Åyczkowski Peter Höglund + Peter Richmond Petrus Prinsloo Philip Cohoe - Phillip Zolla + Pierre Caye Piotr Góral Pipo Point08 Preethi Vaidyanathan pwab - pyacier Rad Cat Rafa Laguna Raffaele Aramo + Rami Hanano RAMupgrade Remi Rampin Rémi Verschelde @@ -652,6 +646,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ronan Ross Squires Ryan Groom + Sam Caulfield Sam Edson Samuele Zolfanelli scapegoat57 @@ -659,8 +654,9 @@ generous deed immortalized in the next stable release of Godot Engine. Scott Longley Sean Lynch Sebastian Michailidis - Sebastian Vetter SeongWan Kim + Serenitor + Sergey Sergiy Onenko Shane Shane Sicienski @@ -683,6 +679,7 @@ generous deed immortalized in the next stable release of Godot Engine. tannhauser_gate Tarch Terry + The Liquidator Theodore Lindsey TheVoiceInMyHead thomas @@ -693,8 +690,8 @@ generous deed immortalized in the next stable release of Godot Engine. Tim Erskine Tim Gleason Timothy B. MacDonald - Tobbun Tobias Bradtke + Tom Coxon Toni Duran Tony Zhao Torgeir Lilleskog @@ -712,11 +709,11 @@ generous deed immortalized in the next stable release of Godot Engine. Uther Vaughan Ling Victor - Vigilant Watch Viktor Ismagilov + Vi Watch Vladimir Savin Vladislav Smirnov - Výrus Hemomancer + Vytenis NaruÅ¡is waka nya Wayne Haak werner mendizabal @@ -725,13 +722,12 @@ generous deed immortalized in the next stable release of Godot Engine. William F Siqueira William Hogben Wyatt Goodin - Xaver Fischer + x1212 xenomat Yegor Smirnov Zack Yang Zak Stephens è•æƒŸå… - éƒæ™¨ç…œ ## Bronze donors @@ -50,8 +50,7 @@ Godot is not only an engine but an ever-growing community of users and engine developers. The main community channels are listed [on the homepage](https://godotengine.org/community). To get in touch with the engine developers, the best way is to join the -[#godotengine-devel IRC channel](https://webchat.freenode.net/?channels=godotengine-devel) -on Freenode. +[Godot Contributors Chat](https://chat.godotengine.org). To get started contributing to the project, see the [contributing guide](CONTRIBUTING.md). diff --git a/SConstruct b/SConstruct index f03fb72ff3..1fec033881 100644 --- a/SConstruct +++ b/SConstruct @@ -61,11 +61,9 @@ elif platform_arg == "javascript": # Use generic POSIX build toolchain for Emscripten. custom_tools = ["cc", "c++", "ar", "link", "textfile", "zip"] -env_base = Environment(tools=custom_tools) -if "TERM" in os.environ: - env_base["ENV"]["TERM"] = os.environ["TERM"] -env_base.AppendENVPath("PATH", os.getenv("PATH")) -env_base.AppendENVPath("PKG_CONFIG_PATH", os.getenv("PKG_CONFIG_PATH")) +# Construct the environment using the user's host env variables. +env_base = Environment(ENV=os.environ, tools=custom_tools) + env_base.disabled_modules = [] env_base.module_version_string = "" env_base.msvc = False diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index c872ae2162..02effc2001 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -909,7 +909,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust custom_features += f; } - if (p_path.ends_with(".godot")) { + if (p_path.ends_with(".godot") || p_path.ends_with("override.cfg")) { return _save_settings_text(p_path, props, p_custom, custom_features); } else if (p_path.ends_with(".binary")) { return _save_settings_binary(p_path, props, p_custom, custom_features); diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 47c75cfa28..e7a77384da 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -566,7 +566,7 @@ struct _OSCoreBindImg { void _OS::print_all_textures_by_size() { List<_OSCoreBindImg> imgs; - int total = 0; + uint64_t total = 0; { List<Ref<Resource>> rsrc; ResourceCache::get_cached_resources(&rsrc); diff --git a/core/os/thread.cpp b/core/os/thread.cpp index aea370787d..73e31bdb3d 100644 --- a/core/os/thread.cpp +++ b/core/os/thread.cpp @@ -41,9 +41,13 @@ void (*Thread::set_priority_func)(Thread::Priority) = nullptr; void (*Thread::init_func)() = nullptr; void (*Thread::term_func)() = nullptr; -Thread::ID Thread::main_thread_id = 1; -SafeNumeric<Thread::ID> Thread::last_thread_id{ 1 }; -thread_local Thread::ID Thread::caller_id = 1; +uint64_t Thread::_thread_id_hash(const std::thread::id &p_t) { + static std::hash<std::thread::id> hasher; + return hasher(p_t); +} + +Thread::ID Thread::main_thread_id = _thread_id_hash(std::this_thread::get_id()); +thread_local Thread::ID Thread::caller_id = 0; void Thread::_set_platform_funcs( Error (*p_set_name_func)(const String &), @@ -57,7 +61,7 @@ void Thread::_set_platform_funcs( } void Thread::callback(Thread *p_self, const Settings &p_settings, Callback p_callback, void *p_userdata) { - Thread::caller_id = p_self->id; + Thread::caller_id = _thread_id_hash(p_self->thread.get_id()); if (set_priority_func) { set_priority_func(p_settings.priority); } @@ -73,7 +77,7 @@ void Thread::callback(Thread *p_self, const Settings &p_settings, Callback p_cal } void Thread::start(Thread::Callback p_callback, void *p_user, const Settings &p_settings) { - if (id != 0) { + if (id != _thread_id_hash(std::thread::id())) { #ifdef DEBUG_ENABLED WARN_PRINT("A Thread object has been re-started without wait_to_finish() having been called on it. Please do so to ensure correct cleanup of the thread."); #endif @@ -81,22 +85,22 @@ void Thread::start(Thread::Callback p_callback, void *p_user, const Settings &p_ std::thread empty_thread; thread.swap(empty_thread); } - id = last_thread_id.increment(); std::thread new_thread(&Thread::callback, this, p_settings, p_callback, p_user); thread.swap(new_thread); + id = _thread_id_hash(thread.get_id()); } bool Thread::is_started() const { - return id != 0; + return id != _thread_id_hash(std::thread::id()); } void Thread::wait_to_finish() { - if (id != 0) { + if (id != _thread_id_hash(std::thread::id())) { ERR_FAIL_COND_MSG(id == get_caller_id(), "A Thread can't wait for itself to finish."); thread.join(); std::thread empty_thread; thread.swap(empty_thread); - id = 0; + id = _thread_id_hash(std::thread::id()); } } @@ -108,8 +112,12 @@ Error Thread::set_name(const String &p_name) { return ERR_UNAVAILABLE; } +Thread::Thread() { + caller_id = _thread_id_hash(std::this_thread::get_id()); +} + Thread::~Thread() { - if (id != 0) { + if (id != _thread_id_hash(std::thread::id())) { #ifdef DEBUG_ENABLED WARN_PRINT("A Thread object has been destroyed without wait_to_finish() having been called on it. Please do so to ensure correct cleanup of the thread."); #endif diff --git a/core/os/thread.h b/core/os/thread.h index 76f5be182e..17ac82c650 100644 --- a/core/os/thread.h +++ b/core/os/thread.h @@ -62,9 +62,10 @@ private: friend class Main; static ID main_thread_id; - static SafeNumeric<Thread::ID> last_thread_id; - ID id = 0; + static uint64_t _thread_id_hash(const std::thread::id &p_t); + + ID id = _thread_id_hash(std::thread::id()); static thread_local ID caller_id; std::thread thread; @@ -97,6 +98,7 @@ public: ///< waits until thread is finished, and deallocates it. void wait_to_finish(); + Thread(); ~Thread(); #else _FORCE_INLINE_ ID get_id() const { return 0; } diff --git a/core/variant/variant_construct.cpp b/core/variant/variant_construct.cpp index 52f9f6060e..f0c9e52b46 100644 --- a/core/variant/variant_construct.cpp +++ b/core/variant/variant_construct.cpp @@ -773,6 +773,7 @@ void Variant::_unregister_variant_constructors() { } void Variant::construct(Variant::Type p_type, Variant &base, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { + ERR_FAIL_INDEX(p_type, Variant::VARIANT_MAX); uint32_t s = construct_data[p_type].size(); for (uint32_t i = 0; i < s; i++) { int argc = construct_data[p_type][i].argument_count; diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index 31e6ea5e54..fa6cf372ce 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -224,6 +224,8 @@ <member name="heightmap_deep_parallax" type="bool" setter="set_heightmap_deep_parallax" getter="is_heightmap_deep_parallax_enabled"> </member> <member name="heightmap_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> + If [code]true[/code], height mapping is enabled (also called "parallax mapping" or "depth mapping"). See also [member normal_enabled]. + [b]Note:[/b] Height mapping is not supported if triplanar mapping is used on the same material. The value of [member heightmap_enabled] will be ignored if [member uv1_triplanar] is enabled. </member> <member name="heightmap_flip_binormal" type="bool" setter="set_heightmap_deep_parallax_flip_binormal" getter="get_heightmap_deep_parallax_flip_binormal"> </member> diff --git a/doc/classes/MarginContainer.xml b/doc/classes/MarginContainer.xml index c8eebd4677..a51632d5f1 100644 --- a/doc/classes/MarginContainer.xml +++ b/doc/classes/MarginContainer.xml @@ -5,21 +5,23 @@ </brief_description> <description> Adds a top, left, bottom, and right margin to all [Control] nodes that are direct children of the container. To control the [MarginContainer]'s margin, use the [code]margin_*[/code] theme properties listed below. - [b]Note:[/b] Be careful, [Control] margin values are different than the constant margin values. If you want to change the custom margin values of the [MarginContainer] by code, you should use the following examples: + [b]Note:[/b] Be careful, [Control] margin values are different from the constant margin values. If you want to change the custom margin values of the [MarginContainer] by code, you should use the following examples: [codeblocks] [gdscript] + # This code sample assumes the current script is extending MarginContainer. var margin_value = 100 - set("custom_constants/margin_top", margin_value) - set("custom_constants/margin_left", margin_value) - set("custom_constants/margin_bottom", margin_value) - set("custom_constants/margin_right", margin_value) + add_theme_constant_override("margin_top", margin_value) + add_theme_constant_override("margin_left", margin_value) + add_theme_constant_override("margin_bottom", margin_value) + add_theme_constant_override("margin_right", margin_value) [/gdscript] [csharp] + // This code sample assumes the current script is extending MarginContainer. int marginValue = 100; - Set("custom_constants/margin_top", marginValue); - Set("custom_constants/margin_left", marginValue); - Set("custom_constants/margin_bottom", marginValue); - Set("custom_constants/margin_right", marginValue); + AddThemeConstantOverride("margin_top", marginValue); + AddThemeConstantOverride("margin_left", marginValue); + AddThemeConstantOverride("margin_bottom", marginValue); + AddThemeConstantOverride("margin_right", marginValue); [/csharp] [/codeblocks] </description> diff --git a/doc/classes/PhysicsServer2D.xml b/doc/classes/PhysicsServer2D.xml index 1fa82adb7a..701a430538 100644 --- a/doc/classes/PhysicsServer2D.xml +++ b/doc/classes/PhysicsServer2D.xml @@ -58,7 +58,7 @@ <return type="RID"> </return> <description> - Creates an [Area2D]. + 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. </description> </method> <method name="area_get_canvas_instance_id" qualifiers="const"> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index a1e5e60b4a..3aa3e12e74 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -169,6 +169,7 @@ </return> <description> Saves the configuration to the [code]project.godot[/code] file. + [b]Note:[/b] This method is intended to be used by editor plugins, as modified [ProjectSettings] can't be loaded back in the running app. If you want to change project settings in exported projects, use [method save_custom] to save [code]override.cfg[/code] file. </description> </method> <method name="save_custom"> @@ -177,7 +178,7 @@ <argument index="0" name="file" type="String"> </argument> <description> - Saves the configuration to a custom file. The file extension must be [code].godot[/code] (to save in text-based [ConfigFile] format) or [code].binary[/code] (to save in binary format). + Saves the configuration to a custom file. The file extension must be [code].godot[/code] (to save in text-based [ConfigFile] format) or [code].binary[/code] (to save in binary format). You can also save [code]override.cfg[/code] file, which is also text, but can be used in exported projects unlike other formats. </description> </method> <method name="set_initial_value"> @@ -487,7 +488,7 @@ Position offset for tooltips, relative to the mouse cursor's hotspot. </member> <member name="display/window/dpi/allow_hidpi" type="bool" setter="" getter="" default="false"> - If [code]true[/code], allows HiDPI display on Windows and macOS. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there. + If [code]true[/code], allows HiDPI display on Windows, macOS, and the HTML5 platform. This setting has no effect on desktop Linux, as DPI-awareness fallbacks are not supported there. </member> <member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter="" default="true"> If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms. diff --git a/doc/classes/RayCast3D.xml b/doc/classes/RayCast3D.xml index d24e86a08b..681cfcd4ce 100644 --- a/doc/classes/RayCast3D.xml +++ b/doc/classes/RayCast3D.xml @@ -136,6 +136,13 @@ <member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="1"> The ray's collision mask. Only objects in at least one collision layer enabled in the mask will be detected. See [url=https://docs.godotengine.org/en/latest/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information. </member> + <member name="debug_shape_custom_color" type="Color" setter="set_debug_shape__custom_color" getter="get_debug_shape_custom_color" default="Color( 0.0, 0.0, 0.0 )"> + The custom color to use to draw the shape in the editor and at run-time if [b]Visible Collision Shapes[/b] is enabled in the [b]Debug[/b] menu. This color will be highlighted at run-time if the [RayCast3D] is colliding with something. + If set to [code]Color(0.0, 0.0, 0.0)[/code] (by default), the color set in [member ProjectSettings.debug/shapes/collision/shape_color] is used. + </member> + <member name="debug_shape_thickness" type="int" setter="set_debug_shape_thickness" getter="get_debug_shape_thickness" default="1"> + If set to [code]1[/code], a line is used as the debug shape. Otherwise, a truncated pyramid is drawn to represent the [RayCast3D]. Requires [b]Visible Collision Shapes[/b] to be enabled in the [b]Debug[/b] menu for the debug shape to be visible at run-time. + </member> <member name="enabled" type="bool" setter="set_enabled" getter="is_enabled" default="true"> If [code]true[/code], collisions will be reported. </member> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index dfd4a5c2d5..d2b95fda20 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -2704,11 +2704,14 @@ <description> Copies the viewport to a region of the screen specified by [code]rect[/code]. If [method viewport_set_render_direct_to_screen] is [code]true[/code], then the viewport does not use a framebuffer and the contents of the viewport are rendered directly to screen. However, note that the root viewport is drawn last, therefore it will draw over the screen. Accordingly, you must set the root viewport to an area that does not cover the area that you have attached this viewport to. For example, you can set the root viewport to not render at all with the following code: - [codeblock] + FIXME: The method seems to be non-existent. + [codeblocks] + [gdscript] func _ready(): get_viewport().set_attach_to_screen_rect(Rect2()) $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600)) - [/codeblock] + [/gdscript] + [/codeblocks] Using this can result in significant optimization, especially on lower-end devices. However, it comes at the cost of having to manage your viewports manually. For a further optimization see, [method viewport_set_render_direct_to_screen]. </description> </method> diff --git a/doc/classes/RichTextEffect.xml b/doc/classes/RichTextEffect.xml index 726b26fbc7..edab35f162 100644 --- a/doc/classes/RichTextEffect.xml +++ b/doc/classes/RichTextEffect.xml @@ -6,10 +6,16 @@ <description> A custom effect for use with [RichTextLabel]. [b]Note:[/b] For a [RichTextEffect] to be usable, a BBCode tag must be defined as a member variable called [code]bbcode[/code] in the script. - [codeblock] + [codeblocks] + [gdscript] # The RichTextEffect will be usable like this: `[example]Some text[/example]` var bbcode = "example" - [/codeblock] + [/gdscript] + [csharp] + // The RichTextEffect will be usable like this: `[example]Some text[/example]` + public string bbcode = "example"; + [/csharp] + [/codeblocks] [b]Note:[/b] As soon as a [RichTextLabel] contains at least one [RichTextEffect], it will continuously process the effect unless the project is paused. This may impact battery life negatively. </description> <tutorials> diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index c54e2f4b88..72a42202c7 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -69,12 +69,22 @@ <description> Returns a [SceneTreeTimer] which will [signal SceneTreeTimer.timeout] after the given time in seconds elapsed in this [SceneTree]. If [code]process_always[/code] is set to [code]false[/code], pausing the [SceneTree] will also pause the timer. Commonly used to create a one-shot delay timer as in the following example: - [codeblock] + [codeblocks] + [gdscript] func some_function(): print("start") yield(get_tree().create_timer(1.0), "timeout") print("end") - [/codeblock] + [/gdscript] + [csharp] + public async void SomeFunction() + { + GD.Print("start"); + await ToSignal(GetTree().CreateTimer(1.0f), "timeout"); + GD.Print("end"); + } + [/csharp] + [/codeblocks] The timer will be automatically freed after its time elapses. </description> </method> diff --git a/doc/classes/SceneTreeTimer.xml b/doc/classes/SceneTreeTimer.xml index a4a83fa65b..b223bf6821 100644 --- a/doc/classes/SceneTreeTimer.xml +++ b/doc/classes/SceneTreeTimer.xml @@ -6,12 +6,22 @@ <description> A one-shot timer managed by the scene tree, which emits [signal timeout] on completion. See also [method SceneTree.create_timer]. As opposed to [Timer], it does not require the instantiation of a node. Commonly used to create a one-shot delay timer as in the following example: - [codeblock] + [codeblocks] + [gdscript] func some_function(): print("Timer started.") yield(get_tree().create_timer(1.0), "timeout") print("Timer ended.") - [/codeblock] + [/gdscript] + [csharp] + public async void SomeFunction() + { + GD.Print("Timer started."); + await ToSignal(GetTree().CreateTimer(1.0f), "timeout"); + GD.Print("Timer ended."); + } + [/csharp] + [/codeblocks] </description> <tutorials> </tutorials> diff --git a/doc/classes/ScriptCreateDialog.xml b/doc/classes/ScriptCreateDialog.xml index aa60ecb12b..7185213c44 100644 --- a/doc/classes/ScriptCreateDialog.xml +++ b/doc/classes/ScriptCreateDialog.xml @@ -5,12 +5,24 @@ </brief_description> <description> The [ScriptCreateDialog] creates script files according to a given template for a given scripting language. The standard use is to configure its fields prior to calling one of the [method Window.popup] methods. - [codeblock] + [codeblocks] + [gdscript] func _ready(): - dialog.config("Node", "res://new_node.gd") # For in-engine types - dialog.config("\"res://base_node.gd\"", "res://derived_node.gd") # For script types + var dialog = ScriptCreateDialog.new(); + dialog.config("Node", "res://new_node.gd") # For in-engine types. + dialog.config("\"res://base_node.gd\"", "res://derived_node.gd") # For script types. dialog.popup_centered() - [/codeblock] + [/gdscript] + [csharp] + public override void _Ready() + { + var dialog = new ScriptCreateDialog(); + dialog.Config("Node", "res://NewNode.cs"); // For in-engine types. + dialog.Config("\"res://BaseNode.cs\"", "res://DerivedNode.cs"); // For script types. + dialog.PopupCentered(); + } + [/csharp] + [/codeblocks] </description> <tutorials> </tutorials> diff --git a/doc/classes/SpinBox.xml b/doc/classes/SpinBox.xml index a08d4f5b44..7e2481f458 100644 --- a/doc/classes/SpinBox.xml +++ b/doc/classes/SpinBox.xml @@ -6,13 +6,22 @@ <description> SpinBox is a numerical input text field. It allows entering integers and floats. [b]Example:[/b] - [codeblock] + [codeblocks] + [gdscript] var spin_box = SpinBox.new() add_child(spin_box) var line_edit = spin_box.get_line_edit() line_edit.context_menu_enabled = false spin_box.align = LineEdit.ALIGN_RIGHT - [/codeblock] + [/gdscript] + [csharp] + var spinBox = new SpinBox(); + AddChild(spinBox); + var lineEdit = spinBox.GetLineEdit(); + lineEdit.ContextMenuEnabled = false; + spinBox.Align = LineEdit.AlignEnum.Right; + [/csharp] + [/codeblocks] The above code will create a [SpinBox], disable context menu on it and set the text alignment to right. See [Range] class for more options over the [SpinBox]. [b]Note:[/b] [SpinBox] relies on an underlying [LineEdit] node. To theme a [SpinBox]'s background, add theme items for [LineEdit] and customize them. diff --git a/doc/classes/Sprite2D.xml b/doc/classes/Sprite2D.xml index 83235f0991..e4df753674 100644 --- a/doc/classes/Sprite2D.xml +++ b/doc/classes/Sprite2D.xml @@ -15,12 +15,29 @@ </return> <description> Returns a [Rect2] representing the Sprite2D's boundary in local coordinates. Can be used to detect if the Sprite2D was clicked. Example: - [codeblock] + [codeblocks] + [gdscript] func _input(event): if event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_LEFT: if get_rect().has_point(to_local(event.position)): print("A click!") - [/codeblock] + [/gdscript] + [csharp] + public override void _Input(InputEvent inputEvent) + { + if (inputEvent is InputEventMouseButton inputEventMouse) + { + if (inputEventMouse.Pressed && inputEventMouse.ButtonIndex == (int)ButtonList.Left) + { + if (GetRect().HasPoint(ToLocal(inputEventMouse.Position))) + { + GD.Print("A click!"); + } + } + } + } + [/csharp] + [/codeblocks] </description> </method> <method name="is_pixel_opaque" qualifiers="const"> diff --git a/doc/classes/StreamPeer.xml b/doc/classes/StreamPeer.xml index a73d3c8212..a1b858acf6 100644 --- a/doc/classes/StreamPeer.xml +++ b/doc/classes/StreamPeer.xml @@ -212,9 +212,14 @@ <description> Puts a zero-terminated ASCII string into the stream prepended by a 32-bit unsigned integer representing its size. Note: To put an ASCII string without prepending its size, you can use [method put_data]: - [codeblock] + [codeblocks] + [gdscript] put_data("Hello world".to_ascii()) - [/codeblock] + [/gdscript] + [csharp] + PutData("Hello World".ToAscii()); + [/csharp] + [/codeblocks] </description> </method> <method name="put_u16"> @@ -261,9 +266,14 @@ <description> Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits unsigned integer representing its size. Note: To put an UTF-8 string without prepending its size, you can use [method put_data]: - [codeblock] + [codeblocks] + [gdscript] put_data("Hello world".to_utf8()) - [/codeblock] + [/gdscript] + [csharp] + PutData("Hello World".ToUTF8()); + [/csharp] + [/codeblocks] </description> </method> <method name="put_var"> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index c03f6357ab..a90bcd9eb7 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -163,11 +163,15 @@ <description> Returns the index of the [b]first[/b] case-sensitive occurrence of the specified string in this instance, or [code]-1[/code]. Optionally, the starting search index can be specified, continuing to the end of the string. [b]Note:[/b] If you just want to know whether a string contains a substring, use the [code]in[/code] operator as follows: - [codeblock] - # Will evaluate to `false`. - if "i" in "team": - pass - [/codeblock] + [codeblocks] + [gdscript] + print("i" in "team") # Will print `false`. + [/gdscript] + [csharp] + // C# has no in operator, but we can use `Contains()`. + GD.Print("team".Contains("i")); // Will print `false`. + [/csharp] + [/codeblocks] </description> </method> <method name="findn"> @@ -354,9 +358,14 @@ <description> Return a [String] which is the concatenation of the [code]parts[/code]. The separator between elements is the string providing this method. Example: - [codeblock] + [codeblocks] + [gdscript] print(", ".join(["One", "Two", "Three", "Four"])) - [/codeblock] + [/gdscript] + [csharp] + GD.Print(String.Join(",", new string[] {"One", "Two", "Three", "Four"})); + [/csharp] + [/codeblocks] </description> </method> <method name="json_escape"> @@ -654,13 +663,18 @@ The splits in the returned array are sorted in the same order as the original string, from left to right. If [code]maxsplit[/code] is specified, it defines the number of splits to do from the right up to [code]maxsplit[/code]. The default value of 0 means that all items are split, thus giving the same result as [method split]. Example: - [codeblock] + [codeblocks] + [gdscript] var some_string = "One,Two,Three,Four" var some_array = some_string.rsplit(",", true, 1) print(some_array.size()) # Prints 2 print(some_array[0]) # Prints "Four" print(some_array[1]) # Prints "Three,Two,One" - [/codeblock] + [/gdscript] + [csharp] + // There is no Rsplit. + [/csharp] + [/codeblocks] </description> </method> <method name="rstrip"> @@ -723,13 +737,21 @@ Splits the string by a [code]delimiter[/code] string and returns an array of the substrings. The [code]delimiter[/code] can be of any length. If [code]maxsplit[/code] is specified, it defines the number of splits to do from the left up to [code]maxsplit[/code]. The default value of [code]0[/code] means that all items are split. Example: - [codeblock] + [codeblocks] + [gdscript] var some_string = "One,Two,Three,Four" var some_array = some_string.split(",", true, 1) print(some_array.size()) # Prints 2 - print(some_array[0]) # Prints "One" - print(some_array[1]) # Prints "Two,Three,Four" - [/codeblock] + print(some_array[0]) # Prints "Four" + print(some_array[1]) # Prints "Three,Two,One" + [/gdscript] + [csharp] + var someString = "One,Two,Three,Four"; + var someArray = someString.Split(",", true); // This is as close as it gets to Godots API. + GD.Print(someArray[0]); // Prints "Four" + GD.Print(someArray[1]); // Prints "Three,Two,One" + [/csharp] + [/codeblocks] If you need to split strings with more complex rules, use the [RegEx] class instead. </description> </method> diff --git a/doc/classes/SurfaceTool.xml b/doc/classes/SurfaceTool.xml index 331de4284e..d145b4ce97 100644 --- a/doc/classes/SurfaceTool.xml +++ b/doc/classes/SurfaceTool.xml @@ -5,13 +5,22 @@ </brief_description> <description> The [SurfaceTool] is used to construct a [Mesh] by specifying vertex attributes individually. It can be used to construct a [Mesh] from a script. All properties except indices need to be added before calling [method add_vertex]. For example, to add vertex colors and UVs: - [codeblock] + [codeblocks] + [gdscript] var st = SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) st.set_color(Color(1, 0, 0)) st.set_uv(Vector2(0, 0)) st.set_vertex(Vector3(0, 0, 0)) - [/codeblock] + [/gdscript] + [csharp] + var st = new SurfaceTool(); + st.Begin(Mesh.PrimitiveType.Triangles); + st.SetColor(new Color(1, 0, 0)); + st.SetUv(new Vector2(0, 0)); + st.SetVertex(new Vector3(0, 0, 0)); + [/csharp] + [/codeblocks] The above [SurfaceTool] now contains one vertex of a triangle which has a UV coordinate and a specified [Color]. If another vertex were added without calling [method set_uv] or [method set_color], then the last values would be used. Vertex attributes must be passed [b]before[/b] calling [method add_vertex]. Failure to do so will result in an error when committing the vertex information to a mesh. Additionally, the attributes used before the first vertex is added determine the format of the mesh. For example, if you only add UVs to the first vertex, you cannot add color to any of the subsequent vertices. diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index 1d50cd60e5..6232a4e146 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -402,13 +402,24 @@ <description> Perform a search inside the text. Search flags can be specified in the [enum SearchFlags] enum. Returns an empty [code]Dictionary[/code] if no result was found. Otherwise, returns a [code]Dictionary[/code] containing [code]line[/code] and [code]column[/code] entries, e.g: - [codeblock] - var result = search(key, flags, line, column) - if !result.is_empty(): + [codeblocks] + [gdscript] + var result = search("print", SEARCH_WHOLE_WORDS, 0, 0) + if !result.empty(): # Result found. var line_number = result.line var column_number = result.column - [/codeblock] + [/gdscript] + [csharp] + int[] result = Search("print", (uint)TextEdit.SearchFlags.WholeWords, 0, 0); + if (result.Length > 0) + { + // Result found. + int lineNumber = result[(int)TextEdit.SearchResult.Line]; + int columnNumber = result[(int)TextEdit.SearchResult.Column]; + } + [/csharp] + [/codeblocks] </description> </method> <method name="select"> diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index a12ef614e3..c0ee004ca6 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -172,12 +172,22 @@ [b]Note:[/b] Data such as navigation polygons and collision shapes are not immediately updated for performance reasons. If you need these to be immediately updated, you can call [method update_dirty_quadrants]. Overriding this method also overrides it internally, allowing custom logic to be implemented when tiles are placed/removed: - [codeblock] + [codeblocks] + [gdscript] func set_cell(x, y, tile, flip_x=false, flip_y=false, transpose=false, autotile_coord=Vector2()) # Write your custom logic here. # To call the default method: .set_cell(x, y, tile, flip_x, flip_y, transpose, autotile_coord) - [/codeblock] + [/gdscript] + [csharp] + public void SetCell(int x, int y, int tile, bool flipX = false, bool flipY = false, bool transpose = false, Vector2 autotileCoord = new Vector2()) + { + // Write your custom logic here. + // To call the default method: + base.SetCell(x, y, tile, flipX, flipY, transpose, autotileCoord); + } + [/csharp] + [/codeblocks] </description> </method> <method name="set_cellv"> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 8502707096..a09f1bf470 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -6,16 +6,30 @@ <description> This shows a tree of items that can be selected, expanded and collapsed. The tree can have multiple columns with custom controls like text editing, buttons and popups. It can be useful for structured displays and interactions. Trees are built via code, using [TreeItem] objects to create the structure. They have a single root but multiple roots can be simulated if a dummy hidden root is added. - [codeblock] + [codeblocks] + [gdscript] func _ready(): var tree = Tree.new() var root = tree.create_item() - tree.set_hide_root(true) + tree.hide_root = true var child1 = tree.create_item(root) var child2 = tree.create_item(root) var subchild1 = tree.create_item(child1) subchild1.set_text(0, "Subchild1") - [/codeblock] + [/gdscript] + [csharp] + public override void _Ready() + { + var tree = new Tree(); + TreeItem root = tree.CreateItem(); + tree.HideRoot = true; + TreeItem child1 = tree.CreateItem(root); + TreeItem child2 = tree.CreateItem(root); + TreeItem subchild1 = tree.CreateItem(child1); + subchild1.SetText(0, "Subchild1"); + } + [/csharp] + [/codeblocks] To iterate over all the [TreeItem] objects in a [Tree] object, use [method TreeItem.get_next] and [method TreeItem.get_children] after getting the root through [method get_root]. You can use [method Object.free] on a [TreeItem] to remove it from the [Tree]. </description> <tutorials> @@ -152,13 +166,26 @@ </return> <description> Returns the currently edited item. Can be used with [signal item_edited] to get the item that was modified. - [codeblock] + [codeblocks] + [gdscript] func _ready(): $Tree.item_edited.connect(on_Tree_item_edited) func on_Tree_item_edited(): print($Tree.get_edited()) # This item just got edited (e.g. checked). - [/codeblock] + [/gdscript] + [csharp] + public override void _Ready() + { + GetNode<Tree>("Tree").ItemEdited += OnTreeItemEdited; + } + + public void OnTreeItemEdited() + { + GD.Print(GetNode<Tree>("Tree").GetEdited()); // This item just got edited (e.g. checked). + } + [/csharp] + [/codeblocks] </description> </method> <method name="get_edited_column" qualifiers="const"> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index 56ccaaf383..b32bb1e2d9 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -7,13 +7,22 @@ Tweens are useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them. [Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween] node; it would be difficult to do the same thing with an [AnimationPlayer] node. Here is a brief usage example that makes a 2D node move smoothly between two positions: - [codeblock] + [codeblocks] + [gdscript] var tween = get_node("Tween") tween.interpolate_property($Node2D, "position", Vector2(0, 0), Vector2(100, 100), 1, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) tween.start() - [/codeblock] + [/gdscript] + [csharp] + var tween = GetNode<Tween>("Tween"); + tween.InterpolateProperty(GetNode<Node2D>("Node2D"), "position", + new Vector2(0, 0), new Vector2(100, 100), 1, + Tween.TransitionType.Linear, Tween.EaseType.InOut); + tween.Start(); + [/csharp] + [/codeblocks] Many methods require a property name, such as [code]"position"[/code] above. You can find the correct property name by hovering over the property in the Inspector. You can also provide the components of a property directly by using [code]"property:component"[/code] (eg. [code]position:x[/code]), where it would only apply to that particular component. Many of the methods accept [code]trans_type[/code] and [code]ease_type[/code]. The first accepts an [enum TransitionType] constant, and refers to the way the timing of the animation is handled (see [url=https://easings.net/]easings.net[/url] for some examples). The second accepts an [enum EaseType] constant, and controls where the [code]trans_type[/code] is applied to the interpolation (in the beginning, the end, or both). If you don't know which transition and easing to pick, you can try different [enum TransitionType] constants with [constant EASE_IN_OUT], and use the one that looks best. [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/tween_cheatsheet.png]Tween easing and transition types cheatsheet[/url] diff --git a/doc/classes/UDPServer.xml b/doc/classes/UDPServer.xml index aabfed85f0..0fc00f67f8 100644 --- a/doc/classes/UDPServer.xml +++ b/doc/classes/UDPServer.xml @@ -7,8 +7,9 @@ A simple server that opens a UDP socket and returns connected [PacketPeerUDP] upon receiving new packets. See also [method PacketPeerUDP.connect_to_host]. After starting the server ([method listen]), you will need to [method poll] it at regular intervals (e.g. inside [method Node._process]) for it to process new packets, delivering them to the appropriate [PacketPeerUDP], and taking new connections. Below a small example of how it can be used: - [codeblock] - # server.gd + [codeblocks] + [gdscript] + class_name Server extends Node var server := UDPServer.new() @@ -21,20 +22,57 @@ server.poll() # Important! if server.is_connection_available(): var peer : PacketPeerUDP = server.take_connection() - var pkt = peer.get_packet() + var packet = peer.get_packet() print("Accepted peer: %s:%s" % [peer.get_packet_ip(), peer.get_packet_port()]) - print("Received data: %s" % [pkt.get_string_from_utf8()]) + print("Received data: %s" % [packet.get_string_from_utf8()]) # Reply so it knows we received the message. - peer.put_packet(pkt) + peer.put_packet(packet) # Keep a reference so we can keep contacting the remote peer. peers.append(peer) for i in range(0, peers.size()): pass # Do something with the connected peers. + [/gdscript] + [csharp] + using Godot; + using System; + using System.Collections.Generic; - [/codeblock] - [codeblock] - # client.gd + public class Server : Node + { + public UDPServer Server = new UDPServer(); + public List<PacketPeerUDP> Peers = new List<PacketPeerUDP>(); + + public override void _Ready() + { + Server.Listen(4242); + } + + public override void _Process(float delta) + { + Server.Poll(); // Important! + if (Server.IsConnectionAvailable()) + { + PacketPeerUDP peer = Server.TakeConnection(); + byte[] packet = peer.GetPacket(); + GD.Print($"Accepted Peer: {peer.GetPacketIp()}:{peer.GetPacketPort()}"); + GD.Print($"Received Data: {packet.GetStringFromUTF8()}"); + // Reply so it knows we received the message. + peer.PutPacket(packet); + // Keep a reference so we can keep contacting the remote peer. + Peers.Add(peer); + } + foreach (var peer in Peers) + { + // Do something with the peers. + } + } + } + [/csharp] + [/codeblocks] + [codeblocks] + [gdscript] + class_name Client extends Node var udp := PacketPeerUDP.new() @@ -50,7 +88,37 @@ if udp.get_available_packet_count() > 0: print("Connected: %s" % udp.get_packet().get_string_from_utf8()) connected = true - [/codeblock] + [/gdscript] + [csharp] + using Godot; + using System; + + public class Client : Node + { + public PacketPeerUDP Udp = new PacketPeerUDP(); + public bool Connected = false; + + public override void _Ready() + { + Udp.ConnectToHost("127.0.0.1", 4242); + } + + public override void _Process(float delta) + { + if (!Connected) + { + // Try to contact server + Udp.PutPacket("The Answer Is..42!".ToUTF8()); + } + if (Udp.GetAvailablePacketCount() > 0) + { + GD.Print($"Connected: {Udp.GetPacket().GetStringFromUTF8()}"); + Connected = true; + } + } + } + [/csharp] + [/codeblocks] </description> <tutorials> </tutorials> diff --git a/doc/classes/UndoRedo.xml b/doc/classes/UndoRedo.xml index e8124d0e6a..a0330de4fa 100644 --- a/doc/classes/UndoRedo.xml +++ b/doc/classes/UndoRedo.xml @@ -7,7 +7,8 @@ Helper to manage undo/redo operations in the editor or custom tools. It works by registering methods and property changes inside "actions". Common behavior is to create an action, then add do/undo calls to functions or property changes, then committing the action. Here's an example on how to add an action to the Godot editor's own [UndoRedo], from a plugin: - [codeblock] + [codeblocks] + [gdscript] var undo_redo = get_undo_redo() # Method of EditorPlugin. func do_something(): @@ -24,7 +25,37 @@ undo_redo.add_do_property(node, "position", Vector2(100,100)) undo_redo.add_undo_property(node, "position", node.position) undo_redo.commit_action() - [/codeblock] + [/gdscript] + [csharp] + public UndoRedo UndoRedo; + + public override void _Ready() + { + UndoRedo = GetUndoRedo(); // Method of EditorPlugin. + } + + public void DoSomething() + { + // Put your code here. + } + + public void UndoSomething() + { + // Put here the code that reverts what's done by "DoSomething()". + } + + private void OnMyButtonPressed() + { + var node = GetNode<Node2D>("MyNode2D"); + UndoRedo.CreateAction("Move the node"); + UndoRedo.AddDoMethod(this, nameof(DoSomething)); + UndoRedo.AddUndoMethod(this, nameof(UndoSomething)); + UndoRedo.AddDoProperty(node, "position", new Vector2(100, 100)); + UndoRedo.AddUndoProperty(node, "position", node.Position); + UndoRedo.CommitAction(); + } + [/csharp] + [/codeblocks] [method create_action], [method add_do_method], [method add_undo_method], [method add_do_property], [method add_undo_property], and [method commit_action] should be called one after the other, like in the example. Not doing so could lead to crashes. If you don't need to register a method, you can leave [method add_do_method] and [method add_undo_method] out; the same goes for properties. You can also register more than one method/property. </description> diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h index a76520dcdb..9d6be1a802 100644 --- a/drivers/dummy/rasterizer_dummy.h +++ b/drivers/dummy/rasterizer_dummy.h @@ -674,7 +674,7 @@ public: void render_info_end_capture() override {} int get_captured_render_info(RS::RenderInfo p_info) override { return 0; } - int get_render_info(RS::RenderInfo p_info) override { return 0; } + uint64_t get_render_info(RS::RenderInfo p_info) override { return 0; } String get_video_adapter_name() const override { return String(); } String get_video_adapter_vendor() const override { return String(); } diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index c564cee757..ad740efec4 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -1705,7 +1705,7 @@ VulkanContext::~VulkanContext() { vkDestroySemaphore(device, image_ownership_semaphores[i], nullptr); } } - if (inst_initialized && use_validation_layers) { + if (inst_initialized && enabled_debug_utils) { DestroyDebugUtilsMessengerEXT(inst, dbg_messenger, nullptr); } vkDestroyDevice(device, nullptr); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 934c6b95a4..804f02765c 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -5885,7 +5885,7 @@ AnimationTrackEditor::AnimationTrackEditor() { optimize_max_angle->set_value(22); optimize_dialog->get_ok_button()->set_text(TTR("Optimize")); - optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_CLEAN_UP_ANIMATION_CONFIRM)); + optimize_dialog->connect("confirmed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed), varray(EDIT_OPTIMIZE_ANIMATION_CONFIRM)); // diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index be2b98bf1a..c92e94270e 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -343,7 +343,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da DebuggerMarshalls::ResourceUsage usage; usage.deserialize(p_data); - int total = 0; + uint64_t total = 0; for (List<DebuggerMarshalls::ResourceInfo>::Element *E = usage.infos.front(); E; E = E->next()) { TreeItem *it = vmem_tree->create_item(root); diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp index 07edae833d..d80003a12a 100644 --- a/editor/fileserver/editor_file_server.cpp +++ b/editor/fileserver/editor_file_server.cpp @@ -43,7 +43,7 @@ void EditorFileServer::_close_client(ClientData *cd) { cd->connection->disconnect_from_host(); { MutexLock lock(cd->efs->wait_mutex); - cd->efs->to_wait.insert(&cd->thread); + cd->efs->to_wait.insert(cd->thread); } while (cd->files.size()) { memdelete(cd->files.front()->get()); @@ -278,7 +278,8 @@ void EditorFileServer::_thread_start(void *s) { cd->connection = self->server->take_connection(); cd->efs = self; cd->quit = false; - cd->thread.start(_subthread_start, cd); + cd->thread = memnew(Thread); + cd->thread->start(_subthread_start, cd); } } diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h index e4c8327d76..8ffd4f9692 100644 --- a/editor/fileserver/editor_file_server.h +++ b/editor/fileserver/editor_file_server.h @@ -47,7 +47,7 @@ class EditorFileServer : public Object { }; struct ClientData { - Thread thread; + Thread *thread; Ref<StreamPeerTCP> connection; Map<int, FileAccess *> files; EditorFileServer *efs = nullptr; diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index e6b99fa63f..16eefb1ad3 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -198,7 +198,11 @@ void EditorNode3DGizmo::add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard, } void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard, const Color &p_modulate) { - if (p_lines.is_empty()) { + add_vertices(p_lines, p_material, Mesh::PRIMITIVE_LINES, p_billboard, p_modulate); +} + +void EditorNode3DGizmo::add_vertices(const Vector<Vector3> &p_vertices, const Ref<Material> &p_material, Mesh::PrimitiveType p_primitive_type, bool p_billboard, const Color &p_modulate) { + if (p_vertices.is_empty()) { return; } @@ -209,13 +213,13 @@ void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Mate Array a; a.resize(Mesh::ARRAY_MAX); - a[Mesh::ARRAY_VERTEX] = p_lines; + a[Mesh::ARRAY_VERTEX] = p_vertices; Vector<Color> color; - color.resize(p_lines.size()); + color.resize(p_vertices.size()); { Color *w = color.ptrw(); - for (int i = 0; i < p_lines.size(); i++) { + for (int i = 0; i < p_vertices.size(); i++) { if (is_selected()) { w[i] = Color(1, 1, 1, 0.8) * p_modulate; } else { @@ -226,13 +230,13 @@ void EditorNode3DGizmo::add_lines(const Vector<Vector3> &p_lines, const Ref<Mate a[Mesh::ARRAY_COLOR] = color; - mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a); + mesh->add_surface_from_arrays(p_primitive_type, a); mesh->surface_set_material(0, p_material); if (p_billboard) { float md = 0; - for (int i = 0; i < p_lines.size(); i++) { - md = MAX(0, p_lines[i].length()); + for (int i = 0; i < p_vertices.size(); i++) { + md = MAX(0, p_vertices[i].length()); } if (md) { mesh->set_custom_aabb(AABB(Vector3(-md, -md, -md), Vector3(md, md, md) * 2.0)); @@ -1906,16 +1910,15 @@ void RayCast3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->clear(); - Vector<Vector3> lines; + const Ref<StandardMaterial3D> material = raycast->is_enabled() ? raycast->get_debug_material() : get_material("shape_material_disabled"); - lines.push_back(Vector3()); - lines.push_back(raycast->get_target_position()); + p_gizmo->add_lines(raycast->get_debug_line_vertices(), material); - const Ref<StandardMaterial3D> material = - get_material(raycast->is_enabled() ? "shape_material" : "shape_material_disabled", p_gizmo); + if (raycast->get_debug_shape_thickness() > 1) { + p_gizmo->add_vertices(raycast->get_debug_shape_vertices(), material, Mesh::PRIMITIVE_TRIANGLE_STRIP); + } - p_gizmo->add_lines(lines, material); - p_gizmo->add_collision_segments(lines); + p_gizmo->add_collision_segments(raycast->get_debug_line_vertices()); } ///// diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 4d9c5625a3..030ce4655d 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -969,14 +969,16 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int for (int i = from; i < to; i++) { if (i == p_page) { Button *current = memnew(Button); - current->set_text(itos(i + 1)); + // Keep the extended padding for the currently active page (see below). + current->set_text(vformat(" %d ", i + 1)); current->set_disabled(true); current->set_focus_mode(Control::FOCUS_NONE); hbc->add_child(current); } else { Button *current = memnew(Button); - current->set_text(itos(i + 1)); + // Add padding to make page number buttons easier to click. + current->set_text(vformat(" %d ", i + 1)); current->connect("pressed", callable_mp(this, &EditorAssetLibrary::_search), varray(i)); hbc->add_child(current); @@ -1394,6 +1396,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { support = memnew(MenuButton); search_hb2->add_child(support); support->set_text(TTR("Support")); + support->get_popup()->set_hide_on_checkable_item_selection(false); support->get_popup()->add_check_item(TTR("Official"), SUPPORT_OFFICIAL); support->get_popup()->add_check_item(TTR("Community"), SUPPORT_COMMUNITY); support->get_popup()->add_check_item(TTR("Testing"), SUPPORT_TESTING); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index cf4aa33257..ff4a941b06 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -99,6 +99,7 @@ protected: public: void add_lines(const Vector<Vector3> &p_lines, const Ref<Material> &p_material, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); + void add_vertices(const Vector<Vector3> &p_vertices, const Ref<Material> &p_material, Mesh::PrimitiveType p_primitive_type, bool p_billboard = false, const Color &p_modulate = Color(1, 1, 1)); void add_mesh(const Ref<ArrayMesh> &p_mesh, bool p_billboard = false, const Ref<SkinReference> &p_skin_reference = Ref<SkinReference>(), const Ref<Material> &p_material = Ref<Material>()); void add_collision_segments(const Vector<Vector3> &p_lines); void add_collision_triangles(const Ref<TriangleMesh> &p_tmesh); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index a6afd45686..8bf5d0611d 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -755,8 +755,8 @@ void ScriptEditor::_close_tab(int p_idx, bool p_save, bool p_history_back) { _save_layout(); } -void ScriptEditor::_close_current_tab() { - _close_tab(tab_container->get_current_tab()); +void ScriptEditor::_close_current_tab(bool p_save) { + _close_tab(tab_container->get_current_tab(), p_save); } void ScriptEditor::_close_discard_current_tab(const String &p_str) { @@ -802,7 +802,7 @@ void ScriptEditor::_close_other_tabs() { } } - _close_current_tab(); + _close_current_tab(false); } } @@ -820,7 +820,7 @@ void ScriptEditor::_close_all_tabs() { } } - _close_current_tab(); + _close_current_tab(false); } } @@ -1372,7 +1372,7 @@ void ScriptEditor::_menu_option(int p_option) { if (current->is_unsaved()) { _ask_close_current_unsaved_tab(current); } else { - _close_current_tab(); + _close_current_tab(false); } } break; case FILE_COPY_PATH: { @@ -3497,7 +3497,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { erase_tab_confirm = memnew(ConfirmationDialog); erase_tab_confirm->get_ok_button()->set_text(TTR("Save")); erase_tab_confirm->add_button(TTR("Discard"), DisplayServer::get_singleton()->get_swap_cancel_ok(), "discard"); - erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab)); + erase_tab_confirm->connect("confirmed", callable_mp(this, &ScriptEditor::_close_current_tab), varray(true)); erase_tab_confirm->connect("custom_action", callable_mp(this, &ScriptEditor::_close_discard_current_tab)); add_child(erase_tab_confirm); diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 09ed3854ea..b2172e7f10 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -325,7 +325,7 @@ class ScriptEditor : public PanelContainer { void _close_tab(int p_idx, bool p_save = true, bool p_history_back = true); - void _close_current_tab(); + void _close_current_tab(bool p_save = true); void _close_discard_current_tab(const String &p_str); void _close_docs_tab(); void _close_other_tabs(); diff --git a/editor/translations/af.po b/editor/translations/af.po index e2a66e1acc..bda0eed750 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -1913,8 +1913,8 @@ msgid "Open a File or Directory" msgstr "Open 'n Lêer of Gids" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Stoor" @@ -4079,6 +4079,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Skep Vouer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Ek sien..." + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laai Verstek" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5186,7 +5201,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10397,6 +10411,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laai Verstek" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12425,6 +12444,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12680,11 +12707,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index d12383f798..5c03984e01 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -46,12 +46,13 @@ # Musab Alasaifer <mousablasefer@gmail.com>, 2020. # Yassine Oudjana <y.oudjana@protonmail.com>, 2020. # bruvzg <bruvzg13@gmail.com>, 2020. -# StarlkYT <mrsstarlkps4@gmail.com>, 2020. +# StarlkYT <mrsstarlkps4@gmail.com>, 2020, 2021. +# Games Toon <xxtvgoodxx@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-12-29 15:03+0000\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" "Last-Translator: StarlkYT <mrsstarlkps4@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" @@ -61,7 +62,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.4.1-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1701,9 +1702,8 @@ msgid "Node Dock" msgstr "رصي٠العÙقد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem Dock" -msgstr "نظام الملÙات" +msgstr "قوائم نظام الملÙات" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -1885,8 +1885,8 @@ msgid "Open a File or Directory" msgstr "Ø¥ÙØªØ Ù…Ù„Ù Ø£Ùˆ وجهة" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ØÙظ" @@ -2342,6 +2342,9 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"تم تجاوز اعدادات المØرر الاساسيه.\n" +"لإستعادة اعدادات المØرر, اذهب إلى خيار 'Delete Layout' من ثم Ø¥ØÙظ الاعدادات " +"الاساسيه." #: editor/editor_node.cpp msgid "Layout name not found!" @@ -2406,7 +2409,7 @@ msgstr "ليس هناك مشهد Ù…Øدد ليتم تشغيله." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "اØÙظ المشهد قبل التشغيل..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -3147,13 +3150,12 @@ msgid "Open & Run a Script" msgstr "ÙØªØ Ùˆ تشغيل كود" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "الملÙات التالية Ø£Øدث على القرص.\n" -"ما الإجراء الذي ينبغي اتخاذه؟:" +"ما الإجراء الذي ينبغي اتخاذه؟" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -4074,6 +4076,21 @@ msgstr "هل قمت بإرجاع كائن مشتق من العقدة ÙÙŠ دال msgid "Saving..." msgstr "جاري الØÙظ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "تØديد الوضع" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "إستيراد" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "تØميل الإÙتراضي" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d ملÙات" @@ -5145,7 +5162,6 @@ msgid "Sort:" msgstr "ترتيب:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "الÙئة:" @@ -7346,9 +7362,8 @@ msgid "Yaw" msgstr "الإنØرا٠Yaw" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "الØجم: " +msgstr "الØجم" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -10413,6 +10428,11 @@ msgstr "تØميل تلقائي" msgid "Plugins" msgstr "إضاÙات" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "تØميل الإÙتراضي" + #: editor/property_editor.cpp msgid "Preset..." msgstr "إعداد Ù…Ùسبق..." @@ -10474,9 +10494,8 @@ msgid "Batch Rename" msgstr "إعادة تسمية الدÙعة" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "إستبدال: " +msgstr "إستبدال:" #: editor/rename_dialog.cpp #, fuzzy @@ -12463,6 +12482,14 @@ msgstr "" "Ù…Ùضلع تصادم ثنائي الأبعاد (CollisionPolygon2D) الÙارغ ليس له أي تأثير على " "التصادم." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12799,11 +12826,6 @@ msgstr "" "GIProbes لا يدعم برنامج تشغيل الÙيديو GLES2.\n" "استخدم BakedLightmap بدلاً من ذلك." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "بقعة الضوء بزاوية أكبر من 90 درجة لا يمكنها إلقاء الظلال." diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 595899152d..47fd10411a 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -1811,8 +1811,8 @@ msgid "Open a File or Directory" msgstr "ОтварÑне на файл или папка" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Запазване" @@ -3895,6 +3895,21 @@ msgstr "" msgid "Saving..." msgstr "Запазване..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Режим на избиране" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ВнаÑÑне" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Задаване на входен порт по подразбиране" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Файлове" @@ -4958,7 +4973,6 @@ msgid "Sort:" msgstr "Сортиране:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "КатегориÑ:" @@ -10037,6 +10051,11 @@ msgstr "" msgid "Plugins" msgstr "ПриÑтавки" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "ВнаÑÑне на преводи" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12010,6 +12029,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Празен CollisionPolygon2D не влиÑе на колизиите." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12288,11 +12315,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12884,9 +12906,6 @@ msgstr "КонÑтантите не могат да бъдат промененР#~ msgid "Import Large Texture" #~ msgstr "ВнаÑÑне на голÑма текÑтура" -#~ msgid "Import Translations" -#~ msgstr "ВнаÑÑне на преводи" - #~ msgid "Couldn't import!" #~ msgstr "ÐеуÑпешно внаÑÑне!" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 18ac61a269..ca8fff0724 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -1926,8 +1926,8 @@ msgid "Open a File or Directory" msgstr "ফাইল বা পথ/ডিরেকà§à¦Ÿà¦°à¦¿ খà§à¦²à§à¦¨" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "সংরকà§à¦·à¦¨ করà§à¦¨" @@ -4307,6 +4307,21 @@ msgstr "" msgid "Saving..." msgstr "সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "মোড (Mode) বাছাই করà§à¦¨" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• sRGB বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5468,7 +5483,6 @@ msgid "Sort:" msgstr "সাজান:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "বিà¦à¦¾à¦—:" @@ -11013,6 +11027,11 @@ msgstr "সà§à¦¬à§Ÿà¦‚কà§à¦°à¦¿à§Ÿ-লোড" msgid "Plugins" msgstr "পà§à¦²à¦¾à¦—ইন-সমূহ" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "লোড ডিফলà§à¦Ÿ" + #: editor/property_editor.cpp msgid "Preset..." msgstr "পà§à¦°à¦¿à¦¸à§‡à¦Ÿ..." @@ -13204,6 +13223,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "সংঘরà§à¦·à§‡ ফাà¦à¦•à¦¾/শà§à¦¨à§à¦¯ CollisionPolygon2D-à¦à¦° কোনো পà§à¦°à¦à¦¾à¦¬ নেই।" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13495,11 +13522,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -15440,9 +15462,6 @@ msgstr "" #~ msgid "Use Default Light" #~ msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• লাইট বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" -#~ msgid "Use Default sRGB" -#~ msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• sRGB বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" - #~ msgid "Default Light Normal:" #~ msgstr "লাইটের পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• নরমাল:" diff --git a/editor/translations/br.po b/editor/translations/br.po index 3651e8fb0e..7600dd4eb1 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -1812,8 +1812,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3889,6 +3889,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4940,7 +4952,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9968,6 +9979,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11917,6 +11932,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12172,11 +12195,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 38f08f66cd..141f2cd58f 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -1871,8 +1871,8 @@ msgid "Open a File or Directory" msgstr "Obre un Fitxer o Directori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Desa" @@ -4105,6 +4105,21 @@ msgstr "" msgid "Saving..." msgstr "Desant..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Mode de selecció" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importa" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Carrega Valors predeterminats" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fitxers" @@ -5197,7 +5212,6 @@ msgid "Sort:" msgstr "Ordena:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -10685,6 +10699,11 @@ msgstr "Cà rrega Automà tica" msgid "Plugins" msgstr "Connectors" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carrega Valors predeterminats" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Configuració..." @@ -12827,6 +12846,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D buit no té cap efecte en la col·lisió." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13148,11 +13175,6 @@ msgstr "" "Les GIProbes no estan suportades pel controlador de vÃdeo GLES2.\n" "Utilitzeu un BakedLightmap en el seu lloc." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp #, fuzzy msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 625daea641..2c21fc0e63 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -11,12 +11,12 @@ # zxey <r.hozak@seznam.cz>, 2018. # VojtÄ›ch Å amla <auzkok@seznam.cz>, 2018, 2019, 2020, 2021. # Peeter Angelo <contact@peeterangelo.com>, 2019. -# VojtechBrezina <vojta.brezina@gmail.com>, 2019. +# VojtechBrezina <vojta.brezina@gmail.com>, 2019, 2021. # Garrom Orc Shaman <garromorcshaman@gmail.com>, 2019. # David HusiÄka <davidek251@seznam.cz>, 2019. # LuboÅ¡ NeÄas <lubosnecas506@seznam.cz>, 2019. # David KubeÅ¡ <kubesdavid@email.cz>, 2019. -# Emil Jiřà Tywoniak <emil.tywoniak@gmail.com>, 2020. +# Emil Jiřà Tywoniak <emil.tywoniak@gmail.com>, 2020, 2021. # Filip Vincůrek <vincurek.f@gmail.com>, 2020. # Ondrej Pavelka <ondrej.pavelka@outlook.com>, 2020. # ZbynÄ›k <zbynek.fiala@gmail.com>, 2020. @@ -28,7 +28,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-22 10:21+0000\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" "Last-Translator: Václav Blažej <vaclavblazej@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" @@ -37,7 +37,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.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -186,11 +186,11 @@ msgstr "Animace: ZmÄ›na Äasu klÃÄových snÃmků" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "Animace: zmÄ›na pÅ™echodů" +msgstr "Animace: ZmÄ›na pÅ™echodů" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "Animace: zmÄ›na transformacÃ" +msgstr "Animace: ZmÄ›na transformacÃ" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" @@ -198,7 +198,7 @@ msgstr "Animace: ZmÄ›nit hodnotu klÃÄových snÃmků" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "Animace: zmÄ›na volánÃ" +msgstr "Animace: ZmÄ›na vÃce volánÃ" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -292,7 +292,7 @@ msgstr "ÄŒas (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "PÅ™epÃnacà stopa povolena" +msgstr "Povolit stopu" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -676,7 +676,7 @@ msgstr "Vybrat vÅ¡e/nic" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "PÅ™idat klip audio stopy" +msgstr "PÅ™idat audio klip" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -1299,7 +1299,7 @@ msgstr "PÅ™epnout bypass efektů na zvukové sbÄ›rnice" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "Vybrat pÅ™enos zvukové sbÄ›rnice" +msgstr "Vybrat cÃl zvukové sbÄ›rnice" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" @@ -1867,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "OtevÅ™Ãt soubor nebo složku" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Uložit" @@ -2477,7 +2477,7 @@ msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." msgstr "" -"Tato scéna obsahuje neuložené zmÄ›ny.\n" +"Aktuálnà scéna obsahuje neuložené zmÄ›ny.\n" "PÅ™esto znovu naÄÃst? Tuto akci nelze vrátit zpÄ›t." #: editor/editor_node.cpp @@ -2538,10 +2538,8 @@ msgstr "" "Nelze povolit rozÅ¡iÅ™ujÃcà plugin: '%s' parsovánà konfigurace se nezdaÅ™ilo." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"Nelze najÃt záznam skriptu pro rozÅ¡iÅ™ujÃcà plugin v: 'res://addons/%s'." +msgstr "Nelze najÃt záznam skriptu pro rozÅ¡iÅ™ujÃcà plugin v: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3132,13 +3130,12 @@ msgid "Open & Run a Script" msgstr "OtevÅ™Ãt a spustit skript" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "NásledujÃcà soubory majà novÄ›jÅ¡Ã verzi na disku.\n" -"Jaká akce se má vykonat?:" +"Jaká akce se má vykonat?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -4064,6 +4061,21 @@ msgstr "Vrátili jste objekt, který dÄ›dà z Node metodou `post_import()`?" msgid "Saving..." msgstr "UkládánÃ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Režim výbÄ›ru" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "NaÄÃst výchozÃ" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d souborů" @@ -5026,9 +5038,8 @@ msgid "Got:" msgstr "Staženo:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Neúspěšná kontrola sha256 hashe" +msgstr "Neúspěšná kontrola SHA-256 hashe" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5131,7 +5142,6 @@ msgid "Sort:" msgstr "Řadit podle:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorie:" @@ -6302,9 +6312,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "Bod lze vložit pouze do process materiálu ParticlesMaterial" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "PÅ™evést na CPUParticles" +msgstr "PÅ™evést na CPUParticles2D" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -10006,9 +10015,8 @@ msgid "Projects" msgstr "Projekty" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "ZÃskávánà zrcadel, prosÃm Äekejte..." +msgstr "NaÄÃtánÃ, prosÃm Äekejte..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10381,6 +10389,11 @@ msgstr "Autoload" msgid "Plugins" msgstr "Pluginy" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "NaÄÃst výchozÃ" + #: editor/property_editor.cpp msgid "Preset..." msgstr "PÅ™edvolba..." @@ -10634,7 +10647,6 @@ msgid "Can't paste root node into the same scene." msgstr "Nelze manipulovat s uzly z cizà scény!" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "Vložit uzly" @@ -10765,7 +10777,6 @@ msgid "Attach Script" msgstr "PÅ™ipojit skript" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "Vyjmout uzly" @@ -11576,29 +11587,25 @@ msgstr "PÅ™iÅ™aÄte uzlu GridMap zdroj MeshLibrary k použità jeho sÃtÄ›." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "ZaÄÃt zapeÄenÃ" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "PÅ™ipravovánà datových struktur" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "Vygenerovat AABB" +msgstr "Vygenerovat buffery" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "SmÄ›ry" +msgstr "PÅ™Ãmé osvÄ›tlenÃ" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "Odsadit zprava" +msgstr "NepÅ™Ãmé osvÄ›tlenÃ" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "Následné zpracovánÃ" @@ -12112,9 +12119,8 @@ msgid "Select device from the list" msgstr "Vyberte zaÅ™Ãzenà ze seznamu" #: platform/android/export/export.cpp -#, fuzzy msgid "Unable to find the 'apksigner' tool." -msgstr "Nelze najÃt nástroj zipalign." +msgstr "Nelze najÃt nástroj 'apksigner'." #: platform/android/export/export.cpp msgid "" @@ -12136,14 +12142,12 @@ msgstr "" "ÚložiÅ¡tÄ› klÃÄů pro vydánà je nakonfigurováno nesprávnÄ› v profilu exportu." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastnà sestavenà v Nastavenà editoru." +msgstr "Je vyžadována platná cesta Android SDK v Nastavenà editoru." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastnà sestavenà v Nastavenà editoru." +msgstr "Neplatná cesta k Android SDK v Nastavenà editoru." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" @@ -12151,12 +12155,11 @@ msgstr "Chybà složka \"platform-tools\"!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Nelze najÃt pÅ™Ãkaz adb z nástrojů platformy Android SDK." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "Nesprávná cesta Android SDK pro vlastnà sestavenà v Nastavenà editoru." +msgstr "Zkontrolujte ve složce Android SDK uvedené v Nastavenà editoru." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" @@ -12164,7 +12167,7 @@ msgstr "Chybà složka \"build-tools\"!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Nelze najÃt apksigner, nástrojů Android SDK." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12422,6 +12425,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prázdný CollisionPolygon2D nemá pÅ™i kolizi žádný efekt." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12625,27 +12636,23 @@ msgstr "ARVROrigin musà mÃt uzel ARVRCamera jako potomka." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "Hledat mřÞky a svÄ›tla" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "Parsuji geometrii..." +msgstr "PÅ™ipravuji geometrii (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "Zobrazit prostÅ™edÃ" +msgstr "PÅ™ipravuji prostÅ™edÃ" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "Generovánà svÄ›telné mapy" +msgstr "Generovánà snÃmánÃ" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "Generovánà svÄ›telné mapy" +msgstr "Ukládám svÄ›telné mapy" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12735,11 +12742,6 @@ msgstr "" "Video driver GLES2 nepodporuje GIProby.\n" "MÃsto toho použijte BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "Uzel InterpolatedCamera je zastaralý a bude odstranÄ›n v Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight s úhlem Å¡irÅ¡Ãm než 90 stupňů nemůže vrhat stÃny." @@ -13077,6 +13079,10 @@ msgstr "OdliÅ¡nosti mohou být pÅ™iÅ™azeny pouze ve vertex funkci." msgid "Constants cannot be modified." msgstr "Konstanty nenà možné upravovat." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "Uzel InterpolatedCamera je zastaralý a bude odstranÄ›n v Godot 4.0." + #~ msgid "No" #~ msgstr "Ne" diff --git a/editor/translations/da.po b/editor/translations/da.po index 0f677c6f96..bc00612eae 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -1938,8 +1938,8 @@ msgid "Open a File or Directory" msgstr "Ã…ben en Fil eller Mappe" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Gem" @@ -4199,6 +4199,21 @@ msgstr "" msgid "Saving..." msgstr "Gemmer..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Vælg Node" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Indlæs Default" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -5334,7 +5349,6 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -10638,6 +10652,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Indlæs Default" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Forudindstillet..." @@ -12730,6 +12749,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "En tom CollisionPolygon2D har ingen effekt pÃ¥ kollision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13019,11 +13046,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/de.po b/editor/translations/de.po index 0c8ab619c5..bf3c01ae14 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -63,12 +63,16 @@ # Jonathan Hassel <jonathan.hassel@icloud.com>, 2020. # Artur Schönfeld <schoenfeld.artur@ymail.com>, 2020. # kidinashell <kidinashell@protonmail.com>, 2021. +# Daniel Glocker <mystboy666@gmail.com>, 2021. +# Raphipod <podraphi@googlemail.com>, 2021. +# Daniel Plaster <danimineiromc@googlemail.com>, 2021. +# El Captian <elcaptian@posteo.me>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:50+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" +"Last-Translator: El Captian <elcaptian@posteo.me>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -76,7 +80,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.5\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1921,8 +1925,8 @@ msgid "Open a File or Directory" msgstr "Datei oder Verzeichnis öffnen" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Speichern" @@ -2443,7 +2447,7 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" -"Dies ist ein nicht-lokales Objekt, Änderungen an ihm werden nicht " +"Dies ist ein Laufzeit-Objekt Objekt, Änderungen an ihm werden nicht " "gespeichert.\n" "Die Dokumentation zum Debugging beschreibt den nötigen Arbeitsablauf." @@ -2602,7 +2606,6 @@ msgstr "" "fehlgeschlagen." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" "Skript-Feld für Erweiterung in ‚res://addons/%s‘ konnte nicht gefunden " @@ -3062,7 +3065,7 @@ msgstr "Dokumentationsvorschläge senden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" -msgstr "Community" +msgstr "Gemeinschaft" #: editor/editor_node.cpp msgid "About" @@ -4144,6 +4147,21 @@ msgstr "" msgid "Saving..." msgstr "Speichere..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Auswahlmodus" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Nutze Standard-sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dateien" @@ -4907,7 +4925,7 @@ msgstr "Abspielmodus:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "AnimationTree" -msgstr "AnimationTree" +msgstr "AnimationsBaum" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" @@ -5114,9 +5132,8 @@ msgid "Got:" msgstr "Erhalten:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Sha256-Prüfung fehlgeschlagen" +msgstr "Sha256 Checksummen prüfung fehlgeschlagen" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5219,7 +5236,6 @@ msgid "Sort:" msgstr "Sortiere:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorie:" @@ -5274,7 +5290,7 @@ msgstr "" msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" "Die Größe des Lightmaps kann nicht bestimmt werden. Möglicherweise ist die " -"maximale Lightmap-Größe zu klein." +"maximale Lightmap-Größe zu klein?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -7354,7 +7370,7 @@ msgstr "Knochen in Ruhe-Pose setzen" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Skeleton2D" -msgstr "Skeleton2D" +msgstr "Skelett2D" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" @@ -7462,7 +7478,7 @@ msgstr "Zeichenaufrufe" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "Vertices" +msgstr "Eckpunkte" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." @@ -8515,7 +8531,7 @@ msgstr "Keine Textur zum Entfernen ausgewählt." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." -msgstr "Aus Szene erstellen? Alle aktuellen Kacheln werden überschrieben!" +msgstr "Aus Szene erstellen? Alle aktuellen Kacheln werden überschrieben." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" @@ -9649,7 +9665,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "VisualShader" +msgstr "VisuellerShader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Edit Visual Property" @@ -10514,6 +10530,11 @@ msgstr "Autoload" msgid "Plugins" msgstr "Erweiterungen" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Standard laden" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Voreinstellungen..." @@ -10765,14 +10786,12 @@ msgid "Instance Child Scene" msgstr "Szene hier instantiieren" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Bearbeiten von Nodes einer fremden Szene ist nicht möglich!" +msgstr "Einfügen der Wurzelnode in dieselbe Szene nicht möglich." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Nodes einfügen" +msgstr "Node(s) einfügen" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10902,9 +10921,8 @@ msgid "Attach Script" msgstr "Skript hinzufügen" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Nodes trennen" +msgstr "Node(s) trennen" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -11546,7 +11564,7 @@ msgstr "Bibliotheken: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "GDNative" +msgstr "GDNativ" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -12577,6 +12595,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Ein leeres CollisionPolygon2D hat keinen Effekt auf Kollisionen." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12906,11 +12932,6 @@ msgstr "" "GIProbes werden vom GLES2-Videotreiber nicht unterstützt.\n" "BakedLightmaps können als Alternative verwendet werden." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ist veraltet und wird in Godot 4.0 entfernt werden." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13269,6 +13290,11 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera ist veraltet und wird in Godot 4.0 entfernt werden." + #~ msgid "No" #~ msgstr "Nein" @@ -15112,9 +15138,6 @@ msgstr "Konstanten können nicht verändert werden." #~ msgid "Use Default Light" #~ msgstr "Nutze Standardlicht" -#~ msgid "Use Default sRGB" -#~ msgstr "Nutze Standard-sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Standardlichtnormale:" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 21d516e8ee..d11d4f42ac 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -1790,8 +1790,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3867,6 +3867,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4918,7 +4930,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9946,6 +9957,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11895,6 +11910,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12150,11 +12173,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index f6205b3b50..8cd3397399 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-15 10:51+0000\n" +"PO-Revision-Date: 2021-03-03 15:50+0000\n" "Last-Translator: Michalis <michalisntovas@yahoo.gr>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" @@ -24,7 +24,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1867,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "Άνοιγμα αÏχείου ή φακÎλου" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Αποθήκευση" @@ -4088,6 +4088,21 @@ msgstr "" msgid "Saving..." msgstr "Αποθήκευση..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Επιλογή ΛειτουÏγίας" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Εισαγωγή" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "ΧÏήση Ï€ÏοεπιλεγμÎνου sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d αÏχεία" @@ -5163,7 +5178,6 @@ msgid "Sort:" msgstr "Ταξινόμηση:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "ΚατηγοÏία:" @@ -8662,7 +8676,7 @@ msgstr "ΚανÎνα αÏχείο δεν Ï€ÏοστÎθηκε στο στάδιΠ#: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" -msgstr "ΔÎσμευση" +msgstr "Υποβολή" #: editor/plugins/version_control_editor_plugin.cpp msgid "VCS Addon is not initialized" @@ -10473,6 +10487,11 @@ msgstr "Αυτόματη φόÏτωση" msgid "Plugins" msgstr "Î Ïόσθετα" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "ΦόÏτωση Ï€Ïοεπιλογής" + #: editor/property_editor.cpp msgid "Preset..." msgstr "ΔιαμόÏφωση..." @@ -12547,6 +12566,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Ένα άδειο ColisionPollygon2D δεν επηÏεάζει τη σÏγκÏουση." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12874,11 +12901,6 @@ msgstr "" "Τα GIProbes δεν υποστηÏίζονται από το Ï€ÏόγÏαμμα οδήγησης οθόνης GLES2.\n" "Εναλλακτικά, χÏησιμοποιήστε Îνα BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "Η InterpolatedCamera Îχει καταÏγηθεί και θα αφαιÏεθεί στο Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13226,6 +13248,11 @@ msgstr "Τα «varying» μποÏοÏν να ανατεθοÏν μόνο στηΠmsgid "Constants cannot be modified." msgstr "Οι σταθεÏÎÏ‚ δεν μποÏοÏν να Ï„ÏοποποιηθοÏν." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "Η InterpolatedCamera Îχει καταÏγηθεί και θα αφαιÏεθεί στο Godot 4.0." + #~ msgid "No" #~ msgstr "Όχι" @@ -15054,9 +15081,6 @@ msgstr "Οι σταθεÏÎÏ‚ δεν μποÏοÏν να Ï„ÏÎ¿Ï€Î¿Ï€Î¿Î¹Î·Î¸Î¿Ï #~ msgid "Use Default Light" #~ msgstr "ΧÏήση Ï€ÏοεπιλεγμÎου φωτός" -#~ msgid "Use Default sRGB" -#~ msgstr "ΧÏήση Ï€ÏοεπιλεγμÎνου sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Î ÏοεπιλεγμÎνο διάνυσμα κανονικής ανάκλασης φωτός:" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index bbc0d13358..46e3a6b28d 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -1836,8 +1836,8 @@ msgid "Open a File or Directory" msgstr "Malfermi dosieron aÅ dosierujon" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Konservi" @@ -3979,6 +3979,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selektu nodo(j)n por enporti" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Enporti" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5036,7 +5050,6 @@ msgid "Sort:" msgstr "Ordigi:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10102,6 +10115,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Enporti dokon" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12076,6 +12094,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12331,11 +12357,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/es.po b/editor/translations/es.po index 20a252e6a4..85b79a7605 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -63,8 +63,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-15 10:51+0000\n" -"Last-Translator: SteamGoblin <SteamGoblin860@gmail.com>\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" +"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" "Language: es\n" @@ -72,7 +72,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.5-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -578,7 +578,7 @@ msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "Snap:" +msgstr "Ajuste:" #: editor/animation_track_editor.cpp msgid "Animation step value." @@ -1642,7 +1642,7 @@ msgid "" "Etc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC' para GLES2. " -"Activa 'Import Etc' en Ajustes del Proyecto." +"Activa 'Import Etc' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1650,7 +1650,7 @@ msgid "" "'Import Etc 2' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC2' para GLES3. " -"Activa 'Import Etc 2' en Ajustes del Proyecto." +"Activa 'Import Etc 2' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1661,8 +1661,8 @@ msgid "" msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC' para usar " "GLES2 como controlador de respaldo.\n" -"Activa 'Import Etc' en Ajustes del Proyecto, o desactiva 'Driver Fallback " -"Enabled'." +"Activa 'Import Etc' en Configuración del Proyecto, o desactiva 'Driver " +"Fallback Enabled'." #: editor/editor_export.cpp msgid "" @@ -1670,7 +1670,7 @@ msgid "" "'Import Pvrtc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'PVRTC' para GLES2. " -"Activa 'Import Pvrtc' en Ajustes del Proyecto." +"Activa 'Import Pvrtc' en Configuración del Proyecto." #: editor/editor_export.cpp msgid "" @@ -1678,7 +1678,8 @@ msgid "" "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" "La plataforma de destino requiere compresión de texturas 'ETC2' o 'PVRTC' " -"para GLES3. Activa 'Import Etc 2' o 'Import Pvrtc' en Ajustes del Proyecto." +"para GLES3. Activa 'Import Etc 2' o 'Import Pvrtc' en Configuración del " +"Proyecto." #: editor/editor_export.cpp msgid "" @@ -1689,7 +1690,7 @@ msgid "" msgstr "" "La plataforma del objetivo requiere compresión de texturas 'PVRTC' para el " "driver fallback de GLES2.\n" -"Activa Import Pvrtc' en la Ajustes del Proyecto, o desactiva 'Driver " +"Activa Import Pvrtc' en Configuración del Proyecto, o desactiva 'Driver " "Fallback Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp @@ -1921,8 +1922,8 @@ msgid "Open a File or Directory" msgstr "Abrir un archivo o directorio" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -1993,7 +1994,7 @@ msgstr "Mostrar/Ocultar archivos ocultos." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "Ver Ãtems como un grid de miniaturas." +msgstr "Ver Ãtems como una cuadrÃcula de miniaturas." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." @@ -2600,11 +2601,8 @@ msgstr "" "configuración de '%s'." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"No se pudo encontrar el campo del script para el plugin addon en: 'res://" -"addons/%s'." +msgstr "No se pudo encontrar el campo script para el plugin de addon en: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2664,8 +2662,8 @@ msgid "" "category." msgstr "" "No se ha definido ninguna escena principal, ¿seleccionar una?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categorÃa " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categorÃa 'application'." #: editor/editor_node.cpp msgid "" @@ -2674,8 +2672,8 @@ msgid "" "category." msgstr "" "La escena seleccionada '%s' no existe, ¿seleccionar una válida?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categorÃa " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categorÃa 'application'." #: editor/editor_node.cpp msgid "" @@ -2685,8 +2683,8 @@ msgid "" msgstr "" "La escena '%s' seleccionada no es un archivo de escena, ¿seleccionar uno " "válido?\n" -"Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categorÃa " -"'application'." +"Es posible cambiarla más tarde en \"Configuración del Proyecto\" bajo la " +"categorÃa 'application'." #: editor/editor_node.cpp msgid "Save Layout" @@ -2847,7 +2845,7 @@ msgstr "Proyecto" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "Ajustes del Proyecto..." +msgstr "Configuración del Proyecto..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -3208,13 +3206,12 @@ msgid "Open & Run a Script" msgstr "Abrir y Ejecutar un Script" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" "Los siguientes archivos son nuevos en disco.\n" -"¿Qué es lo que quieres hacer?:" +"¿Qué acción se deberÃa tomar?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3969,7 +3966,7 @@ msgid "" "ProjectSettings." msgstr "" "Incluye los archivos con las siguientes extensiones. Añádelos o elimÃnalos " -"en Ajustes del proyecto." +"en Configuración del Proyecto." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4147,6 +4144,21 @@ msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?" msgid "Saving..." msgstr "Guardando..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modo de Selección" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importación" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Usar sRGB predeterminado" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d archivos" @@ -4419,7 +4431,7 @@ msgstr "Seleccionar y mover puntos, crear puntos con clic derecho." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp msgid "Enable snap and show grid." -msgstr "Activar snap y mostrar grid." +msgstr "Activar ajuste y mostrar cuadrÃcula." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -5119,9 +5131,8 @@ msgid "Got:" msgstr "Tiene:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Fallo en la comprobación del hash sha256" +msgstr "Fallo en la comprobación del hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5224,7 +5235,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "CategorÃa:" @@ -5311,15 +5321,15 @@ msgstr "Vista Previa" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "Configurar Snap" +msgstr "Configurar Ajuste" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" -msgstr "Grid Offset:" +msgstr "Desplazamiento de CuadrÃcula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "Grid Step:" +msgstr "Paso de CuadrÃcula:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" @@ -5483,11 +5493,11 @@ msgstr "Ancho Inferior" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "Ancho Centro Vert." +msgstr "Centro Vert. Ancho" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "Ancho Centro Horiz." +msgstr "Centro Horiz. Ancho" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" @@ -5647,48 +5657,48 @@ msgstr "Modo de Regla" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "Alternar acople inteligente." +msgstr "Act./Desact. ajuste inteligente." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" -msgstr "Usar Snap Inteligente" +msgstr "Usar Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle grid snapping." -msgstr "Act./Desact. grid snapping." +msgstr "Act./Desact. ajuste de cuadrÃcula." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" -msgstr "Usar Grid Snap" +msgstr "Usar Ajuste de CuadrÃcula" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "Opciones de Snapping" +msgstr "Opciones de Ajuste" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "Usar Snap de Rotación" +msgstr "Usar Ajuste de Rotación" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "Usar Snap de Escalado" +msgstr "Usar Ajuste de Escalado" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "Snap Relativo" +msgstr "Ajuste Relativo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "Usar Pixel Snap" +msgstr "Usar Ajuste de PÃxeles" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "Snapping Inteligente" +msgstr "Ajuste Inteligente" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "Configurar Snap..." +msgstr "Configurar Ajuste..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap to Parent" @@ -5757,7 +5767,7 @@ msgstr "Ver" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Always Show Grid" -msgstr "Mostrar Siempre el Grid" +msgstr "Mostrar Siempre la CuadrÃcula" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5846,11 +5856,11 @@ msgstr "Limpiar Pose" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "Multiplicar grid step por 2" +msgstr "Multiplicar paso de cuadrÃcula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "Dividir grid step por 2" +msgstr "Dividir paso de cuadrÃcula por 2" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan View" @@ -6767,43 +6777,43 @@ msgstr "Limpiar UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Settings" -msgstr "Configuración del Grid" +msgstr "Configuración de la CuadrÃcula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "Snap" +msgstr "Ajuste" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "Activar Snap" +msgstr "Activar Ajuste" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "Grid" +msgstr "CuadrÃcula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "Ver Grid" +msgstr "Ver CuadrÃcula" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Configure Grid:" -msgstr "Configurar Grid:" +msgstr "Configurar CuadrÃcula:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset X:" -msgstr "Grid Offset X:" +msgstr "Desplazamiento de CuadrÃcula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset Y:" -msgstr "Grid Offset Y:" +msgstr "Desplazamiento de CuadrÃcula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step X:" -msgstr "Grid Step X:" +msgstr "Paso de CuadrÃcula en X:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step Y:" -msgstr "Grid Step Y:" +msgstr "Paso de CuadrÃcula en Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" @@ -7768,7 +7778,7 @@ msgstr "Ver Origen" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "Ver Grid" +msgstr "Ver CuadrÃcula" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -7777,19 +7787,19 @@ msgstr "Configuración..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "Ajustes de Snap" +msgstr "Configuración de Ajuste" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "Snap de Traslación:" +msgstr "Ajuste de Traslación:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "Snap de Rotación (grados):" +msgstr "Ajuste de Rotación (grados):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "Snap de Escala (%):" +msgstr "Ajuste de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -8058,7 +8068,7 @@ msgstr "Asignar Margen" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "Modo Snap:" +msgstr "Modo de Ajuste:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp @@ -8067,11 +8077,11 @@ msgstr "Ninguno" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "Pixel Snap" +msgstr "Ajuste de PÃxeles" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "Grid Snap" +msgstr "Ajuste de CuadrÃcula" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -8489,7 +8499,8 @@ msgstr "Mantener el polÃgono dentro del region Rect." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "Activar snap y mostrar grid (configurable a través del Inspector)." +msgstr "" +"Activar ajuste y mostrar cuadrÃcula (configurable a través del Inspector)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" @@ -9680,7 +9691,7 @@ msgid "" msgstr "" "No se pudo exportar el proyecto para la plataforma '%s'.\n" "Esto puede ser debido a un problema de configuración en el preset de " -"exportación o en los ajustes de exportación." +"exportación o en la configuración de exportación." #: editor/project_export.cpp msgid "Release" @@ -10070,8 +10081,8 @@ msgid "" "the \"Application\" category." msgstr "" "No se puede ejecutar el proyecto: no hay una escena principal definida.\n" -"Por favor, edita el proyecto y configura la escena principal en los Ajustes " -"del proyecto, en la categorÃa \"Application\"." +"Por favor, edita el proyecto y configura la escena principal en " +"Configuración del Proyecto, en la categorÃa \"Application\"." #: editor/project_manager.cpp msgid "" @@ -10137,9 +10148,8 @@ msgid "Projects" msgstr "Proyectos" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "Obteniendo mirrors, por favor espera..." +msgstr "Cargando, espera por favor..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10418,7 +10428,7 @@ msgstr "Cambiar Modo de Filtro Local" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" -msgstr "Ajustes del Proyecto (project.godot)" +msgstr "Configuración del Proyecto (project.godot)" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "General" @@ -10512,6 +10522,11 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Cargar Valores por Defecto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preset..." @@ -10762,14 +10777,12 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "¡No se puede operar sobre los nodos de una escena externa!" +msgstr "No se puede pegar el nodo raÃz en la misma escena." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Pegar Nodos" +msgstr "Pegar Nodo(s)" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10899,9 +10912,8 @@ msgid "Attach Script" msgstr "Añadir Script" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Cortar Nodos" +msgstr "Cortar Nodos(s)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -11612,7 +11624,7 @@ msgstr "Plano:" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Delete Selection" -msgstr "GridMap Eliminar Seleccionados" +msgstr "Eliminar Selección de GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Fill Selection" @@ -11620,7 +11632,7 @@ msgstr "Rellenar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paste Selection" -msgstr "Pegar lo Seleccionado en GridMap" +msgstr "Pegar Selección en GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -11628,7 +11640,7 @@ msgstr "Pintar GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Grid Map" -msgstr "Grid Map" +msgstr "Mapeo de CuadrÃcula" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Snap View" @@ -11765,7 +11777,7 @@ msgstr "Estableciendo la configuración..." #: modules/recast/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "Calculando tamaño de grid..." +msgstr "Calculando tamaño la cuadrÃcula..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -12590,6 +12602,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vacÃo no tiene ningún efecto en las colisiones." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12910,11 +12930,6 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de vÃdeo GLES2.\n" "Usa un BakedLightmap en su lugar." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ha sido desaprobado y será eliminado en Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13206,7 +13221,7 @@ msgid "" "Default Environment as specified in Project Settings (Rendering -> " "Environment -> Default Environment) could not be loaded." msgstr "" -"El Entorno por Defecto como se especifica en los Ajustes del Proyecto " +"El Entorno por Defecto como se especifica en Configuración del Proyecto " "(Rendering -> Environment -> Default Environment) no se ha podido cargar." #: scene/main/viewport.cpp @@ -13264,6 +13279,11 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera ha sido desaprobado y será eliminado en Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -15148,9 +15168,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Use Default Light" #~ msgstr "Usar iluminación predeterminada" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB predeterminado" - #~ msgid "Default Light Normal:" #~ msgstr "Iluminación por normales predeterminada:" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index a95f85e753..5f9231e891 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:50+0000\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" "Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" @@ -1876,8 +1876,8 @@ msgid "Open a File or Directory" msgstr "Abrir un Archivo o Directorio" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -2556,11 +2556,8 @@ msgstr "" "configuración." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"No se pudo encontrar el campo script para el plugin de addon en: 'res://" -"addons/%s'." +msgstr "No se pudo encontrar el campo script para el plugin de addon en: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4098,6 +4095,21 @@ msgstr "¿Devolviste un objeto derivado de Node en el método `post_import()`?" msgid "Saving..." msgstr "Guardando..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modo Seleccionar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Usar sRGB por Defecto" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Archivos" @@ -5071,9 +5083,8 @@ msgid "Got:" msgstr "Recibido:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Fallo el chequeo del hash sha256" +msgstr "Fallo el chequeo del hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5176,7 +5187,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "CategorÃa:" @@ -10456,6 +10466,11 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Cargar Valores por Defecto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preseteo..." @@ -10706,14 +10721,12 @@ msgid "Instance Child Scene" msgstr "Instanciar Escena Hija" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "No se puede operar sobre los nodos de una escena externa!" +msgstr "No se puede pegar el nodo raiz en la misma escena." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Pegar Nodos" +msgstr "Pegar Nodo(s)" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10844,9 +10857,8 @@ msgid "Attach Script" msgstr "Adjuntar Script" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Cortar Nodos" +msgstr "Cortar Nodo(s)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -12525,6 +12537,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vacÃo no tiene efecto en la colisión." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12845,11 +12865,6 @@ msgstr "" "Las GIProbes no están soportadas por el controlador de video GLES2.\n" "Usá un BakedLightmap en su lugar." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ha sido deprecado y será eliminado en Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13194,6 +13209,10 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera ha sido deprecado y será eliminado en Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -14862,9 +14881,6 @@ msgstr "Las constantes no pueden modificarse." #~ msgid "Use Default Light" #~ msgstr "Usar Luz por Defecto" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB por Defecto" - #~ msgid "Default Light Normal:" #~ msgstr "Normales de Luces por Defecto:" diff --git a/editor/translations/et.po b/editor/translations/et.po index e6f2c1aac4..ba7272db84 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2021-02-05 09:20+0000\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" "Last-Translator: Kritzmensch <streef.gtx@gmail.com>\n" "Language-Team: Estonian <https://hosted.weblate.org/projects/godot-engine/" "godot/et/>\n" @@ -18,7 +18,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.5-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -697,7 +697,7 @@ msgstr "" #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "Asenda" #: editor/code_editor.cpp msgid "Replace All" @@ -814,7 +814,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "Ainulaadne" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." @@ -840,7 +840,7 @@ msgstr "Sulge" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "" +msgstr "Ãœhenda" #: editor/connections_dialog.cpp msgid "Signal:" @@ -860,12 +860,12 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect..." -msgstr "" +msgstr "Ãœhenda..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "Katkesta ühendus" #: editor/connections_dialog.cpp msgid "Connect a Signal to a Method" @@ -898,7 +898,7 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Edit..." -msgstr "" +msgstr "Muuda..." #: editor/connections_dialog.cpp msgid "Go To Method" @@ -910,7 +910,7 @@ msgstr "" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" -msgstr "" +msgstr "Muuda" #: editor/create_dialog.cpp msgid "Create New %s" @@ -968,20 +968,20 @@ msgstr "" #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "Dependencies" -msgstr "" +msgstr "Sõltuvused" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "" +msgstr "Ressurss" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "" +msgstr "Tee" #: editor/dependency_editor.cpp msgid "Dependencies:" -msgstr "" +msgstr "Sõltuvused:" #: editor/dependency_editor.cpp msgid "Fix Broken" @@ -1213,7 +1213,7 @@ msgstr "" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "Õnnestus!" #: editor/editor_asset_installer.cpp msgid "Package Contents:" @@ -1221,7 +1221,7 @@ msgstr "" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" -msgstr "" +msgstr "Paigalda" #: editor/editor_asset_installer.cpp msgid "Package Installer" @@ -1285,7 +1285,7 @@ msgstr "Vaigista" #: editor/editor_audio_buses.cpp msgid "Bypass" -msgstr "" +msgstr "Jäta vahele" #: editor/editor_audio_buses.cpp msgid "Bus options" @@ -1306,7 +1306,7 @@ msgstr "" #: editor/editor_audio_buses.cpp msgid "Audio" -msgstr "" +msgstr "Heli" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" @@ -1830,8 +1830,8 @@ msgid "Open a File or Directory" msgstr "Ava kaust või kataloog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salvesta" @@ -2171,7 +2171,7 @@ msgstr "Imporditud ressursse ei saa salvestada." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "Olgu" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" @@ -2427,7 +2427,7 @@ msgstr "Välju" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "Jah" #: editor/editor_node.cpp msgid "Exit the editor?" @@ -3048,7 +3048,7 @@ msgstr "Laadimisvead" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Vali" #: editor/editor_node.cpp msgid "Open 2D Editor" @@ -3088,7 +3088,7 @@ msgstr "" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "" +msgstr "Pisipilt..." #: editor/editor_plugin_settings.cpp msgid "Main Script:" @@ -3145,7 +3145,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "Kaasav" #: editor/editor_profiler.cpp msgid "Self" @@ -3169,11 +3169,11 @@ msgstr "" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" -msgstr "" +msgstr "Sees" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "Kiht" #: editor/editor_properties.cpp msgid "Bit %d, value %d" @@ -3181,11 +3181,11 @@ msgstr "" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[Tühi]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "Määra..." #: editor/editor_properties.cpp msgid "Invalid RID" @@ -3243,7 +3243,7 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: editor/scene_tree_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "Kleebi" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Convert To %s" @@ -3255,7 +3255,7 @@ msgstr "" #: editor/editor_properties_array_dict.cpp msgid "Size: " -msgstr "" +msgstr "Suurus: " #: editor/editor_properties_array_dict.cpp msgid "Page: " @@ -3339,7 +3339,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(Paigaldatud)" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3352,11 +3352,11 @@ msgstr "" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Puudub)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(Praegune)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." @@ -3477,7 +3477,7 @@ msgstr "" #: editor/export_template_manager.cpp msgid "Connected" -msgstr "" +msgstr "Ãœhendatud" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -3538,7 +3538,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Favorites" -msgstr "" +msgstr "Lemmikud" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." @@ -3922,6 +3922,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Valimisrežiim" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Impordi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laadi vaikimisi" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4973,7 +4988,6 @@ msgid "Sort:" msgstr "Sordi:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategooria:" @@ -10010,6 +10024,11 @@ msgstr "" msgid "Plugins" msgstr "Pistikprogrammid" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laadi vaikimisi" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11345,7 +11364,7 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" -msgstr "" +msgstr "Signaalid:" #: modules/visual_script/visual_script_editor.cpp msgid "Create a new signal." @@ -11963,6 +11982,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12219,11 +12246,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -12421,7 +12443,7 @@ msgstr "" #: scene/gui/dialogs.cpp msgid "Alert!" -msgstr "" +msgstr "Tähelepanu!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." @@ -12455,7 +12477,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(Muu)" #: scene/main/scene_tree.cpp msgid "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index ef200e15d6..95e87167e5 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -1804,8 +1804,8 @@ msgid "Open a File or Directory" msgstr "Ireki fitxategia edo direktorioa" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Gorde" @@ -3886,6 +3886,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Hautatu inportatu nahi dituzun nodoak" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Inportatu azala" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fitxategi" @@ -4939,7 +4953,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9977,6 +9990,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Inportatu profila(k)" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11930,6 +11948,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12185,11 +12211,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 29d3139e9c..910212f856 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -1846,8 +1846,8 @@ msgid "Open a File or Directory" msgstr "یک پرونده یا پوشه را باز Ú©Ù†" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ذخیره" @@ -4001,6 +4001,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "انتخاب Øالت" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "وارد کردن" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "بارگیری پیش Ùرض" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5125,7 +5140,6 @@ msgid "Sort:" msgstr "مرتب‌سازی:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "طبقه‌بندی:" @@ -10454,6 +10468,11 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "اÙزونه‌ها" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "بارگیری پیش Ùرض" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12569,6 +12588,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "یک CollisionPolygon2D خالی جلوه بر برخورد ندارد." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12859,11 +12886,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 16daaed9b0..36e6c631be 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" "Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" @@ -1857,8 +1857,8 @@ msgid "Open a File or Directory" msgstr "Avaa tiedosto tai hakemisto" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Tallenna" @@ -2530,9 +2530,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "Lisäosan '%s' aktivointi epäonnistui, virheellinen asetustiedosto." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "Skriptikenttää ei löytynyt lisäosan tiedostosta: 'res://addons/%s'." +msgstr "Skriptikenttää ei löytynyt lisäosan tiedostosta: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4056,6 +4055,21 @@ msgstr "" msgid "Saving..." msgstr "Tallennetaan..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Valintatila" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Tuonti" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Lataa oletus" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d tiedostoa" @@ -5025,9 +5039,8 @@ msgid "Got:" msgstr "Saatiin:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "sha256-hajautusarvon tarkistus epäonnistui" +msgstr "SHA-256 hajautusarvon tarkistus epäonnistui" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5130,7 +5143,6 @@ msgid "Sort:" msgstr "Lajittele:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategoria:" @@ -10396,6 +10408,11 @@ msgstr "Automaattilataus" msgid "Plugins" msgstr "Liitännäiset" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Lataa oletus" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Esiasetus..." @@ -10645,14 +10662,12 @@ msgid "Instance Child Scene" msgstr "Luo aliskenen ilmentymä" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Ei voida suorittaa ulkopuolisen skenen solmuille!" +msgstr "Juurisolmua ei voida liittää samaan skeneen." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Liitä solmut" +msgstr "Liitä solmu(t)" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10784,9 +10799,8 @@ msgid "Attach Script" msgstr "Liitä skripti" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Leikkaa solmut" +msgstr "Leikkaa solmu(t)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -12449,6 +12463,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Tyhjällä CollisionPolygon2D solmulla ei ole vaikutusta törmäyksessä." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12767,11 +12789,6 @@ msgstr "" "GIProbe ei ole tuettu GLES2 näyttöajurissa.\n" "Käytä sen sijaan BakedLightmap resurssia." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera on vanhentunut ja poistetaan Godot 4.0 versiossa." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13115,6 +13132,11 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera on vanhentunut ja poistetaan Godot 4.0 versiossa." + #~ msgid "No" #~ msgstr "Ei" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index dc84dd744f..e9c24cf0f2 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -1804,8 +1804,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3884,6 +3884,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4936,7 +4948,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9972,6 +9983,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11928,6 +11943,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12183,11 +12206,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 44002bf560..7b9d411e6d 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -1938,8 +1938,8 @@ msgid "Open a File or Directory" msgstr "Ouvrir un fichier ou un répertoire" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Enregistrer" @@ -2624,8 +2624,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"Impossible de trouver le champ de script pour le plugin dans : « %s »." +msgstr "Impossible de trouver le champ de script pour le plugin dans : « %s »." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4168,17 +4167,29 @@ msgstr "" msgid "Saving..." msgstr "Enregistrement…" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "Sélectionnez un importeur" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "Importeur :" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "Réinitialiser" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fichiers" #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "Définir comme défaut pour « %s »" +msgstr "Définir comme préréglage pour « %s »" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "Effacer le préréglage par défaut pour « %s »" +msgstr "Effacer le préréglage pour « %s »" #: editor/import_dock.cpp msgid "Import As:" @@ -4186,7 +4197,7 @@ msgstr "Importer comme :" #: editor/import_dock.cpp msgid "Preset" -msgstr "Pré-réglage" +msgstr "Préréglage" #: editor/import_dock.cpp msgid "Reimport" @@ -5247,7 +5258,6 @@ msgid "Sort:" msgstr "Trier :" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Catégorie :" @@ -6030,7 +6040,7 @@ msgstr "Modifier la tangente de courbes" #: editor/plugins/curve_editor_plugin.cpp msgid "Load Curve Preset" -msgstr "Charger un pré-réglage de courbe" +msgstr "Charger un préréglage de courbe" #: editor/plugins/curve_editor_plugin.cpp msgid "Add Point" @@ -9700,7 +9710,7 @@ msgstr "Exécutable" #: editor/project_export.cpp msgid "Delete preset '%s'?" -msgstr "Supprimer le pré-réglage « %s » ?" +msgstr "Supprimer le préréglage « %s » ?" #: editor/project_export.cpp msgid "" @@ -9738,7 +9748,7 @@ msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme :" #: editor/project_export.cpp msgid "Presets" -msgstr "Pré-réglages" +msgstr "Préréglages" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add..." @@ -9749,9 +9759,9 @@ msgid "" "If checked, the preset will be available for use in one-click deploy.\n" "Only one preset per platform may be marked as runnable." msgstr "" -"Si cette option est activée, le pré-réglage sera disponible pour le " +"Si cette option est activée, le préréglage sera disponible pour le " "déploiement en un clic.\n" -"Un seul pré-réglage par plateforme peut être marqué comme exécutable." +"Un seul préréglage par plateforme peut être marqué comme exécutable." #: editor/project_export.cpp msgid "Export Path" @@ -10551,9 +10561,13 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Extensions" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "Préréglage des importeurs" + #: editor/property_editor.cpp msgid "Preset..." -msgstr "Pré-réglage…" +msgstr "Préréglage…" #: editor/property_editor.cpp msgid "Zero" @@ -12631,6 +12645,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vide n'a pas d'effet sur les collisions." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12955,11 +12977,6 @@ msgstr "" "Les GIProps ne sont pas supporter par le pilote de vidéos GLES2.\n" "A la place utilisez une BakedLightMap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera a été déprécié et sera supprimé dans Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13163,7 +13180,7 @@ msgid "" msgstr "" "Couleur : #%s\n" "Clic gauche : Définir la couleur\n" -"Clic droit : Supprimer le pré-réglage" +"Clic droit : Supprimer le préréglage" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -13183,7 +13200,7 @@ msgstr "Alterner entre les valeurs hexadécimales ou brutes." #: scene/gui/color_picker.cpp msgid "Add current color as a preset." -msgstr "Ajouter la couleur courante comme pré-réglage." +msgstr "Ajouter la couleur courante comme préréglage." #: scene/gui/container.cpp msgid "" @@ -13313,6 +13330,10 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera a été déprécié et sera supprimé dans Godot 4.0." + #~ msgid "No" #~ msgstr "Non" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 6bddf1e53c..4e537d9882 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -1798,8 +1798,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3879,6 +3879,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -4933,7 +4945,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9967,6 +9978,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11923,6 +11938,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12178,11 +12201,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 323fc16ec4..5559444f0c 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -1852,8 +1852,8 @@ msgid "Open a File or Directory" msgstr "Abrir un Arquivo ou Directorio" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Gardar" @@ -4044,6 +4044,21 @@ msgstr "" msgid "Saving..." msgstr "Gardando..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Elixir Modo" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importación" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Cargar Valores por Defecto" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Arquivos" @@ -5101,7 +5116,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "CategorÃa:" @@ -10264,6 +10278,11 @@ msgstr "AutoCargador" msgid "Plugins" msgstr "CaracterÃsticas Adicionais (Plugins)" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Cargar Valores por Defecto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12236,6 +12255,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12521,11 +12548,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index 7b3e8815ec..ab97d97c0a 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -1871,8 +1871,8 @@ msgid "Open a File or Directory" msgstr "פתיחת קובץ ×ו תיקייה" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "שמירה" @@ -4055,6 +4055,21 @@ msgstr "" msgid "Saving..." msgstr "שמירה…" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "× × ×œ×‘×—×•×¨ ×ž×¤×¨×§×™× ×œ×™×™×¦×•×" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ייבו×" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "×˜×¢×™× ×ª בררת המחדל" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d קבצי×" @@ -5143,7 +5158,6 @@ msgid "Sort:" msgstr "מיון:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "קטגוריה:" @@ -10439,6 +10453,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "×˜×¢×™× ×ª בררת המחדל" + #: editor/property_editor.cpp msgid "Preset..." msgstr "ערכה מוגדרת…" @@ -12470,6 +12489,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "ל־CollisionPolygon2D ריק ×ין השפעה על ×”×ª× ×’×©×•×ª." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12767,11 +12794,6 @@ msgstr "" "×ž× ×”×œ הוויד×ו GLES2 ××™× ×• תומך ב- GIProbes.\n" "השתמש ב-BakedLightmap במקו×." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight ×¢× ×–×•×•×™×ª רחבה מ-90 מעלות ××™× ×• יכול להטיל צללי×." diff --git a/editor/translations/hi.po b/editor/translations/hi.po index a4d46d6147..034451542b 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -1852,8 +1852,8 @@ msgid "Open a File or Directory" msgstr "फ़ाइल या डायरेकà¥à¤Ÿà¤°à¥€ खोलिये" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "सेव कीजिये" @@ -4035,6 +4035,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "आयात करने के लिठनोड (à¤à¤¸) का चयन करें" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "इंपोरà¥à¤Ÿ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤• लोड कीजिये" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -5086,7 +5101,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10214,6 +10228,11 @@ msgstr "" msgid "Plugins" msgstr "पà¥à¤²à¤—इनà¥à¤¸" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤• लोड कीजिये" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12217,6 +12236,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12474,11 +12501,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 4803018028..047363db63 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -1812,8 +1812,8 @@ msgid "Open a File or Directory" msgstr "Otvori datoteku ili direktorij" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Spremi" @@ -3893,6 +3893,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Odaberi Sve/NiÅ¡ta" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Uvoz" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "UÄitaj Zadano" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Fajlovi" @@ -4944,7 +4959,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9985,6 +9999,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "UÄitaj Zadano" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11944,6 +11963,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12199,11 +12226,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index db3403fdf1..3966959f91 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -1855,8 +1855,8 @@ msgid "Open a File or Directory" msgstr "Fájl vagy Könyvtár Megnyitása" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Mentés" @@ -4047,6 +4047,21 @@ msgstr "" msgid "Saving..." msgstr "Mentés..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Kiválasztó Mód" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importálás" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Alapértelmezett Betöltése" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d fájl" @@ -5110,7 +5125,6 @@ msgid "Sort:" msgstr "Rendezés:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategória:" @@ -10215,6 +10229,11 @@ msgstr "" msgid "Plugins" msgstr "BÅ‘vÃtmények" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Alapértelmezett Betöltése" + #: editor/property_editor.cpp msgid "Preset..." msgstr "BeépÃtett BeállÃtások..." @@ -12187,6 +12206,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12447,11 +12474,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/id.po b/editor/translations/id.po index 91e4392ab4..5dc5b9751a 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -28,12 +28,13 @@ # Richard Urban <redasuio1@gmail.com>, 2020. # yusuf afandi <afandi.yusuf.04@gmail.com>, 2020. # Habib Rohman <revolusi147id@gmail.com>, 2020. +# Hanz <hanzhaxors@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-11-13 22:59+0000\n" -"Last-Translator: Habib Rohman <revolusi147id@gmail.com>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Hanz <hanzhaxors@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -41,7 +42,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.4-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -57,7 +58,8 @@ msgstr "String dengan panjang 1 (karakter) yang diharapkan." #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Tidak cukup bytes untuk mendekode bytes, atau format tidak valid." +msgstr "" +"Tidak cukup bytes untuk merubah bytes ke nilai asal, atau format tidak valid." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -65,8 +67,7 @@ msgstr "Masukkan tidak sah %i (tidak diberikan) dalam ekspresi" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "" -"self tidak dapat digunakan karena tidak memiliki instance (tidak lolos)" +msgstr "self tidak dapat digunakan karena instance adalah null" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -74,7 +75,7 @@ msgstr "operan salah untuk operator %s, %s dan %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "Tipe index %s tidak valid untuk tipe dasar %s" +msgstr "Tipe indeks %s tidak valid untuk tipe dasar %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" @@ -1052,14 +1053,14 @@ msgid "Owners Of:" msgstr "Pemilik Dari:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Hapus berkas yang dipilih dari proyek? (tidak bisa dibatalkan)" +msgstr "" +"Hapus berkas yang dipilih dari proyek? (tidak bisa dibatalkan)\n" +"Anda bisa menemukan berkas yang telah dihapus di tong sampah." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1068,7 +1069,8 @@ msgid "" msgstr "" "File-file yang telah dihapus diperlukan oleh resource lain agar mereka dapat " "bekerja.\n" -"Hapus saja? (tidak bisa dibatalkan/undo)" +"Hapus saja? (tidak bisa dibatalkan)\n" +"Anda bisa menemukan berkas yang telah dihapus di tong sampah." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1621,34 +1623,31 @@ msgstr "" "Enabled'." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for GLES2. Enable " "'Import Pvrtc' in Project Settings." msgstr "" -"Platform target membutuhkan kompresi tekstur 'ETC' untuk GLES2. Aktifkan " -"'Impor Lainnya' di Pengaturan Proyek." +"Platform target membutuhkan kompresi tekstur 'PVRTC' untuk GLES2. Aktifkan " +"'Impor Pvrtc' di Pengaturan Proyek." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. " "Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings." msgstr "" -"Platform target membutuhkan kompresi tekstur 'ETC2' untuk GLES3. Aktifkan " -"'Impor Lainnya 2' di Pengaturan Proyek." +"Platform target membutuhkan kompresi tekstur 'ETC2' atau 'PVRTC' untuk " +"GLES3. Aktifkan 'Impor Lainnya 2' atau 'Import Pvrtc' di Pengaturan Proyek." #: editor/editor_export.cpp -#, fuzzy msgid "" "Target platform requires 'PVRTC' texture compression for the driver fallback " "to GLES2.\n" "Enable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" -"Platform target membutuhkan kompressi tekstur 'ETC' untuk mengembalikan " +"Platform target membutuhkan kompressi tekstur 'PVRTC' untuk mengembalikan " "driver ke GLES2. \n" -"Aktifkan 'Impor Lainnya' di Pengaturan Proyek, atau matikan 'Driver Fallback " +"Aktifkan 'Impor Pvrtc' di Pengaturan Proyek, atau matikan 'Driver Fallback " "Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp @@ -1877,8 +1876,8 @@ msgid "Open a File or Directory" msgstr "Buka sebuah File atau Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Simpan" @@ -2330,6 +2329,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"Terjadi kesalahan ketika mencoba menyimpan layout editor.\n" +"Pastikan jalur data pengguna editor dapat ditulis." #: editor/editor_node.cpp msgid "" @@ -2337,13 +2338,15 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"Penataan editor default telah dirubah.\n" +"Untuk mengembalikan penataan editor default ke asalnya, gunakan opsi Hapus " +"Penataan dan hapus Penataan Default." #: editor/editor_node.cpp msgid "Layout name not found!" msgstr "Nama layout tidak ditemukan!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." msgstr "Mengembalikan semula layout default ke pengaturan-pengaturan awal." @@ -2402,7 +2405,7 @@ msgstr "Tidak ada skena yang didefinisikan untuk dijalankan." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "Simpan skena sebelum menjalankan..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2481,7 +2484,6 @@ msgid "Reload Saved Scene" msgstr "Muat ulang scene yang sudah disimpan" #: editor/editor_node.cpp -#, fuzzy msgid "" "The current scene has unsaved changes.\n" "Reload the saved scene anyway? This action cannot be undone." @@ -2548,10 +2550,9 @@ msgstr "" "gagal." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Tidak dapat mencari bidang script untuk addon plugin pada: 'res://addons/%s'." +"Tidak dapat mencari bidang skrip untuk addon plugin pada: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2855,12 +2856,10 @@ msgstr "" "lokal." #: editor/editor_node.cpp -#, fuzzy msgid "Small Deploy with Network Filesystem" -msgstr "Deploy Kecil dengan Jaringan FS" +msgstr "Deploy Kecil dengan Jaringan Berkas" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, using one-click deploy for Android will only " "export an executable without the project data.\n" @@ -2869,9 +2868,9 @@ msgid "" "On Android, deploying will use the USB cable for faster performance. This " "option speeds up testing for projects with large assets." msgstr "" -"Ketika opsi ini aktif, ekspor atau deploy akan menghasilkan minimal " -"executable.\n" -"Berkas sistem akan tersedia dari proyek dari editor melalui jaringan.\n" +"Ketika opsi ini aktif, menggunakan 'one-click deploy' hanya akan mengekspor " +"executable tanpa data proyek.\n" +"Berkas sistem akan tersedia dari proyek oleh editor melalui jaringan.\n" "Pada Android, deploy akan menggunakan kabel USB untuk performa yang lebih " "cepat. Opsi ini mempercepat pengujian dengan jejak kaki yang besar." @@ -2880,34 +2879,29 @@ msgid "Visible Collision Shapes" msgstr "Collision Shapes Terlihat" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, collision shapes and raycast nodes (for 2D and " "3D) will be visible in the running project." msgstr "" "Collision shapes dan raycast nodes (untuk 2D dan 3D) akan terlihat pada saat " -"permainan berjalan jika opsi ini aktif." +"proyek berjalan jika opsi ini aktif." #: editor/editor_node.cpp msgid "Visible Navigation" msgstr "Navigasi Terlihat" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, navigation meshes and polygons will be visible " "in the running project." msgstr "" -"Navigasi meshes dan poligon akan terlihat saat game berjalan jika opsi ini " -"aktif." +"Navigasi dan poligon akan terlihat saat game berjalan jika opsi ini aktif." #: editor/editor_node.cpp -#, fuzzy msgid "Synchronize Scene Changes" msgstr "Sinkronkan Perubahan Skena" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any changes made to the scene in the editor " "will be replicated in the running project.\n" @@ -2915,17 +2909,15 @@ msgid "" "filesystem option is enabled." msgstr "" "Ketika opsi ini aktif, perubahan yang dibuat pada skena melalui editor akan " -"direplika pada gim yang sedang berjalan.\n" +"direplika pada proyek yang sedang berjalan.\n" "Ketika penggunaan remote pada sebuah perangkat, akan lebih efisien dengan " -"berkas sistem jaringan." +"opsi berkas sistem jaringan." #: editor/editor_node.cpp -#, fuzzy msgid "Synchronize Script Changes" -msgstr "Sinkronkan Perubahan Script" +msgstr "Sinkronkan Perubahan skrip" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any script that is saved will be reloaded in " "the running project.\n" @@ -2934,8 +2926,8 @@ msgid "" msgstr "" "Ketika opsi ini aktif, perubahan script yang tersimpan akan di muat kembali " "pada permainan yang sedang berjalan.\n" -"Ketika penggunaan remote pada sebuah perngakat, akan lebih efisien jika " -"jaringan filesystem." +"Ketika penggunaan remote pada sebuah perangakat, akan lebih efisien dengan " +"opsi jaringan berkas-berkas." #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" @@ -3154,13 +3146,12 @@ msgid "Open & Run a Script" msgstr "Buka & Jalankan Skrip" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"Berkas berikut lebih baru dalam diska.\n" -"Aksi apa yang ingin diambil?:" +"Berkas berikut lebih baru dalam disk.\n" +"Aksi apa yang ingin diambil?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3422,7 +3413,6 @@ msgid "Add Key/Value Pair" msgstr "Tambahkan pasangan Key/Value" #: editor/editor_run_native.cpp -#, fuzzy msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " @@ -3456,11 +3446,10 @@ msgid "Did you forget the '_run' method?" msgstr "Apakah anda lupa dengan fungsi '_run' ?" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes." msgstr "" -"Tahan Ctrl untuk meletakkan Getter. Tahan Shift untuk meletakkan generic " -"signature." +"Tahan Ctrl untuk membulatkan bilangan. Tahan Shift untuk meletakkan bilangan " +"yang lebih presisi." #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -3744,6 +3733,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"file dan/atau berkas-berkas berikut mempunyai konflik di '%s':\n" +"\n" +"%s\n" +"\n" +"Apakah Anda ingin melanjutkan (overwrite)?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3775,7 +3769,7 @@ msgstr "Buka Skena" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "Instansi" +msgstr "hal" #: editor/filesystem_dock.cpp msgid "Add to Favorites" @@ -3824,9 +3818,8 @@ msgid "Duplicate..." msgstr "Gandakan..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Move to Trash" -msgstr "Pindahkan Autoload" +msgstr "Pindahkan ke tong sampah" #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." @@ -3937,12 +3930,10 @@ msgid "Searching..." msgstr "Mencari..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." msgstr "Ditemukan %d kecocokan." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." msgstr "Ditemukan %d kecocokan." @@ -4085,6 +4076,21 @@ msgstr "" msgid "Saving..." msgstr "Menyimpan..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Mode Seleksi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Impor" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Muat Default" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Berkas" @@ -5153,7 +5159,6 @@ msgid "Sort:" msgstr "Sortir:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -10444,6 +10449,11 @@ msgstr "Muat Otomatis" msgid "Plugins" msgstr "Pengaya" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Muat Default" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Prasetel..." @@ -12504,6 +12514,14 @@ msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" "Sebuah CollisionPolygon2D yang kosong tidak memiliki efek pada collision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12824,11 +12842,6 @@ msgstr "" "GIProbes tidak didukung oleh driver video GLES2.\n" "Gunakan BakedLightmap sebagai gantinya." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 6de37d39fb..8d36556c04 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -1835,8 +1835,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3923,6 +3923,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Afrita val" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4988,7 +5001,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10079,6 +10091,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12050,6 +12066,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12305,11 +12329,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 2daa387575..1d399091c3 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -60,8 +60,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:50+0000\n" -"Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" +"PO-Revision-Date: 2021-03-07 06:04+0000\n" +"Last-Translator: Riteo Siuga <lorenzocerqua@tutanota.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -69,7 +69,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.5\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -192,7 +192,7 @@ msgstr "Elimina delle chiavi d'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "Cambia Intervallo Fotogramma Principale Animazione" +msgstr "Cambia il tempo di un fotogramma chiave" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" @@ -204,7 +204,7 @@ msgstr "Cambia la trasformazione di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "Cambia Valore Fotogramma Principale Animazione" +msgstr "Cambia il valore del fotogramma chiave di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Change Call" @@ -212,32 +212,32 @@ msgstr "Cambia la chiamata di un'animazione" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" -msgstr "Cambia Multipli Intervalli Fotogramma Principale Animazione" +msgstr "Cambia il tempo di più fotogrammi chiave" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transition" -msgstr "Cambi Multipli Transizione Animazione" +msgstr "Cambia la transizione di più animazioni" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Transform" -msgstr "Cambi Multipli Trasformazione Animazione" +msgstr "Cambia le trasformazioni di più animazioni" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" -msgstr "Cambia Multipli Valori Fotogramma Principale Animazione" +msgstr "Cambia il valore di più fotogrammi chiave di un'Animazione" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Call" -msgstr "Cambi Multipli Chiamata Animazione" +msgstr "Cambia la chiamata di metodo di più animazioni" #: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Cambia Lunghezza Animazione" +msgstr "Cambia la durata dell'animazione" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Cambia Loop Animazione" +msgstr "Commuta ciclicità animazione" #: editor/animation_track_editor.cpp msgid "Property Track" @@ -253,7 +253,7 @@ msgstr "Traccia di chiamate di metodo" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "Traccia di curve di Bézier" +msgstr "Traccia curva di Bézier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" @@ -273,11 +273,11 @@ msgstr "Durata dell'animazione (secondi)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "Aggiungi una traccia" +msgstr "Aggiungi Traccia" #: editor/animation_track_editor.cpp msgid "Animation Looping" -msgstr "Ciclicità animazione" +msgstr "Ciclicità Animazione" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -286,15 +286,15 @@ msgstr "Funzioni:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "Clip audio:" +msgstr "Clip Audio:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "Clip animazione:" +msgstr "Clip Animazione:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "Cambia il percorso della traccia" +msgstr "Cambia Percorso Traccia" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -302,11 +302,11 @@ msgstr "Attiva/Disattiva questa traccia." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "Modalità di aggiornamento (come viene impostata questa proprietà )" +msgstr "Modalità Aggiornamento (come viene impostata questa proprietà )" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" -msgstr "Modalità d'interpolazione" +msgstr "Modalità Interpolazione" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -322,7 +322,7 @@ msgstr "Tempo (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Abilita/Disabilita una traccia" +msgstr "Abilita/DisabilitaTraccia" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -376,23 +376,24 @@ msgstr "Elimina Fotogrammi Chiave Selezionati" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "Cambia la modalità d'aggiornamento di un'animazione" +msgstr "Cambia Modalità Aggiornamento Animazione" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "Cambia la modalità d'interpolazione di un'animazione" +msgstr "Cambia Modalità Interpolazione Animazione" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "Cambia la modalità del ciclo di un'animazione" +msgstr "Cambia Modalità Loop Animazione" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "Rimuovi la traccia di un'animazione" +msgstr "Rimuovi una traccia d'animazione" #: editor/animation_track_editor.cpp +#, fuzzy msgid "Create NEW track for %s and insert key?" -msgstr "Crea NUOVA traccia per %s ed inserire fotogramma chiave?" +msgstr "Creare una NUOVA traccia per %s e inserirci la chiave?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -520,11 +521,11 @@ msgstr "Gli appunti sono vuoti" #: editor/animation_track_editor.cpp msgid "Paste Tracks" -msgstr "Incolla delle tracce" +msgstr "Incolla Tracce" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" -msgstr "Scala delle chiavi d'animazione" +msgstr "Scala Chiavi Animazione" #: editor/animation_track_editor.cpp msgid "" @@ -656,15 +657,15 @@ msgstr "Ottimizzatore anim." #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "Max errore lineare:" +msgstr "Max Errore Lineare:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "Max errore angolare:" +msgstr "Max Errore Angolare:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" -msgstr "Max angolo ottimizzabile:" +msgstr "Max Angolo Ottimizzabile:" #: editor/animation_track_editor.cpp msgid "Optimize" @@ -709,7 +710,7 @@ msgstr "Copia" #: editor/animation_track_editor.cpp msgid "Select All/None" -msgstr "Seleziona tutto/nulla" +msgstr "De/Seleziona Tutto" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -725,23 +726,23 @@ msgstr "Cambia Offset Fine Clip Traccia Audio" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "Ridimensiona lista" +msgstr "Ridimensiona Array" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "Cambia il tipo del valore della lista" +msgstr "Cambia Tipo Valore Array" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "Cambia il valore della lista" +msgstr "Cambia Valore Array" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "Vai alla linea" +msgstr "Vai alla Linea" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "Numero della linea:" +msgstr "Numero Linea:" #: editor/code_editor.cpp msgid "%d replaced." @@ -757,11 +758,11 @@ msgstr "%d corrispondenze." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" -msgstr "Distingui le maiuscole" +msgstr "Distingui Maiuscole" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" -msgstr "Parole intere" +msgstr "Parole Intere" #: editor/code_editor.cpp msgid "Replace" @@ -769,11 +770,11 @@ msgstr "Sostituisci" #: editor/code_editor.cpp msgid "Replace All" -msgstr "Rimpiazza tutti" +msgstr "Rimpiazza Tutti" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "Solo nella selezione" +msgstr "Solo Selezione" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp @@ -810,7 +811,7 @@ msgstr "Numeri di riga e di colonna." #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "Il metodo del nodo designato deve essere specificato." +msgstr "Il metodo del nodo selezionato deve essere specificato." #: editor/connections_dialog.cpp msgid "Method name must be a valid identifier." @@ -1912,8 +1913,8 @@ msgid "Open a File or Directory" msgstr "Apri un file o una cartella" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salva" @@ -2593,11 +2594,9 @@ msgstr "" "configurazione fallita." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." msgstr "" -"Impossibile trovare il campo dello script per il componente aggiuntivo in: " -"'res://addons/%s'." +"Impossibile trovare il campo script per il plugin addon in posizione: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3158,13 +3157,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"Questo imposterà il tuo progetto per le build custom per Android, " -"installando i source templates in \"res://android/build\".\n" -"Puoi, allora, applicare le modifiche e costruire il tuo APK custom durante " -"l'esportazione (aggiungere moduli, cambiare il AndroidManifest.xml, ed " -"altro).\n" -"Nota che, in ordine per creare le build custom invece di usare gli APK pre-" -"costruiti, l'opzione \"Use Custom Build\" sarà abilitata nel preset " +"Questo predisporrà il progetto per le build personalizzate per Android " +"installando i template sorgente in \"res://android/build\".\n" +"Potrai allora applicare le modifiche e costruire il tuo APK personalizzato " +"durante l'esportazione (aggiungere moduli, cambiare l'AndroidManifest.xml, " +"eccetera).\n" +"Nota che per creare delle build personalizzate, invece di usare gli APK pre-" +"costruiti, l'opzione \"Use Custom Build\" va attivata nella preimpostazione " "d'esportazione per Android." #: editor/editor_node.cpp @@ -3174,30 +3173,30 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" -"Il modello della build Android è già installato in questo progetto e non " -"sarà sovrascritto.\n" -"Rimuovi la cartella \"res://android/build\" manualmente prima di ritentare " +"Il template della build Android è già installato in questo progetto e non " +"verrà sovrascritto.\n" +"Rimuovi manualmente la cartella \"res://android/build\" prima di ritentare " "questa operazione." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "Importa template da un file ZIP" +msgstr "Importa Template Da File ZIP" #: editor/editor_node.cpp msgid "Template Package" -msgstr "Pacchetto Modello" +msgstr "Pacchetto Template" #: editor/editor_node.cpp msgid "Export Library" -msgstr "Esporta libreria" +msgstr "Esporta Libreria" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "Unisci con esistente" +msgstr "Unisci Con Esistente" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "Apri ed esegui uno script" +msgstr "Apri ed Esegui uno Script" #: editor/editor_node.cpp msgid "" @@ -4135,6 +4134,21 @@ msgstr "" msgid "Saving..." msgstr "Salvataggio..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modalità di selezione" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importare" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Usa sRGB Default" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d File" @@ -5107,9 +5121,8 @@ msgid "Got:" msgstr "Ottenuto:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Check hash sha256 fallito" +msgstr "Check has SHA-256 fallito" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5212,7 +5225,6 @@ msgid "Sort:" msgstr "Ordina:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -10510,6 +10522,11 @@ msgstr "AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carica Predefiniti" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Preset…" @@ -10760,14 +10777,12 @@ msgid "Instance Child Scene" msgstr "Istanzia Scena Figlia" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Impossibile operare su nodi da scena esterna!" +msgstr "Non si può incollare il noto root nella stessa scena." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Incolla nodi" +msgstr "Incolla Nodo(i)" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10896,9 +10911,8 @@ msgid "Attach Script" msgstr "Allega Script" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Taglia nodi" +msgstr "Taglia Nodo(i)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -12579,6 +12593,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Un CollisionPolygon2D vuoto non ha effetti sulla collisione." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12903,11 +12925,6 @@ msgstr "" "Le GIProbes non sono supportate dal driver video GLES2.\n" "In alternativa, usa una BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "\"InterpolatedCamera\" è stata deprecata e sarà rimossa in Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13166,9 +13183,9 @@ msgid "" "functions. Making them visible for editing is fine, but they will hide upon " "running." msgstr "" -"I popup saranno nascosti di predefinita finchè non chiami popup() o una " -"delle qualsiasi funzioni popup*(). Farli diventare visibili per modificarli " -"va bene, ma scompariranno all'esecuzione." +"I popup saranno nascosti di default finchè non chiami popup(), o una delle " +"qualsiasi funzioni popup*(). Farli diventare visibili per modificarli va " +"bene, ma scompariranno durante l'esecuzione." #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -13251,6 +13268,11 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "\"InterpolatedCamera\" è stata deprecata e sarà rimossa in Godot 4.0." + #~ msgid "No" #~ msgstr "No" @@ -14914,9 +14936,6 @@ msgstr "Le constanti non possono essere modificate." #~ msgid "Use Default Light" #~ msgstr "Usa Luce Default" -#~ msgid "Use Default sRGB" -#~ msgstr "Usa sRGB Default" - #~ msgid "Default Light Normal:" #~ msgstr "Normale Luce di Default:" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 6c7ce36693..8afa2de349 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -36,8 +36,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:50+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -45,7 +45,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.5\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1881,8 +1881,8 @@ msgid "Open a File or Directory" msgstr "ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ã" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ä¿å˜" @@ -2554,11 +2554,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "アドオンプラグインを有効ã«ã§ãã¾ã›ã‚“: '%s' è¨å®šã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"アドオンプラグインã®ã‚¹ã‚¯ãƒªãƒ—トフィールド㌠'res://addons/%s' ã‹ã‚‰è¦‹ã¤ã‹ã‚Šã¾ã›" -"ん。" +msgstr "アドオンプラグインã®ã‚¹ã‚¯ãƒªãƒ—トフィールド㌠'%s' ã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4082,6 +4079,21 @@ msgstr "" msgid "Saving..." msgstr "ä¿å˜ä¸..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "インãƒãƒ¼ãƒˆ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "デフォルトをèªè¾¼ã‚€" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d ファイル" @@ -5046,9 +5058,8 @@ msgid "Got:" msgstr "å–å¾—:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "sha256 ãƒãƒƒã‚·ãƒ¥ãƒã‚§ãƒƒã‚¯å¤±æ•—" +msgstr "SHA-256 ãƒãƒƒã‚·ãƒ¥ãƒã‚§ãƒƒã‚¯å¤±æ•—" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5151,7 +5162,6 @@ msgid "Sort:" msgstr "ソート:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "カテゴリー:" @@ -10409,6 +10419,11 @@ msgstr "自動èªã¿è¾¼ã¿" msgid "Plugins" msgstr "プラグイン" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "デフォルトをèªè¾¼ã‚€" + #: editor/property_editor.cpp msgid "Preset..." msgstr "プリセット..." @@ -10658,12 +10673,10 @@ msgid "Instance Child Scene" msgstr "åシーンをインスタンス化" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "別ã®ã‚·ãƒ¼ãƒ³ã‹ã‚‰ãƒŽãƒ¼ãƒ‰ã‚’æ“作ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“!" +msgstr "ルートノードã¯åŒã˜ã‚·ãƒ¼ãƒ³ã«è²¼ã‚Šä»˜ã‘ã§ãã¾ã›ã‚“。" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "ノードを貼り付ã‘" @@ -10793,9 +10806,8 @@ msgid "Attach Script" msgstr "スクリプトをアタッãƒ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "ノードを切りå–ã‚‹" +msgstr "ノードを切りå–ã‚Š" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -11618,19 +11630,16 @@ msgid "Generate buffers" msgstr "ãƒãƒƒãƒ•ã‚¡ã‚’生æˆ" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "æ–¹å‘" +msgstr "直接光" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "å³ã‚¤ãƒ³ãƒ‡ãƒ³ãƒˆ" +msgstr "間接光" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" -msgstr "ãƒã‚¹ãƒˆãƒ—ãƒã‚»ã‚¹" +msgstr "後処ç†" #: modules/lightmapper_cpu/lightmapper_cpu.cpp #, fuzzy @@ -12460,6 +12469,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空㮠CollisionPolygon2D ã¯ã€è¡çªåˆ¤å®šã‚’æŒã¡ã¾ã›ã‚“。" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12781,11 +12798,6 @@ msgstr "" "GIProbesã¯GLES2ビデオドライãƒã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。\n" "代ã‚ã‚Šã«BakedLightmapを使用ã—ã¦ãã ã•ã„。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera ã¯å»ƒæ¢äºˆå®šã§ã‚ã‚Šã€Godot 4.0ã§é™¤åŽ»ã•ã‚Œã¾ã™ã€‚" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "90度を超ãˆã‚‹è§’度ã®ã‚¹ãƒãƒƒãƒˆãƒ©ã‚¤ãƒˆã¯ã€ã‚·ãƒ£ãƒ‰ã‚¦ã‚’投影ã§ãã¾ã›ã‚“。" @@ -13124,6 +13136,10 @@ msgstr "Varying変数ã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã msgid "Constants cannot be modified." msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera ã¯å»ƒæ¢äºˆå®šã§ã‚ã‚Šã€Godot 4.0ã§é™¤åŽ»ã•ã‚Œã¾ã™ã€‚" + #~ msgid "No" #~ msgstr "ã„ã„ãˆ" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index b9f4a92e47..6828baf211 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -1900,8 +1900,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -4028,6 +4028,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "წáƒáƒ•áƒ¨áƒáƒšáƒáƒ— მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბი?" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -5113,7 +5126,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10287,6 +10299,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12295,6 +12311,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12550,11 +12574,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 872cb1550c..b898f397f4 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -16,7 +16,7 @@ # Jiyoon Kim <kimjiy@dickinson.edu>, 2019. # Ervin <zetsmart@gmail.com>, 2019. # Tilto_ <tilto0822@develable.xyz>, 2020. -# Myeongjin Lee <aranet100@gmail.com>, 2020. +# Myeongjin Lee <aranet100@gmail.com>, 2020, 2021. # Doyun Kwon <caen4516@gmail.com>, 2020. # Jun Hyung Shin <shmishmi79@gmail.com>, 2020. # Yongjin Jo <wnrhd114@gmail.com>, 2020. @@ -25,8 +25,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-10-31 23:15+0000\n" -"Last-Translator: Yungjoong Song <yungjoong.song@gmail.com>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -34,7 +34,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.3.2-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -704,7 +704,7 @@ msgstr "í–‰ 번호:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "%d개가 바뀌었습니다." +msgstr "%dê°œ 찾아 바꿈." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -1044,22 +1044,23 @@ msgid "Owners Of:" msgstr "ì†Œìœ ìž:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "프로ì 트ì—ì„œ ì„ íƒí•œ 파ì¼ì„ ì‚ì œí• ê¹Œìš”? (ë˜ëŒë¦´ 수 없습니다)" +msgstr "" +"프로ì 트ì—ì„œ ì„ íƒëœ 파ì¼ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆë‹¤? (ë˜ëŒë¦´ 수 ì—†ìŒ)\n" +"시스템 휴지통ì—ì„œ ì œê±°ëœ íŒŒì¼ì„ ì°¾ê³ ë³µì›í• 수 있습니다." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" "Remove them anyway? (no undo)\n" "You can find the removed files in the system trash to restore them." msgstr "" -"ì‚ì œí•˜ë ¤ëŠ” 파ì¼ì€ 다른 리소스가 ë™ìž‘하기 위해 필요한 파ì¼ìž…니다.\n" -"ë¬´ì‹œí•˜ê³ ì‚ì œí• ê¹Œìš”? (ë˜ëŒë¦´ 수 없습니다)" +"ì œê±°í•˜ë ¤ëŠ” 파ì¼ì€ 다른 리소스가 ë™ìž‘하기 위해 필요합니다.\n" +"ë¬´ì‹œí•˜ê³ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ? (ë˜ëŒë¦´ 수 ì—†ìŒ)\n" +"시스템 휴지통ì—ì„œ ì œê±°ëœ íŒŒì¼ì„ ì°¾ê³ ë³µì›í• 수 있습니다." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1864,8 +1865,8 @@ msgid "Open a File or Directory" msgstr "ë””ë ‰í† ë¦¬ ë˜ëŠ” íŒŒì¼ ì—´ê¸°" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ì €ìž¥" @@ -2314,6 +2315,8 @@ msgid "" "An error occurred while trying to save the editor layout.\n" "Make sure the editor's user data path is writable." msgstr "" +"편집기 ë ˆì´ì•„ì›ƒì˜ ì €ìž¥ì„ í•˜ë ¤ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.\n" +"íŽ¸ì§‘ê¸°ì˜ ì‚¬ìš©ìž ë°ì´í„° 경로가 쓰기 가능한지 확ì¸í•´ì£¼ì„¸ìš”." #: editor/editor_node.cpp msgid "" @@ -2321,15 +2324,17 @@ msgid "" "To restore the Default layout to its base settings, use the Delete Layout " "option and delete the Default layout." msgstr "" +"기본 편집기 ë ˆì´ì•„ì›ƒì´ ë®ì–´ ì“°ì—¬ì ¸ 있습니디.\n" +"기본 ë ˆì´ì•„ì›ƒì„ ì›ëž˜ ì„¤ì •ìœ¼ë¡œ ë³µêµ¬í•˜ë ¤ë©´, ë ˆì´ì•„웃 ì‚ì œ ì˜µì…˜ì„ ì‚¬ìš©í•˜ì—¬ 기본 " +"ë ˆì´ì•„ì›ƒì„ ì‚ì œí•˜ì„¸ìš”." #: editor/editor_node.cpp msgid "Layout name not found!" msgstr "ë ˆì´ì•„웃 ì´ë¦„ì„ ì°¾ì„ ìˆ˜ 없습니다!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored the Default layout to its base settings." -msgstr "기본 ë ˆì´ì•„ì›ƒì„ ì´ˆê¸°í™”í•˜ì˜€ìŠµë‹ˆë‹¤." +msgstr "기본 ë ˆì´ì•„ì›ƒì„ ì›ëž˜ ì„¤ì •ìœ¼ë¡œ 복구하였습니다." #: editor/editor_node.cpp msgid "" @@ -2384,7 +2389,7 @@ msgstr "ì‹¤í–‰í• ì”¬ì´ ì„¤ì •ë˜ì§€ 않았습니다." #: editor/editor_node.cpp msgid "Save scene before running..." -msgstr "" +msgstr "ì”¬ì„ ì‹¤í–‰í•˜ê¸° ì „ì— ì €ìž¥..." #: editor/editor_node.cpp msgid "Could not start subprocess!" @@ -2507,8 +2512,8 @@ msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" -"ì´ ì„¤ì •ì€ ì œê±°ë˜ì—ˆìŠµë‹ˆë‹¤. ê°•ì œë¡œ ìƒˆë¡œê³ ì¹¨í•´ì•¼ 하는 ìƒí™©ì€ ì´ì œ 버그입니다. ì‹ " -"ê³ í•´ì£¼ì„¸ìš”." +"ì´ ì˜µì…˜ì€ ì‚¬ìš©ë˜ì§€ 않습니다. ê°•ì œë¡œ 새로 ê³ ì¹¨í•´ì•¼ 하는 ìƒí™©ì€ ì´ì œ 버그로 ê°„" +"주ë©ë‹ˆë‹¤. ì‹ ê³ í•´ì£¼ì„¸ìš”." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -2529,9 +2534,9 @@ msgstr "" "실패했습니다." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "ë‹¤ìŒ ê²½ë¡œì—ì„œ ì• ë“œì˜¨ 플러그ì¸ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: 'res://addons/%s'." +msgstr "" +"ë‹¤ìŒ ê²½ë¡œì—ì„œ ì• ë“œì˜¨ 플러그ì¸ì„ 위한 스í¬ë¦½íŠ¸ 필드를 ì°¾ì„ ìˆ˜ 없습니다: '%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -2894,17 +2899,16 @@ msgid "Synchronize Script Changes" msgstr "스í¬ë¦½íŠ¸ ë³€ê²½ì‚¬í• ë™ê¸°í™”" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any script that is saved will be reloaded in " "the running project.\n" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"ì´ ì„¤ì •ì´ í™œì„±í™”ëœ ê²½ìš°, ì–´ë–¤ 스í¬ë¦½íŠ¸ë“ ì €ìž¥í•˜ë©´ ì‹¤í–‰ì¤‘ì¸ ê²Œìž„ì—ë„ ìƒˆë¡œê³ ì¹¨" -"ë˜ì–´ ë°˜ì˜ë©ë‹ˆë‹¤.\n" -"ì›ê²© 장치ì—ì„œ ì‚¬ìš©ì¤‘ì¸ ê²½ìš° ë„¤íŠ¸ì›Œí¬ íŒŒì¼ ì‹œìŠ¤í…œ ê¸°ëŠ¥ì„ í™œì„±í™”í•˜ë©´ ë”ìš± 효율" -"ì 입니다." +"ì´ ì˜µì…˜ì´ í™œì„±í™”ëœ ê²½ìš°, ì–´ë–¤ 스í¬ë¦½íŠ¸ë“ 지 ì €ìž¥ë˜ë©´ 실행 ì¤‘ì¸ í”„ë¡œì 트를 다" +"ì‹œ 불러오게 ë©ë‹ˆë‹¤.\n" +"기기ì—ì„œ ì›ê²©ìœ¼ë¡œ 사용 ì¤‘ì¸ ê²½ìš°, ë„¤íŠ¸ì›Œí¬ íŒŒì¼ ì‹œìŠ¤í…œ ì˜µì…˜ì´ í™œì„±í™”ë˜ì–´ 있다" +"ë©´ ë”ìš± 효율ì 입니다." #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" @@ -3120,13 +3124,12 @@ msgid "Open & Run a Script" msgstr "스í¬ë¦½íŠ¸ 열기 & 실행" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" -"해당 파ì¼ì€ 디스í¬ì— 있는 게 ë” ìµœì‹ ìž…ë‹ˆë‹¤.\n" -"어떻게 í• ê±´ê°€ìš”?:" +"ë‹¤ìŒ íŒŒì¼ì€ 디스í¬ì— 있는 게 ë” ìµœì‹ ìž…ë‹ˆë‹¤.\n" +"ì¡°ì¹˜ì„ ì–´ë–»ê²Œ 취해야 합니까?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3385,14 +3388,14 @@ msgid "Add Key/Value Pair" msgstr "키/ê°’ ìŒ ì¶”ê°€" #: editor/editor_run_native.cpp -#, fuzzy msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the Export menu or define an existing preset " "as runnable." msgstr "" -"ì´ í”Œëž«í¼ìœ¼ë¡œ ì‹¤í–‰í• ìˆ˜ 있는 내보내기 í”„ë¦¬ì…‹ì´ ì—†ìŠµë‹ˆë‹¤.\n" -"내보내기 메뉴ì—ì„œ ì‹¤í–‰í• ìˆ˜ 있는 í”„ë¦¬ì…‹ì„ ì¶”ê°€í•´ì£¼ì„¸ìš”." +"ì´ í”Œëž«í¼ì„ 위한 ì‹¤í–‰í• ìˆ˜ 있는 내보내기 í”„ë¦¬ì…‹ì´ ì—†ìŠµë‹ˆë‹¤.\n" +"내보내기 메뉴ì—ì„œ ì‹¤í–‰í• ìˆ˜ 있는 í”„ë¦¬ì…‹ì„ ì¶”ê°€í•˜ê±°ë‚˜ 기존 í”„ë¦¬ì…‹ì„ ì‹¤í–‰í• ìˆ˜ " +"있ë„ë¡ ì§€ì •í•´ì£¼ì„¸ìš”." #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -3705,6 +3708,11 @@ msgid "" "\n" "Do you wish to overwrite them?" msgstr "" +"ë‹¤ìŒ íŒŒì¼ì´ë‚˜ í´ë”ê°€ ëŒ€ìƒ ìœ„ì¹˜ '%s'ì˜ í•ëª©ê³¼ 충ëŒí•©ë‹ˆë‹¤:\n" +"\n" +"%s\n" +"\n" +"ì´ë¥¼ ë®ì–´ì“°ì‹œê² 습니까?" #: editor/filesystem_dock.cpp msgid "Renaming file:" @@ -3785,9 +3793,8 @@ msgid "Duplicate..." msgstr "ë³µì œ..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Move to Trash" -msgstr "ì˜¤í† ë¡œë“œ ì´ë™" +msgstr "휴지통으로 ì´ë™" #: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Rename..." @@ -3898,19 +3905,16 @@ msgid "Searching..." msgstr "검색 중..." #: editor/find_in_files.cpp -#, fuzzy msgid "%d match in %d file." -msgstr "%dê°œ ì¼ì¹˜." +msgstr "íŒŒì¼ %d$2ê°œ 중 %d$1ê°œ ì¼ì¹˜." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d file." -msgstr "%dê°œ ì¼ì¹˜." +msgstr "íŒŒì¼ %d$2ê°œ 중 %d$1ê°œ ì¼ì¹˜." #: editor/find_in_files.cpp -#, fuzzy msgid "%d matches in %d files." -msgstr "%dê°œ ì¼ì¹˜." +msgstr "íŒŒì¼ %d$2ê°œ 중 %d$1ê°œ ì¼ì¹˜." #: editor/groups_editor.cpp msgid "Add to Group" @@ -4046,6 +4050,21 @@ msgstr "`post_import()` 메소드ì—ì„œ Nodeì—ì„œ ìƒì†ë°›ì€ ê°ì²´ë¥¼ 반환 msgid "Saving..." msgstr "ì €ìž¥ 중..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "모드 ì„ íƒ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "ê°€ì ¸ì˜¤ê¸°" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "기본 sRGB 사용" + #: editor/import_dock.cpp msgid "%d Files" msgstr "íŒŒì¼ %dê°œ" @@ -5009,9 +5028,8 @@ msgid "Got:" msgstr "ë°›ìŒ:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "sha256 í•´ì‹œ í™•ì¸ ì‹¤íŒ¨" +msgstr "SHA-256 í•´ì‹œ í™•ì¸ ì‹¤íŒ¨" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5114,7 +5132,6 @@ msgid "Sort:" msgstr "ì •ë ¬:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "ì¹´í…Œê³ ë¦¬:" @@ -5143,14 +5160,12 @@ msgid "Assets ZIP File" msgstr "ì• ì…‹ ZIP 파ì¼" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "" "Can't determine a save path for lightmap images.\n" "Save your scene and try again." msgstr "" -"ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ì˜ ì €ìž¥ 경로를 íŒŒì•…í• ìˆ˜ 없습니다.\n" -"(ê°™ì€ ê²½ë¡œì— ì´ë¯¸ì§€ë¥¼ ì €ìž¥í• ìˆ˜ 있ë„ë¡) ì”¬ì„ ì €ìž¥í•˜ê±°ë‚˜, BakedLightmap ì†ì„±ì—" -"ì„œ ì €ìž¥ 경로를 ì§€ì •í•˜ì„¸ìš”." +"ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ë¥¼ 위한 ì €ìž¥ 경로를 ê²°ì •í• ìˆ˜ 없습니다.\n" +"ë‹¹ì‹ ì˜ ì”¬ì„ ì €ìž¥í•˜ê³ ë‹¤ì‹œ ì‹œë„하세요." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5167,26 +5182,30 @@ msgstr "ë¼ì´íŠ¸ë§µ ì´ë¯¸ì§€ ìƒì„± 실패. 작성 가능한 경로ì¸ì§€ 확ì #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" msgstr "" +"ë¼ì´íŠ¸ë§µ í¬ê¸°ë¥¼ ê²°ì •í•˜ëŠ” ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. 최대 ë¼ì´íŠ¸ë§µ í¬ê¸°ê°€ 너무 작나요?" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." msgstr "" +"ì¼ë¶€ 메시가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. UV2 ì±„ë„ ê°’ì´ [0.0,1.0] ì •ì‚¬ê°í˜• ì˜ì— ì•ˆì— í¬í•¨ë˜" +"ì–´ 있는지 확ì¸í•´ì£¼ì„¸ìš”." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" "Godot editor was built without ray tracing support, lightmaps can't be baked." msgstr "" +"Godot 편집기가 ë ˆì´ íŠ¸ë ˆì´ì‹± ì§€ì› ì—†ì´ ë¹Œë“œë˜ì–´ 있어, ë¼ì´íŠ¸ë§µì´ 구워질 수 ì—†" +"습니다." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" msgstr "ë¼ì´íŠ¸ë§µ 굽기" #: editor/plugins/baked_lightmap_editor_plugin.cpp -#, fuzzy msgid "Select lightmap bake file:" -msgstr "템플릿 íŒŒì¼ ì„ íƒ" +msgstr "ë¼ì´íŠ¸ë§µì„ 구울 íŒŒì¼ ì„ íƒ:" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5255,50 +5274,43 @@ msgstr "ìˆ˜í‰ ë° ìˆ˜ì§ ê°€ì´ë“œ 만들기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set CanvasItem \"%s\" Pivot Offset to (%d, %d)" -msgstr "CanvasItem \"%s\" Pivot Offset (%d, %d)ë¡œ ì„¤ì •" +msgstr "CanvasItem \"%s\"ì˜ í”¼ë²— ì˜¤í”„ì…‹ì„ (%d, %d)ë¡œ ì„¤ì •" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate %d CanvasItems" -msgstr "CanvasItem íšŒì „" +msgstr "CanvasItem %dê°œ íšŒì „" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Rotate CanvasItem \"%s\" to %d degrees" -msgstr "CanvasItem íšŒì „" +msgstr "CanvasItem \"%s\"를 %dë„ë¡œ íšŒì „" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" Anchor" -msgstr "CanvasItem ì´ë™" +msgstr "CanvasItem \"%s\" 앵커 ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "" +msgstr "Node2D \"%s\"를 (%s, %s)ë¡œ í¬ê¸° ì¡°ì ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" -msgstr "" +msgstr "컨트롤 \"%s\"를 (%d, %d)ë¡œ í¬ê¸° ì¡°ì ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale %d CanvasItems" -msgstr "CanvasItem 규모" +msgstr "CanvasItem %dê°œ í¬ê¸° ì¡°ì ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "CanvasItem 규모" +msgstr "CanvasItem \"%s\"를 (%s, %s)ë¡œ í¬ê¸° ì¡°ì ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move %d CanvasItems" -msgstr "CanvasItem ì´ë™" +msgstr "CanvasItem %dê°œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move CanvasItem \"%s\" to (%d, %d)" -msgstr "CanvasItem ì´ë™" +msgstr "CanvasItem \"%s\"를 (%d, %d)ë¡œ ì´ë™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5504,7 +5516,7 @@ msgstr "íšŒì „ëª¨ë“œ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode" -msgstr "í¬ê¸°ì¡°ì ˆ 모드" +msgstr "í¬ê¸° ì¡°ì ˆ 모드" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5553,7 +5565,7 @@ msgstr "íšŒì „ 스냅 사용" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "스마트 스냅 사용" +msgstr "í¬ê¸° ì¡°ì ˆ 스냅 사용" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" @@ -5671,11 +5683,11 @@ msgstr "ì„ íƒ í•ëª© 중앙으로" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "ì„ íƒ í•ëª© ì „ì²´ 화면으로" +msgstr "í”„ë ˆìž„ ì„ íƒ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "캔버스 규모 미리 보기" +msgstr "캔버스 í¬ê¸° ì¡°ì ˆ 미리 보기" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." @@ -5937,7 +5949,7 @@ msgstr "기울기 편집ë¨" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" -msgstr "í•ëª© %d" +msgstr "í•ëª© %dê°œ" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" @@ -6277,9 +6289,8 @@ msgid "Can only set point into a ParticlesMaterial process material" msgstr "ParticlesMaterial 프로세스 머티리얼 안ì—만 ì ì„ ì„¤ì •í• ìˆ˜ 있습니다" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Convert to CPUParticles2D" -msgstr "CPU파티í´ë¡œ 변환" +msgstr "CPUParticles2Dë¡œ 변환" #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp @@ -6567,18 +6578,16 @@ msgid "Move Points" msgstr "ì ì´ë™" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Command: Rotate" -msgstr "드래그: íšŒì „" +msgstr "Command: íšŒì „" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" msgstr "Shift: ëª¨ë‘ ì´ë™" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Shift+Command: Scale" -msgstr "Shift+Ctrl: í¬ê¸° ì¡°ì ˆ" +msgstr "Shift+Command: í¬ê¸° ì¡°ì ˆ" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" @@ -6625,14 +6634,12 @@ msgid "Radius:" msgstr "반지름:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy Polygon to UV" -msgstr "í´ë¦¬ê³¤ & UV 만들기" +msgstr "í´ë¦¬ê³¤ì„ UVë¡œ 복사" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Copy UV to Polygon" -msgstr "Polygon2Dë¡œ 변환" +msgstr "UV를 í´ë¦¬ê³¤ìœ¼ë¡œ 복사" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" @@ -6891,7 +6898,7 @@ msgstr "ëª¨ë‘ ì €ìž¥" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "스í¬ë¦½íŠ¸ ìƒˆë¡œê³ ì¹¨" +msgstr "스í¬ë¦½íŠ¸ ì¼ë°˜ ìƒˆë¡œê³ ì¹¨" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" @@ -7118,7 +7125,7 @@ msgstr "ì£¼ì„ í† ê¸€" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" -msgstr "í–‰ 펼치기/ì ‘ê¸°" +msgstr "í–‰ ì ‘ê¸°/펼치기" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" @@ -7162,7 +7169,7 @@ msgstr "파ì¼ì—ì„œ 찾기..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "ìƒí™©ì— 맞는 ë„움" +msgstr "ìƒí™©ì— 맞는 ë„움ë§" #: editor/plugins/script_text_editor.cpp msgid "Toggle Bookmark" @@ -7178,7 +7185,7 @@ msgstr "ì´ì „ ë¶ë§ˆí¬ë¡œ ì´ë™" #: editor/plugins/script_text_editor.cpp msgid "Remove All Bookmarks" -msgstr "ëª¨ë“ ë¶ë§ˆí¬ ì‚ì œ" +msgstr "ëª¨ë“ ë¶ë§ˆí¬ ì œê±°" #: editor/plugins/script_text_editor.cpp msgid "Go to Function..." @@ -7195,7 +7202,7 @@ msgstr "중단ì í† ê¸€" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "중단ì ëª¨ë‘ ì‚ì œ" +msgstr "중단ì ëª¨ë‘ ì œê±°" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Breakpoint" @@ -7314,9 +7321,8 @@ msgid "Yaw" msgstr "ìš”" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "í¬ê¸°: " +msgstr "í¬ê¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -7544,7 +7550,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" -msgstr "로컬 스페ì´ìŠ¤ 사용" +msgstr "로컬 공간 사용" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" @@ -7601,7 +7607,7 @@ msgstr "변형" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" -msgstr "ê°ì²´ë¥¼ ë°”ë‹¥ì— ìŠ¤ëƒ…" +msgstr "개체를 ë°”ë‹¥ì— ìŠ¤ëƒ…" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." @@ -7814,7 +7820,7 @@ msgstr "ì„ íƒí•œ í”„ë ˆìž„ ì—†ìŒ" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "%dê°œì˜ í”„ë ˆìž„ 추가" +msgstr "í”„ë ˆìž„ %dê°œ 추가" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" @@ -7861,9 +7867,8 @@ msgid "New Animation" msgstr "새 ì• ë‹ˆë©”ì´ì…˜" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Speed:" -msgstr "ì†ë„ (FPS):" +msgstr "ì†ë„:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" @@ -8121,7 +8126,7 @@ msgstr "테마 파ì¼" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "ì„ íƒ ì§€ìš°ê¸°" +msgstr "ì„ íƒ í•ëª© 지우기" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Fix Invalid Tiles" @@ -8181,13 +8186,12 @@ msgid "Paint Tile" msgstr "íƒ€ì¼ ì¹ í•˜ê¸°" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "" "Shift+LMB: Line Draw\n" "Shift+Command+LMB: Rectangle Paint" msgstr "" -"Shift+ìš°í´ë¦: ì„ ê·¸ë¦¬ê¸°\n" -"Shift+Ctrl+ìš°í´ë¦: ì‚¬ê° ì˜ì— 페ì¸íŠ¸" +"Shift+좌í´ë¦: ì„ ê·¸ë¦¬ê¸°\n" +"Shift+Command+좌í´ë¦: ì‚¬ê° ì˜ì— 페ì¸íŠ¸" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" @@ -8227,7 +8231,7 @@ msgstr "TileSetì— í…스처를 추가합니다." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove selected Texture from TileSet." -msgstr "ì„ íƒí•œ í…스처를 TileSetì—ì„œ ì‚ì œ." +msgstr "ì„ íƒí•œ í…스처를 TileSetì—ì„œ ì œê±°í•©ë‹ˆë‹¤." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -8342,23 +8346,20 @@ msgid "Create a new rectangle." msgstr "새로운 사ê°í˜•ì„ 만ë“니다." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Rectangle" -msgstr "ì‚¬ê° ì˜ì— ì¹ í•˜ê¸°" +msgstr "새 ì‚¬ê° ì˜ì—" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create a new polygon." msgstr "새로운 í´ë¦¬ê³¤ì„ 만ë“니다." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "New Polygon" -msgstr "í´ë¦¬ê³¤ ì´ë™" +msgstr "새 í´ë¦¬ê³¤" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete Selected Shape" -msgstr "ì„ íƒ í•ëª© ì‚ì œ" +msgstr "ì„ íƒëœ 모양 ì‚ì œ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." @@ -8719,7 +8720,6 @@ msgid "Add Node to Visual Shader" msgstr "노드를 비주얼 ì…°ì´ë”ì— ì¶”ê°€" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node(s) Moved" msgstr "노드 ì´ë™ë¨" @@ -8741,9 +8741,8 @@ msgid "Visual Shader Input Type Changed" msgstr "비주얼 ì…°ì´ë” ìž…ë ¥ ìœ í˜• 변경ë¨" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "UniformRef Name Changed" -msgstr "Uniform ì´ë¦„ ì„¤ì •" +msgstr "UniformRef ì´ë¦„ 변경ë¨" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" @@ -8924,7 +8923,7 @@ msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매ê #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "ê¼ì§“ì ê³¼ 프래그먼트 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." +msgstr "프래그먼트과 조명 ì…°ì´ë” ëª¨ë“œì— ëŒ€í•œ '%s' ìž…ë ¥ 매개변수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." @@ -9017,7 +9016,7 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì—ìŒê³¡íƒ„ì 트 ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "매개변수보다 í¬ê±°ë‚˜ ê°™ì€ ê°€ìž¥ 가까운 ì •ìˆ˜ë¥¼ 찾아요." +msgstr "매개변수보다 í¬ê±°ë‚˜ ê°™ì€ ê°€ìž¥ 가까운 ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." @@ -9045,7 +9044,7 @@ msgstr "2ê°€ ë°‘ì¸ ì§€ìˆ˜ 함수." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "매개변수보다 ì 거나 ê°™ì€ ê°€ìž¥ 가까운 ì •ìˆ˜ë¥¼ 찾아요." +msgstr "매개변수보다 ì 거나 ê°™ì€ ê°€ìž¥ 가까운 ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." @@ -9098,11 +9097,11 @@ msgstr "1.0 / 스칼ë¼" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "매개변수ì—ì„œ 가장 가까운 ì •ìˆ˜ë¥¼ 찾아요." +msgstr "매개변수ì—ì„œ 가장 가까운 ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "매개변수ì—ì„œ 가장 가까운 ì§ìˆ˜ ì •ìˆ˜ë¥¼ 찾아요." +msgstr "매개변수ì—ì„œ 가장 가까운 ì§ìˆ˜ ì •ìˆ˜ë¥¼ 찾습니다." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." @@ -9741,8 +9740,8 @@ msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" -"프로ì 트 경로ì—ì„œ project.godotì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다 (error %d). 누ë½ë˜ê±°ë‚˜ " -"ì†ìƒëœ 모양입니다." +"프로ì 트 경로ì—ì„œ project.godotì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다 (오류 %d). 누ë½ë˜ê±°ë‚˜ ì†" +"ìƒëœ 모양입니다." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." @@ -9802,7 +9801,7 @@ msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "Not supported by your GPU drivers." -msgstr "" +msgstr "ë‹¹ì‹ ì˜ GPU ë“œë¼ì´ë²„ì— ì˜í•´ 지ì›ë˜ì§€ 않습니다." #: editor/project_manager.cpp msgid "" @@ -9974,9 +9973,8 @@ msgid "Projects" msgstr "프로ì 트" #: editor/project_manager.cpp -#, fuzzy msgid "Loading, please wait..." -msgstr "미러를 검색 중입니다. ê¸°ë‹¤ë ¤ì£¼ì„¸ìš”..." +msgstr "로드 중, ê¸°ë‹¤ë ¤ 주세요..." #: editor/project_manager.cpp msgid "Last Modified" @@ -10348,6 +10346,11 @@ msgstr "ì˜¤í† ë¡œë“œ" msgid "Plugins" msgstr "플러그ì¸(Plugin)" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "기본값 불러오기" + #: editor/property_editor.cpp msgid "Preset..." msgstr "프리셋..." @@ -10426,7 +10429,7 @@ msgstr "ì •ê·œ í‘œí˜„ì‹ ì‚¬ìš©" #: editor/rename_dialog.cpp msgid "Advanced Options" -msgstr "ê³ ê¸‰ ì„¤ì •" +msgstr "ê³ ê¸‰ 옵션" #: editor/rename_dialog.cpp msgid "Substitute" @@ -10458,7 +10461,7 @@ msgid "" "Compare counter options." msgstr "" "순차 ì •ìˆ˜ ì¹´ìš´í„°.\n" -"ì¹´ìš´í„° ì„¤ì •ê³¼ 비êµí•©ë‹ˆë‹¤." +"ì¹´ìš´í„° 옵션과 비êµí•©ë‹ˆë‹¤." #: editor/rename_dialog.cpp msgid "Per-level Counter" @@ -10595,12 +10598,10 @@ msgid "Instance Child Scene" msgstr "ìžì‹ 씬 ì¸ìŠ¤í„´ìŠ¤í™”" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "다른 씬ì—ì„œ ìˆ˜í–‰í• ìˆ˜ 없는 작업입니다!" +msgstr "루트 노드를 ê°™ì€ ì”¬ 안으로 ë¶™ì—¬ë„£ì„ ìˆ˜ 없습니다." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "노드 붙여넣기" @@ -10730,7 +10731,6 @@ msgid "Attach Script" msgstr "스í¬ë¦½íŠ¸ 붙ì´ê¸°" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "노드 잘ë¼ë‚´ê¸°" @@ -11539,36 +11539,31 @@ msgstr "메시를 ì‚¬ìš©í•˜ë ¤ë©´ ì´ GridMapì— MeshLibrary 리소스를 주세 #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "" +msgstr "굽기 시작" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" -msgstr "" +msgstr "ë°ì´í„° 구조 준비 중" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Generate buffers" -msgstr "AABB 만들기" +msgstr "ë²„í¼ ìƒì„±" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Direct lighting" -msgstr "ë°©í–¥" +msgstr "조명 ë°©í–¥" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Indirect lighting" -msgstr "들여쓰기" +msgstr "ê°„ì ‘ 조명" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Post processing" msgstr "후처리" #: modules/lightmapper_cpu/lightmapper_cpu.cpp -#, fuzzy msgid "Plotting lightmaps" -msgstr "구분하는 조명:" +msgstr "구분하는 조명" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -11580,11 +11575,11 @@ msgstr "내부 예외 ìŠ¤íƒ ì¶”ì ì˜ ë" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Bake NavMesh" -msgstr "NavMesh ë² ì´í¬" +msgstr "NavMesh 굽기" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "내비게ì´ì…˜ 메시 지우기." +msgstr "내비게ì´ì…˜ 메시를 지ì›ë‹ˆë‹¤." #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -12082,15 +12077,15 @@ msgstr "목ë¡ì—ì„œ 기기 ì„ íƒ" #: platform/android/export/export.cpp msgid "Unable to find the 'apksigner' tool." -msgstr "" +msgstr "'apksigner' ë„구를 ì°¾ì„ ìˆ˜ 없습니다." #: platform/android/export/export.cpp msgid "" "Android build template not installed in the project. Install it from the " "Project menu." msgstr "" -"프로ì íŠ¸ì— ì•ˆë“œë¡œì´ë“œ 빌드 í…œí”Œë¦¿ì„ ì„¤ì¹˜í•˜ì§€ 않았습니다. 프로ì 트 메뉴ì—ì„œ 설" -"치하세요." +"프로ì íŠ¸ì— Android 빌드 í…œí”Œë¦¿ì„ ì„¤ì¹˜í•˜ì§€ 않았습니다. 프로ì 트 메뉴ì—ì„œ 설치" +"하세요." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12101,35 +12096,32 @@ msgid "Release keystore incorrectly configured in the export preset." msgstr "내보내기 í”„ë¦¬ì…‹ì— ë°°í¬ keystorkeê°€ 잘못 ì„¤ì •ë˜ì–´ 있습니다." #: platform/android/export/export.cpp -#, fuzzy msgid "A valid Android SDK path is required in Editor Settings." -msgstr "편집기 ì„¤ì •ì—ì„œ 맞춤 ë¹Œë“œì— ìž˜ëª»ëœ ì•ˆë“œë¡œì´ë“œ SDK 경로입니다." +msgstr "편집기 ì„¤ì •ì—ì„œ 올바른 Android SDK 경로가 필요합니다." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid Android SDK path in Editor Settings." -msgstr "편집기 ì„¤ì •ì—ì„œ 맞춤 ë¹Œë“œì— ìž˜ëª»ëœ ì•ˆë“œë¡œì´ë“œ SDK 경로입니다." +msgstr "편집기 ì„¤ì •ì—ì„œ ìž˜ëª»ëœ Android SDK 경로입니다." #: platform/android/export/export.cpp msgid "Missing 'platform-tools' directory!" -msgstr "" +msgstr "'platform-tools' ë””ë ‰í„°ë¦¬ê°€ 없습니다!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK platform-tools' adb command." -msgstr "" +msgstr "Android SDK platform-toolsì˜ adb ëª…ë ¹ì„ ì°¾ì„ ìˆ˜ 없습니다." #: platform/android/export/export.cpp -#, fuzzy msgid "Please check in the Android SDK directory specified in Editor Settings." -msgstr "편집기 ì„¤ì •ì—ì„œ 맞춤 ë¹Œë“œì— ìž˜ëª»ëœ ì•ˆë“œë¡œì´ë“œ SDK 경로입니다." +msgstr "편집기 ì„¤ì •ì—ì„œ ì§€ì •ëœ Android SDK ë””ë ‰í„°ë¦¬ë¥¼ 확ì¸í•´ì£¼ì„¸ìš”." #: platform/android/export/export.cpp msgid "Missing 'build-tools' directory!" -msgstr "" +msgstr "'build-tools' ë””ë ‰í„°ë¦¬ê°€ 없습니다!" #: platform/android/export/export.cpp msgid "Unable to find Android SDK build-tools' apksigner command." -msgstr "" +msgstr "Android SDK build-toolsì˜ apksigner ëª…ë ¹ì„ ì°¾ì„ ìˆ˜ 없습니다." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." @@ -12193,8 +12185,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" -"맞춤 빌드 템플릿으로 ë¹Œë“œí•˜ë ¤ 했으나, ë²„ì „ ì •ë³´ê°€ê°€ 없습니다. '프로ì 트' 메뉴" -"ì—ì„œ 다시 설치해주세요." +"맞춤 빌드 템플릿으로 ë¹Œë“œí•˜ë ¤ 했으나, ë²„ì „ ì •ë³´ê°€ 없습니다. '프로ì 트' 메뉴ì—" +"ì„œ 다시 설치해주세요." #: platform/android/export/export.cpp msgid "" @@ -12203,32 +12195,34 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" -"안드로ì´ë“œ 빌드 ë²„ì „ì´ ë§žì§€ ì•ŠìŒ:\n" -" 설치한 템플릿: %s\n" +"Android 빌드 ë²„ì „ì´ ë§žì§€ ì•ŠìŒ:\n" +" ì„¤ì¹˜ëœ í…œí”Œë¦¿: %s\n" " Godot ë²„ì „: %s\n" -"'프로ì 트' 메뉴ì—ì„œ 안드로ì´ë“œ 빌드 í…œí”Œë¦¿ì„ ë‹¤ì‹œ 설치해주세요." +"'프로ì 트' 메뉴ì—ì„œ Android 빌드 í…œí”Œë¦¿ì„ ë‹¤ì‹œ 설치해주세요." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "안드로ì´ë“œ 프로ì 트 빌드 중 (gradle)" +msgstr "Android 프로ì 트 빌드 중 (gradle)" #: platform/android/export/export.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"안드로ì´ë“œ 프로ì íŠ¸ì˜ ë¹Œë“œì— ì‹¤íŒ¨í–ˆ, ì¶œë ¥í•œ 오류를 확ì¸í•˜ì„¸ìš”.\n" -"ë˜ëŠ” docs.godotengine.orgì—ì„œ 안드로ì´ë“œ 빌드 문서를 찾아 보세요." +"Android 프로ì íŠ¸ì˜ ë¹Œë“œì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤, ì¶œë ¥ëœ ì˜¤ë¥˜ë¥¼ 확ì¸í•˜ì„¸ìš”.\n" +"ë˜ëŠ” docs.godotengine.orgì—ì„œ Andoid 빌드 문서를 찾아보세요." #: platform/android/export/export.cpp msgid "Moving output" -msgstr "" +msgstr "ì¶œë ¥ ì´ë™ 중" #: platform/android/export/export.cpp msgid "" "Unable to copy and rename export file, check gradle project directory for " "outputs." msgstr "" +"내보내기 파ì¼ì„ ë³µì‚¬í•˜ê³ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다, ì¶œë ¥ì— ëŒ€í•œ gradle 프로ì " +"트 ë””ë ‰í„°ë¦¬ë¥¼ 확ì¸í•˜ì„¸ìš”." #: platform/iphone/export/export.cpp msgid "Identifier is missing." @@ -12378,6 +12372,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "빈 CollisionPolygon2D는 충ëŒì— ì˜í–¥ì„ 주지 않습니다." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12414,23 +12416,23 @@ msgstr "" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" -msgstr "" +msgstr "노드 A와 노드 B는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Node A must be a PhysicsBody2D" -msgstr "" +msgstr "노드 A는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Node B must be a PhysicsBody2D" -msgstr "" +msgstr "노드 B는 PhysicsBody2D여야 합니다" #: scene/2d/joints_2d.cpp msgid "Joint is not connected to two PhysicsBody2Ds" -msgstr "" +msgstr "ê´€ì ˆì´ PhysicsBody2D ë‘ ê³³ê³¼ ì—°ê²°ë˜ì–´ 있지 않습니다" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be different PhysicsBody2Ds" -msgstr "" +msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody2D여야 합니다" #: scene/2d/light_2d.cpp msgid "" @@ -12579,27 +12581,23 @@ msgstr "ARVROriginì€ ìžì‹ìœ¼ë¡œ ARVRCamera 노드가 필요합니다." #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" -msgstr "" +msgstr "메시 ë° ì¡°ëª… 찾는 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing geometry (%d/%d)" -msgstr "형태 ë¶„ì„ ì¤‘..." +msgstr "형태 준비 중 (%d/%d)" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Preparing environment" -msgstr "환경 보기" +msgstr "환경 준비 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generating capture" -msgstr "ë¼ì´íŠ¸ë§µ ìƒì„± 중" +msgstr "캡처 ìƒì„± 중" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Saving lightmaps" -msgstr "ë¼ì´íŠ¸ë§µ ìƒì„± 중" +msgstr "ë¼ì´íŠ¸ë§µ ì €ìž¥ 중" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -12690,11 +12688,6 @@ msgstr "" "GIProbe는 GLES2 비디오 ë“œë¼ì´ë²„ì—ì„œ 지ì›í•˜ì§€ 않습니다.\n" "ëŒ€ì‹ BakedLightmapì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera는 ë” ì´ìƒ 사용ë˜ì§€ 않으며 Godot 4.0ì—ì„œ ì œê±°ë©ë‹ˆë‹¤." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLightì˜ ê°ë„를 90ë„ ì´ìƒìœ¼ë¡œ 잡게ë˜ë©´ 그림ìžë¥¼ 투ì˜í• 수 없습니다." @@ -12759,23 +12752,23 @@ msgstr "" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" -msgstr "" +msgstr "노드 A와 노드 B는 PhysicsBody여야 합니다" #: scene/3d/physics_joint.cpp msgid "Node A must be a PhysicsBody" -msgstr "" +msgstr "노드 A는 PhysicsBody여야 합니다" #: scene/3d/physics_joint.cpp msgid "Node B must be a PhysicsBody" -msgstr "" +msgstr "노드 B는 PhysicsBodies여야 합니다" #: scene/3d/physics_joint.cpp msgid "Joint is not connected to any PhysicsBodies" -msgstr "" +msgstr "ê´€ì ˆì´ ì–´ë– í•œ PhysicsBodyì—ë„ ì—°ê²°ë˜ì–´ 있지 않습니다" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be different PhysicsBodies" -msgstr "" +msgstr "노드 A와 노드 B는 서로 다른 PhysicsBody여야 합니다" #: scene/3d/remote_transform.cpp msgid "" @@ -12940,9 +12933,8 @@ msgid "Must use a valid extension." msgstr "올바른 확장ìžë¥¼ 사용해야 합니다." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Enable grid minimap." -msgstr "스냅 켜기" +msgstr "그리드 ë¯¸ë‹ˆë§µì„ í™œì„±í™”í•©ë‹ˆë‹¤." #: scene/gui/popup.cpp msgid "" @@ -13000,6 +12992,8 @@ msgid "" "The sampler port is connected but not used. Consider changing the source to " "'SamplerPort'." msgstr "" +"샘플러 í¬íŠ¸ê°€ ì—°ê²°ë˜ì–´ 있지만 사용ë˜ì§€ 않습ì´ë‹¤. 소스를 'SamplerPort'ë¡œ 변경" +"하는 ê²ƒì„ ê³ ë ¤í•´ì£¼ì„¸ìš”." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." @@ -13029,6 +13023,11 @@ msgstr "Varyingì€ ê¼ì§“ì 함수ì—만 ì§€ì •í• ìˆ˜ 있습니다." msgid "Constants cannot be modified." msgstr "ìƒìˆ˜ëŠ” ìˆ˜ì •í• ìˆ˜ 없습니다." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera는 ë” ì´ìƒ 사용ë˜ì§€ 않으며 Godot 4.0ì—ì„œ ì œê±°ë©ë‹ˆë‹¤." + #~ msgid "No" #~ msgstr "아니오" @@ -14815,9 +14814,6 @@ msgstr "ìƒìˆ˜ëŠ” ìˆ˜ì •í• ìˆ˜ 없습니다." #~ msgid "Use Default Light" #~ msgstr "기본 Light 사용" -#~ msgid "Use Default sRGB" -#~ msgstr "기본 sRGB 사용" - #~ msgid "Default Light Normal:" #~ msgstr "기본 ë¼ì´íŠ¸ ë…¸ë§:" diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 313d6144e3..585e4d4447 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -1854,8 +1854,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3986,6 +3986,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Pasirinkite Nodus, kuriuos norite importuoti" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importuoti Animacijas..." + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5080,7 +5094,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorija:" @@ -10257,6 +10270,10 @@ msgstr "" msgid "Plugins" msgstr "Priedai" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12263,6 +12280,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12518,11 +12543,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 8f70ed94f7..5512d59238 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -1841,8 +1841,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3923,6 +3923,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "IzvÄ“lÄ“ties Å ablona Failu" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "IelÄdÄ“t NoklusÄ“jumu" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d FailÄ" @@ -4974,7 +4988,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10082,6 +10095,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "IelÄdÄ“t NoklusÄ“jumu" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12065,6 +12083,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12320,11 +12346,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 301383d787..260543a475 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -1788,8 +1788,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3865,6 +3865,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4916,7 +4928,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9944,6 +9955,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11893,6 +11908,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12148,11 +12171,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index 1b01a6f792..cd72ecd259 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3872,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4923,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9951,6 +9962,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11900,6 +11915,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12155,11 +12178,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 71693f68dd..fb9de4a419 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -1798,8 +1798,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3877,6 +3877,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4931,7 +4943,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9961,6 +9972,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11911,6 +11926,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12166,11 +12189,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index a07cd2a007..cf3a24a739 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3872,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4923,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9952,6 +9963,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11901,6 +11916,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12156,11 +12179,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 9019b6b0e4..c0a7f7cea2 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -1865,8 +1865,8 @@ msgid "Open a File or Directory" msgstr "Buka Fail atau Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Simpan" @@ -4192,6 +4192,21 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Pilih Nod(Nod-nod) untuk Diimport" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Muatkan Lalai" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -5248,7 +5263,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10302,6 +10316,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Muatkan Lalai" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12263,6 +12282,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12518,11 +12545,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 1289275b3d..9e69510739 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -3,24 +3,25 @@ # Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. # Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019, 2020, 2021. -# Anonymous <GentleSaucepan@protonmail.com>, 2017. +# Anonymous <GentleSaucepan@protonmail.com>, 2017, 2021. # Elias <eliasnykrem@gmail.com>, 2018. # flesk <eivindkn@gmail.com>, 2017, 2019. -# Frank T. Rambol <frank@d-fect.com>, 2018. +# Frank T. Rambol <frank@d-fect.com>, 2018, 2021. # Jørgen Aarmo Lund <jorgen.aarmo@gmail.com>, 2016, 2019. -# NicolaiF <nico-fre@hotmail.com>, 2017-2018, 2019. +# NicolaiF <nico-fre@hotmail.com>, 2017-2018, 2019, 2021. # Norwegian Disaster <stian.furu.overbye@gmail.com>, 2017. # passeride <lukas@passeride.com>, 2017. # Byzantin <kasper-hoel@hotmail.com>, 2018. # Hans-Marius ØverÃ¥s <hansmariusoveras@gmail.com>, 2019. # Revolution <revosw@gmail.com>, 2019. # Petter Reinholdtsen <pere-weblate@hungry.com>, 2019, 2020. +# Patrick Sletvold <patricksletvold@hotmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-01-12 13:32+0000\n" -"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" +"Last-Translator: Anonymous <GentleSaucepan@protonmail.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -28,7 +29,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.4.1-dev\n" +"X-Generator: Weblate 4.5\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -200,7 +201,6 @@ msgid "Change Animation Loop" msgstr "Endre Animasjonssløyfe" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Property Track" msgstr "Egenskapsspor" @@ -209,24 +209,20 @@ msgid "3D Transform Track" msgstr "3D transformasjonsspor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Call Method Track" msgstr "Kall metode-spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Bezier Curve Track" -msgstr "Bezier-kurvespor" +msgstr "Bézier-kurvespor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Audio Playback Track" msgstr "Lydavspillingsspor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Playback Track" -msgstr "Stopp avspilling av animasjon. (S)" +msgstr "Animasjonavspillingspor" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -241,7 +237,6 @@ msgid "Add Track" msgstr "Legg til Spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" msgstr "Animasjonsløkke" @@ -260,23 +255,20 @@ msgid "Anim Clips:" msgstr "Anim-klipp:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Track Path" -msgstr "Endre Array-verdi" +msgstr "Endre sporsti" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Toggle this track on/off." -msgstr "Vis/skjul distraksjonsfri modus." +msgstr "SlÃ¥ spor pÃ¥/av." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" msgstr "Oppdateringsmodus (Hvordan denne egenskapen settes)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "Animasjonsnode" +msgstr "Interpolasjonsmodus" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" @@ -334,7 +326,7 @@ msgstr "Pakk Inn Sløyfeinterp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Sett inn Nøkkel" +msgstr "Sett inn nøkkel" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" @@ -345,19 +337,16 @@ msgid "Delete Key(s)" msgstr "Fjern Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Update Mode" -msgstr "Endre Animasjonsnavn:" +msgstr "Endre oppdateringsmetode for animasjon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Interpolation Mode" -msgstr "Animasjonsnode" +msgstr "Endre interpolasjonsmodus for animasjon" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Loop Mode" -msgstr "Endre Anim-Løkke" +msgstr "Endre løkkemodus for animasjon" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -412,9 +401,8 @@ msgid "Rearrange Tracks" msgstr "Omorganiser Spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "Transformasjonsspor kan kun brukes pÃ¥ Spatial-baserte noder." +msgstr "Transformeringsspor virker kun pÃ¥ Spatial-baserte noder." #: editor/animation_track_editor.cpp msgid "" @@ -438,47 +426,40 @@ msgstr "" "En animansjonsavspiller kan ikke animere seg selv, kun andre avspillere." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Not possible to add a new track without a root" msgstr "Ikke mulig Ã¥ legge til et nytt spor uten en rot" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "Ugyldig spor for Bézier (ingen passende underegenskaper)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Bezier Track" -msgstr "Anim Legg til Spor" +msgstr "Legg til Bézier-spor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Track path is invalid, so can't add a key." msgstr "Sporsti er ugyldig, sÃ¥ kan ikke legge til en nøkkel." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Track is not of type Spatial, can't insert key" -msgstr "Spor er ikke av type Spatial, kan ikke legge til nøkkel" +msgstr "Spor er ikke av typen Spatial, kan ikke sette inn nøkkel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "3D transformasjonsspor" +msgstr "Legg til transformasjons-spornøkkel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "Anim Legg til Spor" +msgstr "Legg til spornøkkel" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." msgstr "Sporsti er ugyldig, sÃ¥ kan ikke legge til en metodenøkkel." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "Kall metode-spor" +msgstr "Legg til metode-spornøkkel" #: editor/animation_track_editor.cpp msgid "Method not found in object: " @@ -489,26 +470,22 @@ msgid "Anim Move Keys" msgstr "Anim Flytt Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Clipboard is empty" -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Utklippstavlen er tom" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" -msgstr "Lim inn Parametre" +msgstr "Sett in spor" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" msgstr "Anim Skalér Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "" "This option does not work for Bezier editing, as it's only a single track." msgstr "" -"Dette valget virker ikke pÃ¥ Bezier-redigering, siden det kun er ett enkelt " -"spor." +"Dette valget virker ikke pÃ¥ Bézier-redigering, da det kun er ett enkelt spor." #: editor/animation_track_editor.cpp msgid "" @@ -522,10 +499,19 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Denne animasjonen hører til en importert scene, sÃ¥ endringer pÃ¥ importerte " +"spor vil ikke bli lagret.\n" +"\n" +"For Ã¥ legge til egendefinerte spor, gÃ¥ til scenens importinstillinger og " +"sett\n" +"\"Animasjon > Lagring\" til \"Filer\", aktiver \"Animasjon > Behold egne spor" +"\", og importer pÃ¥ nytt.\n" +"Alternativt, bruk et importoppsett som importerer animasjonen som separate " +"filer." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "Advarsel: Redigerer importert animasjon" #: editor/animation_track_editor.cpp #, fuzzy @@ -570,9 +556,8 @@ msgid "Edit" msgstr "Rediger" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "Animasjon" +msgstr "Animasjon egenskaper." #: editor/animation_track_editor.cpp #, fuzzy @@ -589,26 +574,23 @@ msgstr "Skaler Fra Peker" #: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "Dupliser Utvalg" +msgstr "Dupliser utvalg" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "Dupliser Transponert" +msgstr "Dupliser transponert" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "Slett Valgte" +msgstr "Slett valgte" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "GÃ¥ til Neste Steg" +msgstr "GÃ¥ til neste steg" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "GÃ¥ til Forrige Steg" +msgstr "GÃ¥ til forrige steg" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -671,9 +653,8 @@ msgid "Scale Ratio:" msgstr "Skaler Størrelsesforhold:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "Velg spor Ã¥ kopiere:" +msgstr "Velg spor Ã¥ kopiere" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -690,9 +671,8 @@ msgid "Select All/None" msgstr "Kutt Noder" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "Lydklipp:" +msgstr "Legg til lyd-spor klipp" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" @@ -723,19 +703,16 @@ msgid "Line Number:" msgstr "Linjenummer:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "Erstatt..." +msgstr "%d erstattet." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d match." -msgstr "%d samsvar." +msgstr "%d samsvarer." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "Ingen Treff" +msgstr "%d sammsvarer." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -760,7 +737,7 @@ msgstr "Kun Valgte" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "Standard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" @@ -791,9 +768,8 @@ msgid "Line and column numbers." msgstr "Linje- og kolonnenummer." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "Metode i mÃ¥l-Node mÃ¥ spesifiseres!" +msgstr "Metode i mÃ¥lnoden mÃ¥ spesifiseres." #: editor/connections_dialog.cpp #, fuzzy @@ -820,13 +796,12 @@ msgid "Connect to Script:" msgstr "Kan ikke koble til tjener:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Signaler:" +msgstr "Fra signal:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "Scenen inneholder ikke noen skript." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -854,14 +829,12 @@ msgid "Extra Call Arguments:" msgstr "Ekstra Call Argumenter:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "Lim inn Noder" +msgstr "Mottakermetode:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Snapping innstillinger" +msgstr "Avansert" #: editor/connections_dialog.cpp msgid "Deferred" @@ -1064,9 +1037,8 @@ msgid "Fix Broken" msgstr "Reparer Ødelagt" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependency Editor" -msgstr "Avhengighetsredigeringsverktøy" +msgstr "Redigeringsverktøy for avhengigheter" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" @@ -1087,14 +1059,15 @@ msgid "Owners Of:" msgstr "Eiere Av:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Remove selected files from the project? (no undo)\n" "You can find the removed files in the system trash to restore them." -msgstr "Fjerne valgte filer fra prosjektet? (kan ikke angres)" +msgstr "" +"Fjerne valgte filer fra prosjektet? (kan ikke angres)\n" +"Du kan finne de fjernede filene i systemets papirkurv, og gjenopprette dem " +"derfra." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "The files being removed are required by other resources in order for them to " "work.\n" @@ -1102,7 +1075,9 @@ msgid "" "You can find the removed files in the system trash to restore them." msgstr "" "Filene som fjernes kreves for at andre ressurser skal virke.\n" -"Fjern dem likevel? (kan ikke angres)" +"Fjerne dem likevel? (kan ikke angres)\n" +"Du kan finne de fjernede filene i systemets papirkurv, og gjenopprette dem " +"derfra." #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1163,14 +1138,12 @@ msgid "Resources Without Explicit Ownership:" msgstr "Ressurser uten eksplisitt eierskap:" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Key" -msgstr "Endre Ordboksnøkkel" +msgstr "Endre listenøkkel" #: editor/dictionary_property_edit.cpp -#, fuzzy msgid "Change Dictionary Value" -msgstr "Endre Ordboksverdi" +msgstr "Endre listeverdi" #: editor/editor_about.cpp msgid "Thanks from the Godot community!" @@ -1444,7 +1417,6 @@ msgid "There is no '%s' file." msgstr "Det finnes ingen «%s»-fil" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Layout" msgstr "Layout" @@ -1453,9 +1425,8 @@ msgid "Invalid file, not an audio bus layout." msgstr "Ugyldig fil, ikke et audio bus oppsett." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av filen: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" @@ -1643,7 +1614,6 @@ msgid "Storing File:" msgstr "Lagrer Fil:" #: editor/editor_export.cpp -#, fuzzy msgid "No export template found at the expected path:" msgstr "Ingen eksportmal funnet pÃ¥ forventet søkesti:" @@ -1770,7 +1740,7 @@ msgstr "Erstatt Alle" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profil mÃ¥ være et gyldig filnavn, og kan ikke inneholde '.'" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1797,9 +1767,8 @@ msgid "Class Options:" msgstr "Beskrivelse:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "Ã…pne den neste Editoren" +msgstr "Aktiver kontekstavhengig redigeringsverktøy" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1817,7 +1786,7 @@ msgstr "Søk i klasser" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "Filformatet til '%s' er ugyldig, importen ble avbrutt." #: editor/editor_feature_profile.cpp msgid "" @@ -1826,9 +1795,8 @@ msgid "" msgstr "" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av profilen til stien: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" @@ -1961,8 +1929,8 @@ msgid "Open a File or Directory" msgstr "Ã…pne ei fil eller mappe" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Lagre" @@ -2252,9 +2220,8 @@ msgid "Set" msgstr "Sett" #: editor/editor_inspector.cpp -#, fuzzy msgid "Set Multiple:" -msgstr "Sett Mange:" +msgstr "Sett mange:" #: editor/editor_log.cpp msgid "Output:" @@ -2286,9 +2253,8 @@ msgstr "Stopp" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp -#, fuzzy msgid "Start" -msgstr "Start!" +msgstr "Start" #: editor/editor_network_profiler.cpp msgid "%s/s" @@ -2370,7 +2336,7 @@ msgstr "Kan ikke Ã¥pne '%s'. Filen kan ha blitt flyttet eller slettet." #: editor/editor_node.cpp msgid "Error while parsing '%s'." -msgstr "Error ved parsing av '%s'." +msgstr "Feil ved parsing av '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." @@ -2401,7 +2367,6 @@ msgid "This operation can't be done without a tree root." msgstr "Denne operasjonen kan ikke gjennomføres uten en trerot." #: editor/editor_node.cpp -#, fuzzy msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." @@ -2428,7 +2393,7 @@ msgstr "Kan ikke laste MeshLibrary for sammenslÃ¥ing!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "Error ved lagring av MeshLibrary!" +msgstr "Feil ved lagring av MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" @@ -2436,7 +2401,7 @@ msgstr "Kan ikke laste TileSet for sammenslÃ¥ing!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av TileSet!" #: editor/editor_node.cpp msgid "" @@ -2619,7 +2584,7 @@ msgstr "Ja" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "Avslutt editoren?" +msgstr "Avslutt redigeringsverktøyet?" #: editor/editor_node.cpp msgid "Open Project Manager?" @@ -2686,7 +2651,8 @@ msgstr "" msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" -"Kan ikke laste addon skript fra bane: Basistype '%s' er ikke en EditorPlugin." +"Kan ikke laste addon-skript fra stien: Basistypen '%s' er ikke en " +"EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." @@ -2924,7 +2890,7 @@ msgstr "Versjon:" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "Sett opp versjonskontroll" #: editor/editor_node.cpp msgid "Shut Down Version Control" @@ -2940,9 +2906,8 @@ msgid "Install Android Build Template..." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "Ã…pne ProsjektManager?" +msgstr "Ã…pne prosjektdatamappe" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" @@ -3029,17 +2994,16 @@ msgid "Synchronize Scene Changes" msgstr "Synkroniser Sceneendringer" #: editor/editor_node.cpp -#, fuzzy msgid "" "When this option is enabled, any changes made to the scene in the editor " "will be replicated in the running project.\n" "When used remotely on a device, this is more efficient when the network " "filesystem option is enabled." msgstr "" -"NÃ¥r denne innstillingen er aktivert, alle endringer gjort til scenen i " -"editoren vil bli replikert i det kjørende spillet.\n" -"NÃ¥r det brukes eksternt pÃ¥ en enhet, dette er mer effektivt med et " -"nettverksfilsystem." +"NÃ¥r denne innstillingen er aktivert, vil alle endringer gjort i scenen i " +"redigeringsverktøyet bli gjenspeilet i det kjørende spillet.\n" +"NÃ¥r det brukes eksternt pÃ¥ en enhet, er dette mer effektivt med et " +"nettverksfilsystem aktivert." #: editor/editor_node.cpp #, fuzzy @@ -3189,9 +3153,8 @@ msgid "Save & Restart" msgstr "Lagre & Avslutt" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window redraws." -msgstr "Snurrer nÃ¥r editorvinduet rendrer om!" +msgstr "Snurrer nÃ¥r redigeringsvinduet tegner opp pÃ¥ nytt." #: editor/editor_node.cpp #, fuzzy @@ -3279,11 +3242,12 @@ msgid "Open & Run a Script" msgstr "Ã…pne & Kjør et Skript" #: editor/editor_node.cpp -#, fuzzy msgid "" "The following files are newer on disk.\n" "What action should be taken?" -msgstr "De følgende filene feilet ekstrahering fra pakke:" +msgstr "" +"Følgende filer er nyere pÃ¥ disken.\n" +"Hvilken handling skal utføres?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3302,7 +3266,7 @@ msgstr "Ny Arvet" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "Last Errors" +msgstr "Last feil" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" @@ -3310,11 +3274,11 @@ msgstr "Velg" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "Ã…pne 2D Editor" +msgstr "Ã…pne 2D-redigeringsverktøy" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "Ã…pne 3D Editor" +msgstr "Ã…pne 3D-redigeringsverktøy" #: editor/editor_node.cpp msgid "Open Script Editor" @@ -3326,16 +3290,15 @@ msgstr "Ã…pne Assets-Bibliotek" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "Ã…pne den neste Editoren" +msgstr "Ã…pne det neste redigeringsverktøyet" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "Ã…pne den forrige Editoren" +msgstr "Ã…pne det forrige redigeringsverktøy" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "Advarsler" +msgstr "Advarsel!" #: editor/editor_path.cpp #, fuzzy @@ -3399,9 +3362,8 @@ msgid "Average Time (sec)" msgstr "Gjennomsnittstid (sek)" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame %" -msgstr "Frame %" +msgstr "Bilde %" #: editor/editor_profiler.cpp msgid "Physics Frame %" @@ -3416,9 +3378,8 @@ msgid "Self" msgstr "Selv" #: editor/editor_profiler.cpp -#, fuzzy msgid "Frame #:" -msgstr "Frame #:" +msgstr "Bilde #:" #: editor/editor_profiler.cpp #, fuzzy @@ -3595,7 +3556,7 @@ msgstr "" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "Velg Node(r) for Importering" +msgstr "Velg node(r) som skal importeres" #: editor/editor_sub_scene.cpp editor/project_manager.cpp #, fuzzy @@ -3645,9 +3606,8 @@ msgid "Retrieving mirrors, please wait..." msgstr "Henter fillager, vennligst vent..." #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove template version '%s'?" -msgstr "Fjern mal versjon '%s'?" +msgstr "Fjern malversjon '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -3663,9 +3623,8 @@ msgid "No version.txt found inside templates." msgstr "Ingen version.txt funnet i mal." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:" -msgstr "Feil ved laging av sti for mal:\n" +msgstr "Feil ved laging av sti for maler:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" @@ -3850,14 +3809,12 @@ msgid "Cannot move/rename resources root." msgstr "Kan ikke flytte/endre navn ressursrot" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Cannot move a folder into itself." -msgstr "Kan ikke flytte mappe inn i seg selv.\n" +msgstr "Kan ikke flytte en mappe inn i seg selv." #: editor/filesystem_dock.cpp -#, fuzzy msgid "Error moving:" -msgstr "Error ved flytting:\n" +msgstr "Feil ved flytting:" #: editor/filesystem_dock.cpp #, fuzzy @@ -3865,9 +3822,8 @@ msgid "Error duplicating:" msgstr "Feil ved innlasting:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Unable to update dependencies:" -msgstr "Kan ikke oppdatere av avhengigheter:\n" +msgstr "Kan ikke oppdatere avhengigheter:" #: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp msgid "No name provided." @@ -4133,9 +4089,8 @@ msgid "Remove from Group" msgstr "Fjern fra Gruppe" #: editor/groups_editor.cpp -#, fuzzy msgid "Group name already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Gruppenavnet finnes allerede." #: editor/groups_editor.cpp #, fuzzy @@ -4177,9 +4132,8 @@ msgid "Empty groups will be automatically removed." msgstr "" #: editor/groups_editor.cpp -#, fuzzy msgid "Group Editor" -msgstr "Ã…pne SkriptEditor" +msgstr "Redigeringsverktøy for grupper" #: editor/groups_editor.cpp #, fuzzy @@ -4237,7 +4191,7 @@ msgstr "Importerer Scene..." #: editor/import/resource_importer_scene.cpp msgid "Generating Lightmaps" -msgstr "Genererer Lyskart" +msgstr "Genererer lyskart" #: editor/import/resource_importer_scene.cpp msgid "Generating for Mesh: " @@ -4258,7 +4212,7 @@ msgstr "Ugyldig/ødelagt skript for post-import (sjekk konsoll):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" -msgstr "Error ved kjøring av post-import script:" +msgstr "Feil ved kjøring av post-import script:" #: editor/import/resource_importer_scene.cpp msgid "Did you return a Node-derived object in the `post_import()` method?" @@ -4268,6 +4222,21 @@ msgstr "" msgid "Saving..." msgstr "Lagrer..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Velg Modus" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importer" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Last Standard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -4334,9 +4303,8 @@ msgid "Copy Params" msgstr "Kopier Parametre" #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource Clipboard" -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Rediger ressurs-utklippstavlen" #: editor/inspector_dock.cpp msgid "Copy Resource" @@ -4447,16 +4415,14 @@ msgid "Create points." msgstr "Slett punkter" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" "RMB: Erase Point" msgstr "" -"Endre eksisterende polygon:\n" -"Venstreklikk: Flytt Punkt.\n" -"Ctrl+Venstreklikk: Splitt Segment.\n" -"Høyreklikk: Fjern Punkt." +"Rediger punkter.\n" +"Venstreklikk: Flytt punkt\n" +"Høyreklikk: Fjern punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -4471,7 +4437,7 @@ msgstr "Rediger Poly" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Insert Point" -msgstr "Sett inn Punkt" +msgstr "Sett inn punkt" #: editor/plugins/abstract_polygon_2d_editor.cpp #, fuzzy @@ -4588,9 +4554,8 @@ msgid "Open Animation Node" msgstr "Animasjonsnode" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Triangelet finnes allerede." #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4792,14 +4757,12 @@ msgid "Remove Animation" msgstr "Fjern Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Invalid animation name!" -msgstr "ERROR: Ugyldig animasjonsnavn!" +msgstr "Ugyldig animasjonsnavn!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Animation name already exists!" -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "Animasjonsnavnet finnes allerede!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4824,14 +4787,12 @@ msgid "Duplicate Animation" msgstr "Dupliser Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "ERROR: Ingen animasjon Ã¥ kopiere!" +msgstr "Ingen animasjon Ã¥ kopiere!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "ERROR: Ingen animasjonsressurs pÃ¥ utklippstavlen!" +msgstr "Ingen animasjonsressurs pÃ¥ utklippstavlen!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" @@ -4842,9 +4803,8 @@ msgid "Paste Animation" msgstr "Lim inn Animasjon" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "ERROR: Ingen animasjon Ã¥ endre!" +msgstr "Ingen animasjon Ã¥ redigere!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -4968,7 +4928,7 @@ msgstr "Animasjonsnavn:" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp msgid "Error!" -msgstr "Error!" +msgstr "Feil!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" @@ -4990,9 +4950,8 @@ msgid "Move Node" msgstr "Flytt Modus" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition exists!" -msgstr "Overgang" +msgstr "Overgang eksisterer!" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -5002,7 +4961,7 @@ msgstr "Overgang" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "" +msgstr "Legg til node" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" @@ -5313,6 +5272,7 @@ msgid "Failed SHA-256 hash check" msgstr "Feilet sha256 hash-sjekk" #: editor/plugins/asset_library_editor_plugin.cpp +#, fuzzy msgid "Asset Download Error:" msgstr "Asset Nedlasting Error:" @@ -5350,7 +5310,7 @@ msgstr "Prøv pÃ¥ nytt" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download Error" -msgstr "Nedlastningserror" +msgstr "Nedlastningsfeil" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5424,7 +5384,6 @@ msgid "Sort:" msgstr "Sorter:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -6026,7 +5985,7 @@ msgstr "Plasser Utvalg I Midten" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Bildeutvalg" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" @@ -6112,7 +6071,7 @@ msgstr "Lag Node" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "Error ved instansiering av scene fra %s" +msgstr "Feil ved instansiering av scene fra %s" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -6138,7 +6097,7 @@ msgstr "Rediger Poly" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "Rediger Poly (Fjern Punkt)" +msgstr "Rediger Poly (fjern punkt)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp #, fuzzy @@ -6498,11 +6457,12 @@ msgid "Remove item %d?" msgstr "Fjern element %d?" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "" "Update from existing scene?:\n" "%s" -msgstr "Oppdater fra Scene" +msgstr "" +"Oppdater fra eksisterende scene?:\n" +"%s" #: editor/plugins/mesh_library_editor_plugin.cpp #, fuzzy @@ -6915,9 +6875,8 @@ msgid "Paint Bone Weights" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Open Polygon 2D UV editor." -msgstr "Ã…pne 2D Editor" +msgstr "Ã…pne 2D-redigeringsverktøy for polygon-UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" @@ -7069,7 +7028,7 @@ msgstr "Skaler Polygon" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "ERROR: Kunne ikke laste ressurs!" +msgstr "FEIL: Kunne ikke laste ressurs!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" @@ -7132,16 +7091,12 @@ msgid "Clear Recent Files" msgstr "Fjern Nylige Filer" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Close and save changes?" -msgstr "" -"Lukk og lagre endringer?\n" -"\"" +msgstr "Lukke og lagre endringer?" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av TextFile:" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7149,29 +7104,24 @@ msgid "Could not load file at:" msgstr "Kunne ikke opprette mappe." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "Error ved lagring av TileSet!" +msgstr "Feil ved lagring av filen!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "Error ved lasting av tema" +msgstr "Feil ved lagring av tema" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "Error ved lagring" +msgstr "Feil ved lagring" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "Error ved importering av tema" +msgstr "Feil ved importering av tema." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "Error ved importering" +msgstr "Feil ved importering" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7211,11 +7161,11 @@ msgstr "Importer Tema" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "Error ved lasting av tema" +msgstr "Feil ved lagring av tema" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "Error ved lagring" +msgstr "Feil ved lagring" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." @@ -7741,9 +7691,8 @@ msgid "Yaw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Size" -msgstr "Størrelse: " +msgstr "Størrelse" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" @@ -8904,11 +8853,12 @@ msgid "Delete selected Rect." msgstr "Slett valgte filer?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Velg gjeldende redigerte underflis.\n" +"Klikk pÃ¥ en annen flis for Ã¥ redigere den." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8916,13 +8866,16 @@ msgid "Delete polygon." msgstr "Slett punkter" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "LMB: Set bit on.\n" "RMB: Set bit off.\n" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Venstreklikk: Sett bit pÃ¥.\n" +"Høyreklikk: Sett bit av.\n" +"Skift+venstreklikk: Sett jokertegn-bit.\n" +"Klikk pÃ¥ en annen flis for Ã¥ redigere den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8938,11 +8891,12 @@ msgid "" msgstr "" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." -msgstr "Velg Gjeldende Mappe" +msgstr "" +"Velg underflis for Ã¥ endre z-indeksen.\n" +"Klikk pÃ¥ en annen flis for Ã¥ redigere den." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" @@ -10143,9 +10097,8 @@ msgid "Export Project" msgstr "Eksporter Prosjekt" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "Eksporter Prosjekt" +msgstr "Eksportmodus?" #: editor/project_export.cpp #, fuzzy @@ -10235,8 +10188,8 @@ msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" -"Kunne ikke laste project.godot i prosjekt sti (error %d). Den kan være " -"manglet eller korruptert." +"Kunne ikke laste project.godot i prosjektstien (feil %d). Den kan mangle " +"eller være korrupt." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." @@ -10407,25 +10360,28 @@ msgid "Are you sure to run %d projects at once?" msgstr "Er du sikker pÃ¥ at du vil kjøre mer enn ett prosjekt?" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern %s prosjekter fra listen?\n" +"Innhold i prosjektmappene vil ikke pÃ¥virkes." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern dette prosjektet fra listen?\n" +"Innhold i prosjektmappen vil ikke pÃ¥virkes." #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." -msgstr "Fjern prosjekt fra listen? (Mappeinnhold vil ikke bli modifisert)" +msgstr "" +"Fjern alle manglende prosjekter fra listen?\n" +"Innhold i prosjektmappene vil ikke pÃ¥virkes." #: editor/project_manager.cpp msgid "" @@ -10525,9 +10481,8 @@ msgid "" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "ERROR: Animasjonsnavnet finnes allerede!" +msgstr "En handling med navnet '%s' finnes allerede." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" @@ -10828,10 +10783,14 @@ msgstr "" msgid "Plugins" msgstr "Innstikkmoduler" -#: editor/property_editor.cpp +#: editor/project_settings_editor.cpp #, fuzzy +msgid "Import Defaults" +msgstr "Last Standard" + +#: editor/property_editor.cpp msgid "Preset..." -msgstr "Preset..." +msgstr "ForhÃ¥ndsinnstilt..." #: editor/property_editor.cpp msgid "Zero" @@ -10892,9 +10851,8 @@ msgid "Batch Rename" msgstr "Endre navn" #: editor/rename_dialog.cpp -#, fuzzy msgid "Replace:" -msgstr "Erstatt: " +msgstr "Erstatt:" #: editor/rename_dialog.cpp msgid "Prefix:" @@ -10933,9 +10891,8 @@ msgid "Node type" msgstr "Finn Node Type" #: editor/rename_dialog.cpp -#, fuzzy msgid "Current scene name" -msgstr "Gjeldende scene er ikke lagret. Ã…pne likevel?" +msgstr "Navn pÃ¥ gjeldende scene" #: editor/rename_dialog.cpp #, fuzzy @@ -11134,14 +11091,12 @@ msgid "Make node as Root" msgstr "Lagre Scene" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes and any children?" -msgstr "Kutt Noder" +msgstr "Slett %d noder og eventuelle barn?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "Kutt Noder" +msgstr "Slett %d noder?" #: editor/scene_tree_dock.cpp msgid "Delete the root node \"%s\"?" @@ -11152,9 +11107,8 @@ msgid "Delete node \"%s\" and its children?" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "Kutt Noder" +msgstr "Slett noden \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." @@ -11446,19 +11400,16 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Stien er tom." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "Ressurs-utklippstavle er tom!" +msgstr "Filnavnet er tomt." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is not local." -msgstr "Sti leder ikke Node!" +msgstr "Stien er ikke lokal." #: editor/script_create_dialog.cpp #, fuzzy @@ -11505,9 +11456,8 @@ msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "Ã…pne SkriptEditor" +msgstr "Ã…pne skript / Velg plassering" #: editor/script_create_dialog.cpp #, fuzzy @@ -11602,19 +11552,16 @@ msgid "Warning:" msgstr "Advarsler:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Error:" -msgstr "Error!" +msgstr "Feil:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error" -msgstr "Last Errors" +msgstr "C++-feil" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error:" -msgstr "Last Errors" +msgstr "C++-feil:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11645,9 +11592,8 @@ msgid "Child process connected." msgstr "Frakoblet" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Copy Error" -msgstr "Last Errors" +msgstr "Kopier feil" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -11912,7 +11858,7 @@ msgstr "" #: modules/gdscript/gdscript_functions.cpp msgid "Not a script with an instance" -msgstr "" +msgstr "Ikke et skript med en instans" #: modules/gdscript/gdscript_functions.cpp msgid "Not based on a script" @@ -12278,25 +12224,24 @@ msgid "Name is not a valid identifier:" msgstr "Navn er ikke en gyldig identifikator:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Name already in use by another func/var/signal:" -msgstr "Navn er allerede i bruk av en annen func/var/signal:" +msgstr "Navnet er allerede i bruk av annen funk/var/signal:" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Function" -msgstr "" +msgstr "Endre navn pÃ¥ funksjonen" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Variable" -msgstr "" +msgstr "Endre navn pÃ¥ variabelen" #: modules/visual_script/visual_script_editor.cpp msgid "Rename Signal" -msgstr "" +msgstr "Endre navn pÃ¥ signalet" #: modules/visual_script/visual_script_editor.cpp msgid "Add Function" -msgstr "" +msgstr "Legg til funksjon" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12305,11 +12250,11 @@ msgstr "Fjern punkt" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" -msgstr "" +msgstr "Legg til variabel" #: modules/visual_script/visual_script_editor.cpp msgid "Add Signal" -msgstr "" +msgstr "Legg til signal" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12323,7 +12268,7 @@ msgstr "Fjern punkt" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" -msgstr "" +msgstr "Endre uttrykk" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Nodes" @@ -12343,6 +12288,8 @@ msgstr "" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" +"Hold Ctrl for Ã¥ slippe en Getter. Hold Skift for Ã¥ slippe en generisk " +"signatur." #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12351,7 +12298,7 @@ msgstr "Hold Meta for Ã¥ slippe en enkel referanse til noden." #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." -msgstr "Hold Ctrl for Ã¥ slippe en simpel referanse til noden." +msgstr "Hold Ctrl for Ã¥ slippe en enkel referanse til noden." #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12471,19 +12418,19 @@ msgstr "Fjern Funksjon" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Variable" -msgstr "" +msgstr "Fjern variabel" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Variable:" -msgstr "" +msgstr "Redigerer variabel:" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Signal" -msgstr "" +msgstr "Fjern signal" #: modules/visual_script/visual_script_editor.cpp msgid "Editing Signal:" -msgstr "" +msgstr "Redigerer signal:" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12577,7 +12524,7 @@ msgstr "Sti leder ikke Node!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." -msgstr "Ugyldig indeks egenskap navn '%s' i node %s." +msgstr "Ugyldig navn for indeksegenskap '%s' i noden %s." #: modules/visual_script/visual_script_nodes.cpp msgid ": Invalid argument of type: " @@ -12927,6 +12874,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13115,9 +13070,8 @@ msgid "Saving lightmaps" msgstr "Genererer Lyskart" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Done" -msgstr "Ferdig!" +msgstr "Ferdig" #: scene/3d/collision_object.cpp msgid "" @@ -13185,11 +13139,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" @@ -13319,9 +13268,8 @@ msgid "In node '%s', invalid animation: '%s'." msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "ERROR: Ugyldig animasjonsnavn!" +msgstr "Ugyldig animasjon: '%s'." #: scene/animation/animation_tree.cpp #, fuzzy diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 1202219ee6..52c63ffa85 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -1899,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "Bestand of map openen" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Opslaan" @@ -4113,6 +4113,21 @@ msgstr "" msgid "Saving..." msgstr "Opslaan..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selecteermodus" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importeren" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Laad standaard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Bestanden" @@ -5185,7 +5200,6 @@ msgid "Sort:" msgstr "Sorteren op:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categorie:" @@ -10471,6 +10485,11 @@ msgstr "Automatisch Laden" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Laad standaard" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Voorinstelling..." @@ -12523,6 +12542,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Lege CollisionPolygon2D hebben geen botsingsfunctie." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12840,11 +12867,6 @@ msgstr "" "GIProbes worden niet ondersteund door het GLES2 grafische stuurprogramma.\n" "Gebruik in plaats daarvan een BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/or.po b/editor/translations/or.po index 269276221d..19b87260d6 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -1794,8 +1794,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3871,6 +3871,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4922,7 +4934,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9950,6 +9961,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11899,6 +11914,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12154,11 +12177,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 3cf039dd3b..173e86753f 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -51,7 +51,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" "Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" @@ -1891,8 +1891,8 @@ msgid "Open a File or Directory" msgstr "Otwórz plik lub katalog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Zapisz" @@ -2563,9 +2563,8 @@ msgstr "" "Nie można wÅ‚Ä…czyć dodatku: \"%s\" - parsowanie konfiguracji nie powiodÅ‚o siÄ™." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "Nie można odnaleźć pola skryptu w dodatku: \"res://addons/%s\"." +msgstr "Nie można odnaleźć pola skryptu w dodatku: \"%s\"." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4092,6 +4091,21 @@ msgstr "Czy zwracasz obiekt dziedziczÄ…cy po Node w metodzie `post_import()`?" msgid "Saving..." msgstr "Zapisywanie..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Tryb zaznaczenia" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importuj" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Użyj domyÅ›lnie sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d plików" @@ -5060,9 +5074,8 @@ msgid "Got:" msgstr "Otrzymano:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Nie udaÅ‚o się przeprowadzić testu integralnoÅ›ci sha256" +msgstr "Test SHA-256 nieudany" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5165,7 +5178,6 @@ msgid "Sort:" msgstr "Sortuj:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategoria:" @@ -8551,7 +8563,7 @@ msgstr "Edytuj wielokÄ…t nawigacji" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Paste Tile Bitmask" -msgstr "Wklej maskÄ™ bitowÄ… Kafelka" +msgstr "Wklej maskÄ™ bitowÄ… kafelka" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" @@ -10435,6 +10447,11 @@ msgstr "AutoÅ‚adowanie" msgid "Plugins" msgstr "Wtyczki" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Wczytaj domyÅ›lny" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Ustawienie predefiniowane..." @@ -10684,14 +10701,12 @@ msgid "Instance Child Scene" msgstr "Dodaj instancjÄ™ sceny" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Nie można operować wÄ™zÅ‚ami z innej sceny!" +msgstr "Nie można wkleić korzenia do tej samej sceny." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Wklej wÄ™zÅ‚y" +msgstr "Wklej wÄ™zeÅ‚/y" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10820,9 +10835,8 @@ msgid "Attach Script" msgstr "DoÅ‚Ä…cz skrypt" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Wytnij wÄ™zÅ‚y" +msgstr "Wytnij wÄ™zeÅ‚/y" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -12486,6 +12500,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Pusty CollisionPolygon2D nie ma wpÅ‚ywu na kolizje." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12807,12 +12829,6 @@ msgstr "" "GIProbes nie sÄ… obsÅ‚ugiwane przez sterownik wideo GLES2.\n" "Zamiast tego użyj BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"WÄ™zeÅ‚ InterpolatedCamera jest przestarzaÅ‚y i bÄ™dzie usuniÄ™ty w Godocie 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight z kÄ…tem szerszym niż 90 stopni nie może rzucać cieni." @@ -13152,6 +13168,12 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchoÅ‚ków." msgid "Constants cannot be modified." msgstr "StaÅ‚e nie mogÄ… być modyfikowane." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "WÄ™zeÅ‚ InterpolatedCamera jest przestarzaÅ‚y i bÄ™dzie usuniÄ™ty w Godocie " +#~ "4.0." + #~ msgid "No" #~ msgstr "Nie" @@ -14772,9 +14794,6 @@ msgstr "StaÅ‚e nie mogÄ… być modyfikowane." #~ msgid "Use Default Light" #~ msgstr "Użyj domyÅ›lnego Å›wiatÅ‚a" -#~ msgid "Use Default sRGB" -#~ msgstr "Użyj domyÅ›lnie sRGB" - #~ msgid "Ambient Light Color:" #~ msgstr "Kolor Å›wiatÅ‚a otoczenia:" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index ca53ec3af2..09d967e01d 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -1862,8 +1862,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -4004,6 +4004,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Slit th' Node" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5091,7 +5104,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10291,6 +10303,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12346,6 +12362,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12601,11 +12625,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 939735e8da..28325d59bc 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -1867,8 +1867,8 @@ msgid "Open a File or Directory" msgstr "Abrir um Ficheiro ou Diretoria" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Guardar" @@ -4076,6 +4076,21 @@ msgstr "Devolveu um objeto derivado de Nó no método `post_import()`?" msgid "Saving..." msgstr "A guardar..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modo Seleção" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Carregar Predefinição" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Ficheiros" @@ -5147,7 +5162,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -10404,6 +10418,11 @@ msgstr "Carregamento automático" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carregar Predefinição" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Predefinição..." @@ -12459,6 +12478,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Um CollisionPolygon2D vazio não tem efeito na colisão." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12772,11 +12799,6 @@ msgstr "" "Sondas GI não são suportadas pelo driver vÃdeo GLES2.\n" "Em vez disso, use um BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamerda foi descontinuada e será removida no Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras." @@ -13117,6 +13139,10 @@ msgstr "Variações só podem ser atribuÃdas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamerda foi descontinuada e será removida no Godot 4.0." + #~ msgid "No" #~ msgstr "Não" diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index f4535819c2..4270648266 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -1959,8 +1959,8 @@ msgid "Open a File or Directory" msgstr "Abrir Arquivo ou Diretório" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Salvar" @@ -4173,6 +4173,21 @@ msgstr "Você retornou um objeto derivado de Nó no método `post_import()`?" msgid "Saving..." msgstr "Salvando..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Modo de Seleção" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Usar sRGB Padrão" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Arquivos" @@ -5250,7 +5265,6 @@ msgid "Sort:" msgstr "Ordenar:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categoria:" @@ -10519,6 +10533,11 @@ msgstr "O AutoLoad" msgid "Plugins" msgstr "Plugins" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Carregar Padrão" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Predefinição..." @@ -12576,6 +12595,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Um nó CollisionPolygon2D vazio não é efetivo para colisão." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12895,11 +12922,6 @@ msgstr "" "GIProbes não são suportados pelo driver de vÃdeo GLES2.\n" "Use um BakedLightmap em vez disso." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "IntepolatedCamera foi depreciada e será removida no Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "Um SpotLight com um ângulo maior que 90 graus não pode criar sombras." @@ -13243,6 +13265,10 @@ msgstr "Variáveis só podem ser atribuÃdas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "IntepolatedCamera foi depreciada e será removida no Godot 4.0." + #~ msgid "No" #~ msgstr "Não" @@ -14902,9 +14928,6 @@ msgstr "Constantes não podem serem modificadas." #~ msgid "Use Default Light" #~ msgstr "Usar Luz Padrão" -#~ msgid "Use Default sRGB" -#~ msgstr "Usar sRGB Padrão" - #~ msgid "Default Light Normal:" #~ msgstr "Luz Normal Padrão:" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index 1843f25bf0..33f5264d71 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -1874,8 +1874,8 @@ msgid "Open a File or Directory" msgstr "DeschideÈ›i un FiÅŸier sau Director" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "SalvaÈ›i" @@ -4056,6 +4056,21 @@ msgstr "" msgid "Saving..." msgstr "Se Salvează..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Selectare mod" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importare" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "ÃŽncărcaÈ›i Implicit" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d FiÈ™iere" @@ -5153,7 +5168,6 @@ msgid "Sort:" msgstr "Sorare:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Categorie:" @@ -10451,6 +10465,11 @@ msgstr "" msgid "Plugins" msgstr "Plugin-uri" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "ÃŽncărcaÈ›i Implicit" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Presetare..." @@ -12477,6 +12496,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12737,11 +12764,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index a38646e2e8..eec73e585a 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -96,7 +96,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" "Last-Translator: Danil Alexeev <danil@alexeev.xyz>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" @@ -1939,8 +1939,8 @@ msgid "Open a File or Directory" msgstr "Открыть каталог или файл" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Сохранить" @@ -2615,9 +2615,8 @@ msgstr "" "конфигурации." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "Ðе удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ поле script Ð´Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°: «res://addons/%s»." +msgstr "Ðе удаётÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ поле script Ð´Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°: «%s»." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4144,6 +4143,21 @@ msgstr "Ð’Ñ‹ вернули производный от Node объект в мРmsgid "Saving..." msgstr "Сохранение..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Режим выделениÑ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Импорт" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "ИÑпользовать sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлов" @@ -5100,7 +5114,7 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." -msgstr "ÐеÑовпадение Ñ…Ñша загрузки, возможно файл был изменён." +msgstr "ÐеÑовпадение хеша загрузки, возможно файл был изменён." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Expected:" @@ -5111,9 +5125,8 @@ msgid "Got:" msgstr "Получено:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Ðе удалоÑÑŒ проверить sha256 Ñ…Ñш" +msgstr "Ðе удалоÑÑŒ проверить хеш SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5216,7 +5229,6 @@ msgid "Sort:" msgstr "Сортировка:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "КатегориÑ:" @@ -10479,6 +10491,11 @@ msgstr "Ðвтозагрузка" msgid "Plugins" msgstr "Плагины" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Загрузить по умолчанию" + #: editor/property_editor.cpp msgid "Preset..." msgstr "ПредуÑтановка..." @@ -10730,14 +10747,12 @@ msgid "Instance Child Scene" msgstr "Добавить дочернюю Ñцену" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Ðе могу работать Ñ ÑƒÐ·Ð»Ð°Ð¼Ð¸ из внешней Ñцены!" +msgstr "Ðевозможно вÑтавить корневой узел в ту же Ñцену." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" -msgstr "Ð’Ñтавить узлы" +msgstr "Ð’Ñтавить узел(узлы)" #: editor/scene_tree_dock.cpp msgid "Detach Script" @@ -10867,9 +10882,8 @@ msgid "Attach Script" msgstr "Прикрепить Ñкрипт" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" -msgstr "Вырезать узлы" +msgstr "Вырезать узел(узлы)" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -12526,6 +12540,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "ПуÑтой CollisionPolygon2D не влиÑет на ÑтолкновениÑ." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12848,11 +12870,6 @@ msgstr "" "GIProbes не поддерживаютÑÑ Ð²Ð¸Ð´ÐµÐ¾Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð¾Ð¼ GLES2.\n" "ВмеÑто Ñтого иÑпользуйте BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera уÑтарела и будет удалена в Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight Ñ ÑƒÐ³Ð»Ð¾Ð¼ более 90 градуÑов не может отбраÑывать тени." @@ -13193,6 +13210,10 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð msgid "Constants cannot be modified." msgstr "КонÑтанты не могут быть изменены." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera уÑтарела и будет удалена в Godot 4.0." + #~ msgid "No" #~ msgstr "Ðет" @@ -14856,9 +14877,6 @@ msgstr "КонÑтанты не могут быть изменены." #~ msgid "Use Default Light" #~ msgstr "ИÑпользовать Ñтандартный Ñвет" -#~ msgid "Use Default sRGB" -#~ msgstr "ИÑпользовать sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "Образец Ñтандартного оÑвещениÑ:" diff --git a/editor/translations/si.po b/editor/translations/si.po index 062cf64646..0c3a01f0e4 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -1818,8 +1818,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3900,6 +3900,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4962,7 +4974,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10029,6 +10040,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11997,6 +12012,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12252,11 +12275,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 9c179f743b..68da1b1221 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -1851,8 +1851,8 @@ msgid "Open a File or Directory" msgstr "OtvoriÅ¥ súbor / prieÄinok" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "UložiÅ¥" @@ -4040,6 +4040,21 @@ msgstr "Vrátili ste Node-derived objekt v `post_import()` metóde?" msgid "Saving..." msgstr "Ukladám..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "VybraÅ¥ Režim" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Import" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "NaÄÃtaÅ¥ predvolené" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Súbory" @@ -5109,7 +5124,6 @@ msgid "Sort:" msgstr "ZoradiÅ¥:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategória:" @@ -10346,6 +10360,11 @@ msgstr "" msgid "Plugins" msgstr "Pluginy" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "NaÄÃtaÅ¥ predvolené" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12371,6 +12390,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prázdny CollisionPolygon2D nemá žiaden efekt na kolÃziu." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12642,11 +12669,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 1c6d1c566b..69819f0a36 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -1936,8 +1936,8 @@ msgid "Open a File or Directory" msgstr "Odpri Datoteko ali Mapo" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Shrani" @@ -4209,6 +4209,21 @@ msgstr "" msgid "Saving..." msgstr "Shranjevanje..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Izberi NaÄin" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Uvozi" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Naložite Prevzeto" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5349,7 +5364,6 @@ msgid "Sort:" msgstr "Razvrsti:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategorija:" @@ -10687,6 +10701,11 @@ msgstr "" msgid "Plugins" msgstr "VtiÄniki" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Naložite Prevzeto" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Prednastavitev..." @@ -12767,6 +12786,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Prazen CollisionPolygon2D nima vpliva na collision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -13033,11 +13060,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 09b3b2af2e..f53d0b630a 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -1887,8 +1887,8 @@ msgid "Open a File or Directory" msgstr "Hap një Skedar ose Direktori" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Ruaj" @@ -4132,6 +4132,21 @@ msgstr "" msgid "Saving..." msgstr "Duke Ruajtur..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Zgjidh Nyjet Për ti Importuar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importo" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Ngarko të Parazgjedhur" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5205,7 +5220,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10337,6 +10351,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Ngarko të Parazgjedhur" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12350,6 +12369,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12607,11 +12634,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 26c5abcbc8..4fe901f414 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -2030,8 +2030,8 @@ msgid "Open a File or Directory" msgstr "Отвори датотеку или директоријум" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Сачувај" @@ -4415,6 +4415,21 @@ msgstr "" msgid "Saving..." msgstr "Чување..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Одабери режим" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Увоз" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Учитај уобичајено" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5612,7 +5627,6 @@ msgid "Sort:" msgstr "Сортирање:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Категорија:" @@ -11617,6 +11631,11 @@ msgstr "Ðуто-Учитавање" msgid "Plugins" msgstr "Прикључци" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Учитај уобичајено" + #: editor/property_editor.cpp msgid "Preset..." msgstr "ПоÑтавке..." @@ -14013,6 +14032,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Ðепријатењ СударниМногоугао2Д нема утицаја на Ñудар." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp #, fuzzy msgid "" @@ -14367,11 +14394,6 @@ msgstr "" " \n" "Као замену кориÑти ИÑпеченеСенкеМапу." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp #, fuzzy msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 47cb13691e..3d979c3fc6 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -1827,8 +1827,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3916,6 +3916,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Uduplaj Selekciju" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4985,7 +4998,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10110,6 +10122,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12088,6 +12104,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12343,11 +12367,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 420918548f..a7bc3d6288 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -1899,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "Öppna en Fil eller Katalog" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Spara" @@ -4152,6 +4152,21 @@ msgstr "" msgid "Saving..." msgstr "Sparar..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Välj Node" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Importera" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Ladda Standard" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Filer" @@ -5266,7 +5281,6 @@ msgid "Sort:" msgstr "Sortera:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -10576,6 +10590,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Ladda Standard" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12646,6 +12665,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "En tom CollisionPolygon2D har ingen effekt pÃ¥ kollision." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12924,11 +12951,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/ta.po b/editor/translations/ta.po index d1bc762e93..9f9f40b54b 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -1823,8 +1823,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3907,6 +3907,19 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•à®³à¯" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4970,7 +4983,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10029,6 +10041,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11996,6 +12012,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12251,11 +12275,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index 02a7a33269..50c0fb5a4b 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -1797,8 +1797,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3874,6 +3874,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4925,7 +4937,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9954,6 +9965,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11903,6 +11918,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12158,11 +12181,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 2026248122..76a2d3c125 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -1836,8 +1836,8 @@ msgid "Open a File or Directory" msgstr "เปิดไฟล์หรืà¸à¹‚ฟลเดà¸à¸£à¹Œ" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "บันทึà¸" @@ -3987,6 +3987,21 @@ msgstr "คุณส่งคืนà¸à¸à¸šà¹€à¸ˆà¸à¸•à¹Œà¹‚หนดย่ภmsgid "Saving..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "โหมดเลืà¸à¸" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "นำเข้า" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "โหลดค่าเริ่มต้น" + #: editor/import_dock.cpp msgid "%d Files" msgstr "ไฟล์ %d" @@ -5047,7 +5062,6 @@ msgid "Sort:" msgstr "เรียงตาม:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "หมวดหมู่:" @@ -10231,6 +10245,11 @@ msgstr "à¸à¸à¹‚ต้โหลด" msgid "Plugins" msgstr "ปลั๊à¸à¸à¸´à¸™" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "โหลดค่าเริ่มต้น" + #: editor/property_editor.cpp msgid "Preset..." msgstr "พรีเซ็ต..." @@ -12240,6 +12259,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "CollisionPolygon2D ที่ว่างเปล่าจะไม่มีผลทางà¸à¸²à¸¢à¸ าพ" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12529,11 +12556,6 @@ msgstr "" "ไดรเวà¸à¸£à¹Œà¸§à¸µà¸”ีโภGLES2 ไม่สนับสนุน GIProbe\n" "ใช้ BakedLightmap à¹à¸—น" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera เลิà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹à¸¥à¹‰à¸§à¹à¸¥à¸°à¸ˆà¸°à¸–ูà¸à¸¥à¸šà¸à¸à¸à¹ƒà¸™ Godot 4.0" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight ที่มีมุมมาà¸à¸à¸§à¹ˆà¸² 90 ไม่สามารถสร้างเงา" @@ -12854,6 +12876,10 @@ msgstr "Varyings สามารถà¸à¸³à¸«à¸™à¸”ในังà¸à¹Œà¸Šà¸±à¸™à¹€ msgid "Constants cannot be modified." msgstr "ค่าคงที่ไม่สามารถà¹à¸à¹‰à¹„ขได้" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera เลิà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹à¸¥à¹‰à¸§à¹à¸¥à¸°à¸ˆà¸°à¸–ูà¸à¸¥à¸šà¸à¸à¸à¹ƒà¸™ Godot 4.0" + #~ msgid "No" #~ msgstr "ไม่" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 568265764b..ecd57ee2cd 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -61,8 +61,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" -"Last-Translator: Cem Eren Fukara <cefukara@hotmail.com>\n" +"PO-Revision-Date: 2021-03-03 15:50+0000\n" +"Last-Translator: OÄŸuz Ersen <oguzersen@protonmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -70,7 +70,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.5\n" +"X-Generator: Weblate 4.5.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1721,7 +1721,7 @@ msgstr "Dock Nod" #: editor/editor_feature_profile.cpp msgid "FileSystem Dock" -msgstr "Dosya sistemi" +msgstr "Dosya Sistemi" #: editor/editor_feature_profile.cpp msgid "Import Dock" @@ -1904,8 +1904,8 @@ msgid "Open a File or Directory" msgstr "Bir Dosya ya da Dizin Aç" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Kaydet" @@ -4111,6 +4111,21 @@ msgstr "`Post_import ()` yönteminde Node türevi bir nesne döndürdünüz mü? msgid "Saving..." msgstr "Kaydediliyor..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Kip Seç" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "İçe Aktar" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Önyüklü sRGB'yi Kullan" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d Dosya" @@ -5183,7 +5198,6 @@ msgid "Sort:" msgstr "Sırala:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Kategori:" @@ -10439,6 +10453,11 @@ msgstr "Otomatik Yükle" msgid "Plugins" msgstr "Eklentiler" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Varsayılanı Yükle" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Ön ayar..." @@ -12480,6 +12499,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "BoÅŸ bir CollisionPolygon2D'nin çarpışmaya hiçbir etkisi yoktur." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12799,13 +12826,6 @@ msgstr "" "GIProbes GLES2 video sürücüsü tarafından desteklenmez.\n" "Bunun yerine bir BakedLightmap kullanın." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"InterpolatedCamera kullanımdan kaldırılmıştır ve Godot 4.0'da " -"kaldırılacaktır." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "90 dereceden geniÅŸ açılı SpotIşık gölge oluÅŸturamaz." @@ -13149,6 +13169,12 @@ msgstr "varyings yalnızca vertex iÅŸlevinde atanabilir." msgid "Constants cannot be modified." msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera kullanımdan kaldırılmıştır ve Godot 4.0'da " +#~ "kaldırılacaktır." + #~ msgid "No" #~ msgstr "Hayır" @@ -14782,9 +14808,6 @@ msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." #~ msgid "Use Default Light" #~ msgstr "Önyüklü Işık Kullan" -#~ msgid "Use Default sRGB" -#~ msgstr "Önyüklü sRGB'yi Kullan" - #~ msgid "Default Light Normal:" #~ msgstr "Önyüklü Işığın OlaÄŸanı:" diff --git a/editor/translations/tzm.po b/editor/translations/tzm.po index 67b5af0d44..c4614c7eb3 100644 --- a/editor/translations/tzm.po +++ b/editor/translations/tzm.po @@ -1795,8 +1795,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3872,6 +3872,18 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +msgid "Select Importer" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Importer:" +msgstr "" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp msgid "%d Files" msgstr "" @@ -4923,7 +4935,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -9951,6 +9962,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -11900,6 +11915,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12155,11 +12178,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 74f5becfea..4cdbe25d02 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-02-22 21:30+0000\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" @@ -1873,8 +1873,8 @@ msgid "Open a File or Directory" msgstr "Відкрити файл або каталог" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "Зберегти" @@ -2548,10 +2548,8 @@ msgstr "" "налаштуваннÑ." #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "" -"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ поле Ñкрипт Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð¿Ð»Ð°Ð³Ñ–Ð½Ñƒ в: 'res://addons/%s'." +msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ поле Ñкрипту Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ° тут: «%s»." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4084,6 +4082,21 @@ msgstr "Повернули об'єкт, що походить від Node, у м msgid "Saving..." msgstr "ЗбереженнÑ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Режим виділеннÑ" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Імпорт" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Завантажити типовий" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d файлів" @@ -5056,9 +5069,8 @@ msgid "Got:" msgstr "Отримав:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" -msgstr "Помилка перевірки Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ sha256" +msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ð¹Ñ‚Ð¸ перевірку хешу SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -5161,7 +5173,6 @@ msgid "Sort:" msgstr "Сортувати:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "КатегоріÑ:" @@ -10438,6 +10449,11 @@ msgstr "ÐвтозавантаженнÑ" msgid "Plugins" msgstr "Плаґіни (додатки)" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Завантажити типовий" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Заздалегідь уÑтановлений..." @@ -10689,12 +10705,10 @@ msgid "Instance Child Scene" msgstr "Створити екземплÑÑ€ дочірньої Ñцени" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "Ðе можна працювати із вузлами зі Ñторонньої Ñцени!" +msgstr "Ðе можна вÑтавлÑти кореневий вузол до Ñцени цього кореневого вузла." #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "Ð’Ñтавити вузли" @@ -10825,7 +10839,6 @@ msgid "Attach Script" msgstr "Долучити Ñкрипт" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "Вирізати вузли" @@ -12508,6 +12521,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "Порожній CollisionPolygon2D ніÑк не вплине на зіткненнÑ." +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12829,12 +12850,6 @@ msgstr "" "У драйвері GLES2 не передбачено підтримки GIProbes.\n" "СкориÑтайтеÑÑ Ð·Ð°Ð¼Ñ–ÑÑ‚ÑŒ них BakedLightmap." -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" -"InterpolatedCamera вважаєтьÑÑ Ð·Ð°Ñтарілою, Ñ—Ñ— буде вилучено у Godot 4.0." - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "SpotLight з кутом, Ñкий Ñ” більшим за 90 градуÑів, не може давати тіні." @@ -13180,6 +13195,11 @@ msgstr "Змінні величини можна пов'Ñзувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "" +#~ "InterpolatedCamera вважаєтьÑÑ Ð·Ð°Ñтарілою, Ñ—Ñ— буде вилучено у Godot 4.0." + #~ msgid "No" #~ msgstr "ÐÑ–" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index eccfc5f710..a2e1decab6 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -1829,8 +1829,8 @@ msgid "Open a File or Directory" msgstr "" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "" @@ -3950,6 +3950,20 @@ msgstr "" msgid "Saving..." msgstr "" +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr ".تمام کا انتخاب" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr ".سپورٹ" + +#: editor/import_defaults_editor.cpp +msgid "Reset to Defaults" +msgstr "" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5026,7 +5040,6 @@ msgid "Sort:" msgstr "" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "" @@ -10201,6 +10214,10 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +msgid "Import Defaults" +msgstr "" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12207,6 +12224,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12462,11 +12487,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 3d01339f40..94692dc9b2 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -15,13 +15,15 @@ # Steve Dang <bynguu@outlook.com>, 2020. # Harry Mitchell <minhyh0987@gmail.com>, 2020. # HSGamer <huynhqtienvtag@gmail.com>, 2020. -# LetterC67 <hoangdeptoong@gmail.com>, 2020. +# LetterC67 <hoangdeptoong@gmail.com>, 2020, 2021. +# Rev <revolnoom7801@gmail.com>, 2021. +# SyliawDeV <thanhlongstranger@gmail.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-08-11 14:04+0000\n" -"Last-Translator: LetterC67 <hoangdeptoong@gmail.com>\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" +"Last-Translator: Rev <revolnoom7801@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -29,12 +31,13 @@ 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.2-dev\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Hà m convert() có loại đối số không hợp lệ, sá» dụng các hằng TYPE_*." +msgstr "" +"Hà m convert() có loại đối số không hợp lệ, hãy sá» dụng các hằng TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -171,9 +174,8 @@ msgid "Anim Change Call" msgstr "Äổi Function Gá»i Animation" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Äổi thá»i gian khung hình" +msgstr "Äổi nhiá»u thá»i gian khung hình" #: editor/animation_track_editor.cpp #, fuzzy @@ -206,26 +208,25 @@ msgstr "Chỉnh Vòng Lặp Hoạt Ảnh" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "" +msgstr "Theo dõi đặc tÃnh" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "" +msgstr "Theo dõi chuyển đổi 3D" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Gá»i phÆ°Æ¡ng thức theo dõi" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "Theo dõi Ä‘Æ°á»ng cong Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Bản nhạc phát lại âm thanh" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Playback Track" msgstr "NgÆ°ng chạy animation. (S)" @@ -238,7 +239,6 @@ msgid "Animation length (seconds)" msgstr "Äá»™ dà i hoạt ảnh (giây)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track" msgstr "Thêm Track Animation" @@ -257,7 +257,7 @@ msgstr "Âm thanh:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "" +msgstr "Hoạt ảnh:" #: editor/animation_track_editor.cpp msgid "Change Track Path" @@ -265,7 +265,7 @@ msgstr "Thay đổi Ä‘Æ°á»ng dẫn Track" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "Báºt tắt track nà y on/off." +msgstr "Báºt hoặc tắt track nà y, on/off" #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" @@ -383,7 +383,7 @@ msgstr "Chèn Anim" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." -msgstr "AnimationPlayer không thể tá»± tạo hoạt ảnh, chỉ các player khác." +msgstr "AnimationPlayer không thể tá»± tạo hoạt ảnh, phải nhá» các Player khác." #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -407,7 +407,7 @@ msgstr "Sắp xếp lại Tracks" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "" +msgstr "Các chuyển đổi chỉ có thể áp dụng cho các node Spatial" #: editor/animation_track_editor.cpp msgid "" @@ -416,7 +416,7 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" -"Các bản âm thanh chỉ có thể trỠđến các nút:\n" +"Các bản âm thanh chỉ có thể trỠđến các loại:\n" "-AudioStreamPlayer\n" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" @@ -428,10 +428,11 @@ msgstr "Các bản hoạt ảnh chỉ có thể trá» tá»›i các nút AnimationP #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." msgstr "" +"Animation player không tá»± tạo hoạt ảnh được, phải thông qua các player khác." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Không thể thêm track má»›i mà không có root." #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" @@ -482,14 +483,13 @@ msgid "Paste Tracks" msgstr "Dán Tracks" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Scale Keys" -msgstr "Anim Scale Keys" +msgstr "Key để scale hoạt ảnh" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "Tùy chá»n nà y không áp lên Bezier được, vì nó chỉ là má»™t track." #: editor/animation_track_editor.cpp msgid "" @@ -503,6 +503,16 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Cáianimation nà y thuá»™c vá» má»™t cảnh đã nháºp, vì váºy những thay đổi đối vá»›i " +"các bản nhạc đã nháºp sẽ không được lÆ°u.\n" +"\n" +"Äể báºt khả năng thêm các bản nhạc tùy chỉnh, hãy Ä‘iá»u hÆ°á»›ng đến cà i đặt nháºp " +"của cảnh và đặt\n" +"\"animation > LÆ°u trữ\" thà nh \"Tệp\", báºt \"Hoạt hình> Giữ các bản nhạc tùy " +"chỉnh\", sau đó nháºp lại.(vn)\n" +"\"Animation > Storage\" to \"Files\", enable \"Animation > Keep Custom Tracks" +"\", sau đó nháºp lại (english).\n" +"Hoặc, sá» dụng cà i đặt trÆ°á»›c nháºp khẩu nháºp hình ảnh Ä‘á»™ng để tách các tệp." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" @@ -536,7 +546,7 @@ msgstr "Giây" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "FPS" -msgstr "" +msgstr "Khung hình(FPS)" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -554,7 +564,7 @@ msgstr "Thuá»™c tÃnh hoạt cảnh." #: editor/animation_track_editor.cpp msgid "Copy Tracks" -msgstr "" +msgstr "Sao Chép Tracks" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -570,7 +580,7 @@ msgstr "Nhân đôi lá»±a chá»n" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Chuyển đổi trùng lặp" #: editor/animation_track_editor.cpp msgid "Delete Selection" @@ -598,7 +608,7 @@ msgstr "Chá»n node để được là m diá»…n hoạt:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "Sá» dụng Ä‘Æ°á»ng cong Bezier" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -606,15 +616,15 @@ msgstr "Tối Æ°u hóa Animation" #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Sai lệch tuyến tÃnh lá»›n nhất:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Sai lệch góc lá»›n nhất:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Góc lá»›n nhất có thể tối Æ°u:" #: editor/animation_track_editor.cpp msgid "Optimize" @@ -622,7 +632,7 @@ msgstr "Tối Æ°u" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "Gỡ bá» các khoá không hợp lệ" +msgstr "Xóa các khoá không hợp lệ" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" @@ -659,9 +669,8 @@ msgid "Copy" msgstr "Sao chép" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "Chá»n Không có" +msgstr "Chá»n tất cả/ hoặc không" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" @@ -669,19 +678,19 @@ msgstr "Thêm Track Âm thanh" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "Thay đổi thá»i Ä‘iểm bắt đầu phát track âm thanh." #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "Thay đổi thá»i Ä‘iểm kết thúc track âm thanh" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "Äổi lại size Array" +msgstr "Thay đổi kÃch thÆ°á»›c mảng" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "Äổi loại giá trị Array" +msgstr "Äổi kiểu giá trị Array" #: editor/array_property_edit.cpp msgid "Change Array Value" @@ -768,9 +777,8 @@ msgid "Method in target node must be specified." msgstr "PhÆ°Æ¡ng thức trong nút Ä‘Ãch phải được chỉ định." #: editor/connections_dialog.cpp -#, fuzzy msgid "Method name must be a valid identifier." -msgstr "PhÆ°Æ¡ng thức trong nút Ä‘Ãch phải được chỉ định." +msgstr "Tên phÆ°Æ¡ng thức phải được chỉ định." #: editor/connections_dialog.cpp msgid "" @@ -822,9 +830,8 @@ msgid "Extra Call Arguments:" msgstr "Mở rá»™ng Äối số được gá»i:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "Lá»c các nút" +msgstr "Hà m nháºn:" #: editor/connections_dialog.cpp msgid "Advanced" @@ -846,7 +853,7 @@ msgstr "Má»™t lần" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "Ngắt kết nối tÃn hiệu sau lần phát xạ đầu tiên." +msgstr "Ngắt kết nối tÃn hiệu sau lần phát đầu tiên." #: editor/connections_dialog.cpp msgid "Cannot connect signal" @@ -864,7 +871,7 @@ msgstr "Không thể kết nối tÃn hiệu" #: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Close" -msgstr "Tắt" +msgstr "Äóng" #: editor/connections_dialog.cpp msgid "Connect" @@ -912,9 +919,8 @@ msgid "Signals" msgstr "TÃn hiệu (Signal)" #: editor/connections_dialog.cpp -#, fuzzy msgid "Filter signals" -msgstr "Lá»c tệp tin ..." +msgstr "Lá»c tÃn hiệu" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" @@ -978,7 +984,6 @@ msgid "Search Replacement For:" msgstr "Tìm kiếm thay thế cho:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependencies For:" msgstr "Phần phụ thuá»™c cho:" @@ -1026,7 +1031,7 @@ msgstr "Trình chỉnh sá»a Phụ thuá»™c" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "" +msgstr "Tìm kiếm tà i nguyên thay thế:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -1090,13 +1095,12 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "Xoá vÄ©nh viá»…n các đối tượng %d? (Không thể hoà n lại!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "Phần phụ thuá»™c cho:" +msgstr "Hiện các phần phụ thuá»™c" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Tìm tà i nguyên mất gốc" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -1464,15 +1468,15 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "Từ khóa không thể dùng là m tên má»™t nạp tá»± Ä‘á»™ng." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "Nạp tá»± Ä‘á»™ng '%s' đã tồn tại!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "Äổi tên" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -1875,8 +1879,8 @@ msgid "Open a File or Directory" msgstr "Mở má»™t tệp tin hoặc thÆ° mục" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "LÆ°u" @@ -2787,9 +2791,8 @@ msgid "Project Settings..." msgstr "Cà i đặt Dá»± Ãn" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "Phiên bản:" +msgstr "Theo dõi phiên bản" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" @@ -2975,9 +2978,8 @@ msgid "Q&A" msgstr "Há»i và Äáp" #: editor/editor_node.cpp -#, fuzzy msgid "Report a Bug" -msgstr "Nháºp và o lại" +msgstr "Báo lá»—i" #: editor/editor_node.cpp msgid "Send Docs Feedback" @@ -2989,7 +2991,7 @@ msgstr "Cá»™ng đồng" #: editor/editor_node.cpp msgid "About" -msgstr "Thông tin chúng tôi" +msgstr "Vá» chúng tôi" #: editor/editor_node.cpp msgid "Play the project." @@ -3001,7 +3003,7 @@ msgstr "Chạy" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "Dừng chạy Cảnh để gỡ lá»—i." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3029,7 +3031,7 @@ msgstr "Chạy Cảnh Tuỳ Chá»n" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "Thay đổi trình Ä‘iá»u kiển Video, yêu cầu khởi Ä‘á»™ng lại Trình biên táºp." +msgstr "Thay đổi trình Ä‘iá»u khiển Video cần phải khởi Ä‘á»™ng lại Trình biên táºp." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -3041,14 +3043,12 @@ msgid "Spins when the editor window redraws." msgstr "" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Liên tục" +msgstr "Cáºp nháºt Liên tục" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" -msgstr "Äối số đã thay đổi" +msgstr "Cáºp nháºt khi có thay đổi" #: editor/editor_node.cpp msgid "Hide Update Spinner" @@ -3064,7 +3064,7 @@ msgstr "Quan Sát Viên" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "Mở rá»™ng bảng Ä‘iá»u khiển phÃa dÆ°á»›i" +msgstr "Mở rá»™ng bảng Ä‘iá»u khiển dÆ°á»›i" #: editor/editor_node.cpp msgid "Output" @@ -3093,7 +3093,7 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"Äiá»u nà y sẽ thiết láºp dá»± án của bạn cho các bản dá»±ng Android tùy chỉnh bằng " +"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 nguồn mẫu thà nh \"res://android/build\".\n" "Bạn có thể áp dụng các sá»a đổi và xây dá»±ng APK tùy chỉnh khi xuất (thêm các " "mô-Ä‘un, thay đổi AndroidManifest.xml, ...).\n" @@ -3136,16 +3136,18 @@ msgid "" "The following files are newer on disk.\n" "What action should be taken?" msgstr "" +"Các tệp sau xuất hiện trên ổ cứng gần đây hÆ¡n.\n" +"Bạn muốn là m gì đây?" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "Tải lại" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "LÆ°u lại" #: editor/editor_node.cpp msgid "New Inherited" @@ -3184,9 +3186,8 @@ msgid "Open the previous Editor" msgstr "" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "Cảnh báo" +msgstr "Cảnh báo!" #: editor/editor_path.cpp msgid "No sub-resources found." @@ -3201,9 +3202,8 @@ msgid "Thumbnail..." msgstr "" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "Tạo Script" +msgstr "Mã lệnh chÃnh:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" @@ -3244,7 +3244,7 @@ msgstr "" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "Thá»i gian trung bình (giây)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3289,7 +3289,7 @@ msgstr "" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "Bit %d, giá trị %d" #: editor/editor_properties.cpp msgid "[Empty]" @@ -4057,6 +4057,21 @@ msgstr "" msgid "Saving..." msgstr "Äang lÆ°u ..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "Chế Ä‘á»™ chá»n" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "Nháºp và o" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "Nạp mặc định" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5143,7 +5158,6 @@ msgid "Sort:" msgstr "Sắp xếp:" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "Danh mục:" @@ -10414,6 +10428,11 @@ msgstr "" msgid "Plugins" msgstr "" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "Nạp mặc định" + #: editor/property_editor.cpp msgid "Preset..." msgstr "Cà i sẵn ..." @@ -12465,6 +12484,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12720,11 +12747,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 3b0394b1d7..ac2d4a61f6 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -43,7 +43,7 @@ # Song DongHui <14729626293@163.com>, 2019. # simano clio <sim2cle@gmail.com>, 2019. # ByonkoGalilei <byonko@qq.com>, 2019. -# qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>, 2019. +# qjyqjyqjyqjy <qjyqjyqjyqjy@sina.com.cn>, 2019, 2021. # liushuyu011 <liushuyu011@gmail.com>, 2019. # DS <dseqrasd@126.com>, 2019. # ZeroAurora <zeroaurora@qq.com>, 2019. @@ -76,11 +76,12 @@ # twoBornottwoB <305766341@qq.com>, 2021. # Magian <magian1127@gmail.com>, 2021. # Weiduo Xie <xwditfr@gmail.com>, 2021. +# suplife <2634557184@qq.com>, 2021. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-03-08 15:33+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -89,7 +90,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.5\n" +"X-Generator: Weblate 4.5.1\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -98,13 +99,13 @@ msgstr "convert() çš„å‚æ•°ç±»åž‹æ— æ•ˆï¼Œè¯·ä½¿ç”¨ TYPE_* 常é‡ã€‚" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "应为长度 1 çš„å—符串(1 å—符)。" +msgstr "应为长度为 1 çš„å—符串(1 å—符)。" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "没有足够的å—节å¯è§£ç æˆ–æ ¼å¼æ— 效。" +msgstr "解ç å—节数ä¸å¤Ÿï¼Œæˆ–æ ¼å¼æ— 效。" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -1898,8 +1899,8 @@ msgid "Open a File or Directory" msgstr "打开文件或目录" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ä¿å˜" @@ -2554,9 +2555,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "æ— æ³•åœ¨ “%s†上å¯ç”¨åŠ 载项æ’件:é…置解æžå¤±è´¥ã€‚" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "æ— æ³•åœ¨ “res://addons/%s†ä¸æ‰¾åˆ°åŠ 载项æ’件的脚本å—段。" +msgstr "æ— æ³•åœ¨ “%sâ€ ä¸Šæ‰¾åˆ°åŠ è½½é¡¹çš„ script å—段。" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -4044,6 +4044,21 @@ msgstr "有在 `post_import()` 方法ä¸è¿”回继承了 Node 的对象å—?" msgid "Saving..." msgstr "ä¿å˜ä¸..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "选择模å¼" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "导入" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "使用默认sRGB" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d 个文件" @@ -4704,7 +4719,7 @@ msgstr "过渡已å˜åœ¨ï¼" #: editor/plugins/animation_state_machine_editor.cpp msgid "Add Transition" -msgstr "æ·»åŠ è½¬æ¢" +msgstr "æ·»åŠ è¿‡æ¸¡" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4745,7 +4760,7 @@ msgstr "节点已移除" #: editor/plugins/animation_state_machine_editor.cpp msgid "Transition Removed" -msgstr "转æ¢å·²ç§»é™¤" +msgstr "过渡已移除" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" @@ -4968,7 +4983,7 @@ msgstr "æ— æ³•å°†å“应ä¿å˜åˆ°ï¼š" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "写错误。" +msgstr "写入错误。" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -4999,7 +5014,6 @@ msgid "Got:" msgstr "获得:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" msgstr "SHA-256 å“ˆå¸Œå€¼æ ¡éªŒå¤±è´¥" @@ -5104,7 +5118,6 @@ msgid "Sort:" msgstr "排åºï¼š" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分类:" @@ -10274,6 +10287,11 @@ msgstr "è‡ªåŠ¨åŠ è½½" msgid "Plugins" msgstr "æ’件" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "åŠ è½½é»˜è®¤" + #: editor/property_editor.cpp msgid "Preset..." msgstr "预设..." @@ -10521,12 +10539,10 @@ msgid "Instance Child Scene" msgstr "实例化å场景" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "æ— æ³•æ“作外部场景的节点ï¼" +msgstr "ä¸èƒ½å°†æ ¹èŠ‚点粘贴进相åŒåœºæ™¯ã€‚" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "粘贴节点" @@ -10653,7 +10669,6 @@ msgid "Attach Script" msgstr "æ·»åŠ è„šæœ¬" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "剪切节点" @@ -12269,6 +12284,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空的 CollisionPolygon2D ä¸èµ·ä»»ä½•ç¢°æ’žæ£€æµ‹ä½œç”¨ã€‚" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12555,11 +12578,6 @@ msgstr "" "GLES2 视频驱动程åºä¸æ”¯æŒ GIProbes。\n" "请改用 BakedLightmap。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera 已废弃,将在 Godot 4.0 ä¸åˆ 除。" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "角度宽于 90 度的 SpotLight æ— æ³•æŠ•å°„å‡ºé˜´å½±ã€‚" @@ -12884,6 +12902,10 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" msgid "Constants cannot be modified." msgstr "ä¸å…许修改常é‡ã€‚" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera 已废弃,将在 Godot 4.0 ä¸åˆ 除。" + #~ msgid "No" #~ msgstr "å¦" @@ -14531,9 +14553,6 @@ msgstr "ä¸å…许修改常é‡ã€‚" #~ msgid "Use Default Light" #~ msgstr "使用默认光照" -#~ msgid "Use Default sRGB" -#~ msgstr "使用默认sRGB" - #~ msgid "Default Light Normal:" #~ msgstr "默认光照法线:" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 728ecba4ba..2009ba8f20 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -1922,8 +1922,8 @@ msgid "Open a File or Directory" msgstr "é¸æ“‡è³‡æ–™å¤¾/檔案" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "儲å˜" @@ -4173,6 +4173,21 @@ msgstr "" msgid "Saving..." msgstr "儲å˜ä¸..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "é¸æ“‡æ¨¡å¼" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "å°Žå…¥" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "é è¨" + #: editor/import_dock.cpp #, fuzzy msgid "%d Files" @@ -5313,7 +5328,6 @@ msgid "Sort:" msgstr "排åºï¼š" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分類:" @@ -10643,6 +10657,11 @@ msgstr "" msgid "Plugins" msgstr "æ’件" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "é è¨" + #: editor/property_editor.cpp msgid "Preset..." msgstr "" @@ -12735,6 +12754,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12992,11 +13019,6 @@ msgid "" "Use a BakedLightmap instead." msgstr "" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 7ac1142466..5708d11522 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -29,7 +29,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-02-21 10:51+0000\n" +"PO-Revision-Date: 2021-02-27 00:47+0000\n" "Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" @@ -1851,8 +1851,8 @@ msgid "Open a File or Directory" msgstr "開啟檔案或資料夾" #: editor/editor_file_dialog.cpp editor/editor_node.cpp -#: editor/editor_properties.cpp editor/inspector_dock.cpp -#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/editor_properties.cpp editor/import_defaults_editor.cpp +#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" msgstr "ä¿å˜" @@ -2505,9 +2505,8 @@ msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "無法在「%sã€ä¸Šå•Ÿç”¨æ“´å……功能,解æžçµ„æ…‹è¨å®šå¤±æ•—。" #: editor/editor_node.cpp -#, fuzzy msgid "Unable to find script field for addon plugin at: '%s'." -msgstr "無法在擴充功能「res://addons/%sã€ä¸ç„¡æ³•æ‰¾åˆ°è…³æœ¬æ¬„ä½ã€‚" +msgstr "無法在擴充功能「r%sã€ä¸æ‰¾åˆ°è…³æœ¬æ¬„ä½ã€‚" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." @@ -3995,6 +3994,21 @@ msgstr "是å¦æœ‰åœ¨ `post_import()` 方法內回傳繼承 Node 之物件?" msgid "Saving..." msgstr "æ£åœ¨ä¿å˜..." +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Select Importer" +msgstr "é¸æ“‡æ¨¡å¼" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Importer:" +msgstr "匯入" + +#: editor/import_defaults_editor.cpp +#, fuzzy +msgid "Reset to Defaults" +msgstr "載入é è¨" + #: editor/import_dock.cpp msgid "%d Files" msgstr "%d 個檔案" @@ -4950,7 +4964,6 @@ msgid "Got:" msgstr "ç²å¾—:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Failed SHA-256 hash check" msgstr "SHA-256 雜湊檢查失敗" @@ -5055,7 +5068,6 @@ msgid "Sort:" msgstr "排åºï¼š" #: editor/plugins/asset_library_editor_plugin.cpp -#: editor/project_settings_editor.cpp msgid "Category:" msgstr "分類:" @@ -10226,6 +10238,11 @@ msgstr "Autoload" msgid "Plugins" msgstr "外掛" +#: editor/project_settings_editor.cpp +#, fuzzy +msgid "Import Defaults" +msgstr "載入é è¨" + #: editor/property_editor.cpp msgid "Preset..." msgstr "é è¨è¨å®š..." @@ -10473,12 +10490,10 @@ msgid "Instance Child Scene" msgstr "實體化åå ´æ™¯" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Can't paste root node into the same scene." -msgstr "無法å°å¤–éƒ¨å ´æ™¯çš„ç¯€é»žé€²è¡Œæ“作ï¼" +msgstr "無法將跟節點貼到相åŒçš„å ´æ™¯ä¸ã€‚" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Paste Node(s)" msgstr "貼上節點" @@ -10605,7 +10620,6 @@ msgid "Attach Script" msgstr "é™„åŠ è…³æœ¬" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Cut Node(s)" msgstr "剪下節點" @@ -12225,6 +12239,14 @@ msgstr "" msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "空白的 CollisionPolygon2D ä¸æœƒç”¢ç”Ÿä»»ä½•ç¢°æ’žæ•ˆæžœã€‚" +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 3 points are needed in 'Solids' build mode." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "Invalid polygon. At least 2 points are needed in 'Segments' build mode." +msgstr "" + #: scene/2d/collision_shape_2d.cpp msgid "" "CollisionShape2D only serves to provide a collision shape to a " @@ -12510,11 +12532,6 @@ msgstr "" "GLES2 視訊驅動程å¼ä¸æ”¯æ´ GIProbes。\n" "請改為使用 BakedLightmap。" -#: scene/3d/interpolated_camera.cpp -msgid "" -"InterpolatedCamera has been deprecated and will be removed in Godot 4.0." -msgstr "InterpolatedCamera å·²åœæ¢ç¶è·ï¼Œä¸”將於 Godot 4.0 ä¸ç§»é™¤ã€‚" - #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." msgstr "角度大於 90 度的 SpotLight 無法投射出陰影。" @@ -12840,6 +12857,10 @@ msgstr "Varying 變數åªå¯åœ¨é ‚點函å¼ä¸æŒ‡æ´¾ã€‚" msgid "Constants cannot be modified." msgstr "ä¸å¯ä¿®æ”¹å¸¸æ•¸ã€‚" +#~ msgid "" +#~ "InterpolatedCamera has been deprecated and will be removed in Godot 4.0." +#~ msgstr "InterpolatedCamera å·²åœæ¢ç¶è·ï¼Œä¸”將於 Godot 4.0 ä¸ç§»é™¤ã€‚" + #~ msgid "No" #~ msgstr "å¦" diff --git a/main/main.cpp b/main/main.cpp index 884caab1e9..9c8909f8fb 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1744,6 +1744,19 @@ Error Main::setup2(Thread::ID p_main_tid_override) { register_scene_types(); +#ifdef TOOLS_ENABLED + ClassDB::set_current_api(ClassDB::API_EDITOR); + EditorNode::register_editor_types(); + + ClassDB::set_current_api(ClassDB::API_CORE); + +#endif + + MAIN_PRINT("Main: Load Modules, Physics, Drivers, Scripts"); + + register_platform_apis(); + register_module_types(); + GLOBAL_DEF("display/mouse_cursor/custom_image", String()); GLOBAL_DEF("display/mouse_cursor/custom_image_hotspot", Vector2()); GLOBAL_DEF("display/mouse_cursor/tooltip_position_offset", Point2(10, 10)); @@ -1760,18 +1773,6 @@ Error Main::setup2(Thread::ID p_main_tid_override) { Input::get_singleton()->set_custom_mouse_cursor(cursor, Input::CURSOR_ARROW, hotspot); } } -#ifdef TOOLS_ENABLED - ClassDB::set_current_api(ClassDB::API_EDITOR); - EditorNode::register_editor_types(); - - ClassDB::set_current_api(ClassDB::API_CORE); - -#endif - - MAIN_PRINT("Main: Load Modules, Physics, Drivers, Scripts"); - - register_platform_apis(); - register_module_types(); camera_server = CameraServer::create(); diff --git a/misc/dist/html/editor.html b/misc/dist/html/editor.html index 535721f418..3bf87f3506 100644 --- a/misc/dist/html/editor.html +++ b/misc/dist/html/editor.html @@ -2,8 +2,18 @@ <html xmlns='http://www.w3.org/1999/xhtml' lang='' xml:lang=''> <head> <meta charset='utf-8' /> - <meta name='viewport' content='width=device-width, user-scalable=no' /> + <meta name='viewport' content='width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no' /> + <meta name="mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="application-name" content="Godot" /> + <meta name="apple-mobile-web-app-title" content="Godot" /> + <meta name="theme-color" content="#478cbf" /> + <meta name="msapplication-navbutton-color" content="#478cbf" /> + <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> + <meta name="msapplication-starturl" content="/latest" /> <link id='-gd-engine-icon' rel='icon' type='image/png' href='favicon.png' /> + <link rel="apple-touch-icon" type="image/png" href="favicon.png" /> + <link rel="manifest" href="manifest.json" /> <title>Godot Engine Web Editor (@GODOT_VERSION@)</title> <style> *:focus { @@ -250,7 +260,13 @@ <div id='status-notice' class='godot' style='display: none;'></div> </div> </div> - + <script> + window.addEventListener("load", () => { + if ("serviceWorker" in navigator) { + navigator.serviceWorker.register("service.worker.js"); + } + }); + </script> <script src='godot.tools.js'></script> <script>//<![CDATA[ diff --git a/misc/dist/html/manifest.json b/misc/dist/html/manifest.json new file mode 100644 index 0000000000..6e0053c23c --- /dev/null +++ b/misc/dist/html/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Godot Engine", + "short_name": "Godot", + "description": "Multi-platform 2D and 3D game engine with a feature-rich editor", + "lang": "en", + "start_url": "/godot.tools.html", + "display": "standalone", + "orientation": "landscape", + "theme_color": "#478cbf", + "icons": [ + { + "src": "favicon.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "background_color": "#333b4f" +} diff --git a/misc/dist/html/offline.html b/misc/dist/html/offline.html new file mode 100644 index 0000000000..000c21b4d3 --- /dev/null +++ b/misc/dist/html/offline.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <title>You are offline</title> + <style> + html { + background-color: #333b4f; + color: #e0e0e0; + } + + body { + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + margin: 2rem; + } + + p { + margin-block: 1rem; + } + + button { + display: block; + padding: 1rem 2rem; + margin: 3rem auto 0; + } + </style> +</head> +<body> + <h1>You are offline</h1> + <p>This application requires an Internet connection to run for the first time.</p> + <p>Press the button below to try reloading:</p> + <button type="button">Reload</button> + + <script> + document.querySelector("button").addEventListener("click", () => { + window.location.reload(); + }); + </script> +</body> +</html> diff --git a/misc/dist/html/service-worker.js b/misc/dist/html/service-worker.js new file mode 100644 index 0000000000..d4eaed2b17 --- /dev/null +++ b/misc/dist/html/service-worker.js @@ -0,0 +1,84 @@ +// This service worker is required to expose an exported Godot project as a +// Progressive Web App. It provides an offline fallback page telling the user +// that they need an Internet conneciton to run the project if desired. +// Incrementing CACHE_VERSION will kick off the install event and force +// previously cached resources to be updated from the network. +const CACHE_VERSION = "@GODOT_VERSION@"; +const CACHE_NAME = "@GODOT_NAME@-cache"; +const OFFLINE_URL = "offline.html"; +// Files that will be cached on load. +const CACHED_FILES = [ + "godot.tools.html", + "offline.html", + "godot.tools.js", + "godot.tools.worker.js", + "godot.tools.audio.worklet.js", + "logo.svg", + "favicon.png", +]; + +// Files that we might not want the user to preload, and will only be cached on first load. +const CACHABLE_FILES = [ + "godot.tools.wasm", +]; +const FULL_CACHE = CACHED_FILES.concat(CACHABLE_FILES); + +self.addEventListener("install", (event) => { + event.waitUntil(async function () { + const cache = await caches.open(CACHE_NAME); + // Clear old cache (including optionals). + await Promise.all(FULL_CACHE.map(path => cache.delete(path))); + // Insert new one. + const done = await cache.addAll(CACHED_FILES); + return done; + }()); +}); + +self.addEventListener("activate", (event) => { + event.waitUntil(async function () { + if ("navigationPreload" in self.registration) { + await self.registration.navigationPreload.enable(); + } + }()); + // Tell the active service worker to take control of the page immediately. + self.clients.claim(); +}); + +self.addEventListener("fetch", (event) => { + const isNavigate = event.request.mode === "navigate"; + const url = event.request.url || ""; + const referrer = event.request.referrer || ""; + const base = referrer.slice(0, referrer.lastIndexOf("/") + 1); + const local = url.startsWith(base) ? url.replace(base, "") : ""; + const isCachable = FULL_CACHE.some(v => v === local) || (base === referrer && base.endsWith(CACHED_FILES[0])); + if (isNavigate || isCachable) { + event.respondWith(async function () { + try { + // Use the preloaded response, if it's there + let request = event.request.clone(); + let response = await event.preloadResponse; + if (!response) { + // Or, go over network. + response = await fetch(event.request); + } + if (isCachable) { + // Update the cache + const cache = await caches.open(CACHE_NAME); + cache.put(request, response.clone()); + } + return response; + } catch (error) { + const cache = await caches.open(CACHE_NAME); + if (event.request.mode === "navigate") { + // Check if we have full cache. + const cached = await Promise.all(FULL_CACHE.map(name => cache.match(name))); + const missing = cached.some(v => v === undefined); + const cachedResponse = missing ? await caches.match(OFFLINE_URL) : await caches.match(CACHED_FILES[0]); + return cachedResponse; + } + const cachedResponse = await caches.match(event.request); + return cachedResponse; + } + }()); + } +}); diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp index bce8ec8076..d9f5beb5a1 100644 --- a/modules/bullet/collision_object_bullet.cpp +++ b/modules/bullet/collision_object_bullet.cpp @@ -148,6 +148,9 @@ void CollisionObjectBullet::add_collision_exception(const CollisionObjectBullet void CollisionObjectBullet::remove_collision_exception(const CollisionObjectBullet *p_ignoreCollisionObject) { exceptions.erase(p_ignoreCollisionObject->get_self()); + if (!bt_collision_object) { + return; + } bt_collision_object->setIgnoreCollisionCheck(p_ignoreCollisionObject->bt_collision_object, false); if (space) { space->get_broadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bt_collision_object->getBroadphaseHandle(), space->get_dispatcher()); @@ -155,11 +158,14 @@ void CollisionObjectBullet::remove_collision_exception(const CollisionObjectBull } bool CollisionObjectBullet::has_collision_exception(const CollisionObjectBullet *p_otherCollisionObject) const { - return !bt_collision_object->checkCollideWith(p_otherCollisionObject->bt_collision_object); + return exceptions.has(p_otherCollisionObject->get_self()); } void CollisionObjectBullet::set_collision_enabled(bool p_enabled) { collisionsEnabled = p_enabled; + if (!bt_collision_object) { + return; + } if (collisionsEnabled) { bt_collision_object->setCollisionFlags(bt_collision_object->getCollisionFlags() & (~btCollisionObject::CF_NO_CONTACT_RESPONSE)); } else { diff --git a/modules/mono/Directory.Build.props b/modules/mono/Directory.Build.props new file mode 100644 index 0000000000..fbf864b11b --- /dev/null +++ b/modules/mono/Directory.Build.props @@ -0,0 +1,3 @@ +<Project> + <Import Project="$(MSBuildThisFileDirectory)\SdkPackageVersions.props" /> +</Project> diff --git a/modules/mono/SdkPackageVersions.props b/modules/mono/SdkPackageVersions.props new file mode 100644 index 0000000000..396443f30e --- /dev/null +++ b/modules/mono/SdkPackageVersions.props @@ -0,0 +1,6 @@ +<Project> + <PropertyGroup> + <PackageVersion_Godot_NET_Sdk>4.0.0-dev4</PackageVersion_Godot_NET_Sdk> + <PackageVersion_Godot_SourceGenerators>4.0.0-dev1</PackageVersion_Godot_SourceGenerators> + </PropertyGroup> +</Project> diff --git a/modules/mono/build_scripts/godot_net_sdk_build.py b/modules/mono/build_scripts/godot_net_sdk_build.py index 3bfba0f0f6..8c5a60d2db 100644 --- a/modules/mono/build_scripts/godot_net_sdk_build.py +++ b/modules/mono/build_scripts/godot_net_sdk_build.py @@ -21,6 +21,18 @@ def build_godot_net_sdk(source, target, env): # No need to copy targets. The Godot.NET.Sdk csproj takes care of copying them. +def get_nupkgs_versions(props_file): + import xml.etree.ElementTree as ET + + tree = ET.parse(props_file) + root = tree.getroot() + + return { + "Godot.NET.Sdk": root.find("./PropertyGroup/PackageVersion_Godot_NET_Sdk").text.strip(), + "Godot.SourceGenerators": root.find("./PropertyGroup/PackageVersion_Godot_SourceGenerators").text.strip(), + } + + def build(env_mono): assert env_mono["tools"] @@ -30,14 +42,12 @@ def build(env_mono): module_dir = os.getcwd() - package_version_file = os.path.join( - module_dir, "editor", "Godot.NET.Sdk", "Godot.NET.Sdk", "Godot.NET.Sdk_PackageVersion.txt" - ) - - with open(package_version_file, mode="r") as f: - version = f.read().strip() + nupkgs_versions = get_nupkgs_versions(os.path.join(module_dir, "SdkPackageVersions.props")) - target_filenames = ["Godot.NET.Sdk.%s.nupkg" % version] + target_filenames = [ + "Godot.NET.Sdk.%s.nupkg" % nupkgs_versions["Godot.NET.Sdk"], + "Godot.SourceGenerators.%s.nupkg" % nupkgs_versions["Godot.SourceGenerators"], + ] targets = [os.path.join(nupkgs_dir, filename) for filename in target_filenames] diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 25cc64393a..4fca80fca0 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -31,6 +31,7 @@ #include "csharp_script.h" #include <mono/metadata/threads.h> +#include <mono/metadata/tokentype.h> #include <stdint.h> #include "core/config/project_settings.h" @@ -1182,46 +1183,56 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) { } #endif -void CSharpLanguage::_load_scripts_metadata() { - scripts_metadata.clear(); +void CSharpLanguage::lookup_script_for_class(GDMonoClass *p_class) { + if (!p_class->has_attribute(CACHED_CLASS(ScriptPathAttribute))) { + return; + } - String scripts_metadata_filename = "scripts_metadata."; + MonoObject *attr = p_class->get_attribute(CACHED_CLASS(ScriptPathAttribute)); + String path = CACHED_FIELD(ScriptPathAttribute, path)->get_string_value(attr); -#ifdef TOOLS_ENABLED - scripts_metadata_filename += Engine::get_singleton()->is_editor_hint() ? "editor" : "editor_player"; -#else -#ifdef DEBUG_ENABLED - scripts_metadata_filename += "debug"; -#else - scripts_metadata_filename += "release"; -#endif -#endif + dotnet_script_lookup_map[path] = DotNetScriptLookupInfo( + p_class->get_namespace(), p_class->get_name(), p_class); +} - String scripts_metadata_path = GodotSharpDirs::get_res_metadata_dir().plus_file(scripts_metadata_filename); +void CSharpLanguage::lookup_scripts_in_assembly(GDMonoAssembly *p_assembly) { + if (p_assembly->has_attribute(CACHED_CLASS(AssemblyHasScriptsAttribute))) { + MonoObject *attr = p_assembly->get_attribute(CACHED_CLASS(AssemblyHasScriptsAttribute)); + bool requires_lookup = CACHED_FIELD(AssemblyHasScriptsAttribute, requiresLookup)->get_bool_value(attr); - if (FileAccess::exists(scripts_metadata_path)) { - String old_json; + if (requires_lookup) { + // This is supported for scenarios where specifying all types would be cumbersome, + // such as when disabling C# source generators (for whatever reason) or when using a + // language other than C# that has nothing similar to source generators to automate it. + MonoImage *image = p_assembly->get_image(); - Error ferr = read_all_file_utf8(scripts_metadata_path, old_json); + int rows = mono_image_get_table_rows(image, MONO_TABLE_TYPEDEF); - ERR_FAIL_COND(ferr != OK); + for (int i = 1; i < rows; i++) { + // We don't search inner classes, only top-level. + MonoClass *mono_class = mono_class_get(image, (i + 1) | MONO_TOKEN_TYPE_DEF); - Variant old_dict_var; - String err_str; - int err_line; - Error json_err = JSON::parse(old_json, old_dict_var, err_str, err_line); - if (json_err != OK) { - ERR_PRINT("Failed to parse metadata file: '" + err_str + "' (" + String::num_int64(err_line) + ")."); - return; - } + if (!mono_class_is_assignable_from(CACHED_CLASS_RAW(GodotObject), mono_class)) { + continue; + } - scripts_metadata = old_dict_var.operator Dictionary(); - scripts_metadata_invalidated = false; + GDMonoClass *current = p_assembly->get_class(mono_class); + if (current) { + lookup_script_for_class(current); + } + } + } else { + // This is the most likely scenario as we use C# source generators + MonoArray *script_types = (MonoArray *)CACHED_FIELD(AssemblyHasScriptsAttribute, scriptTypes)->get_value(attr); - print_verbose("Successfully loaded scripts metadata"); - } else { - if (!Engine::get_singleton()->is_editor_hint()) { - ERR_PRINT("Missing scripts metadata file."); + int length = mono_array_length(script_types); + + for (int i = 0; i < length; i++) { + MonoReflectionType *reftype = mono_array_get(script_types, MonoReflectionType *, i); + ManagedType type = ManagedType::from_reftype(reftype); + ERR_CONTINUE(!type.type_class); + lookup_script_for_class(type.type_class); + } } } } @@ -1300,7 +1311,7 @@ void CSharpLanguage::_on_scripts_domain_unloaded() { } #endif - scripts_metadata_invalidated = true; + dotnet_script_lookup_map.clear(); } #ifdef TOOLS_ENABLED @@ -3356,45 +3367,34 @@ Error CSharpScript::reload(bool p_keep_state) { GD_MONO_SCOPE_THREAD_ATTACH; - GDMonoAssembly *project_assembly = GDMono::get_singleton()->get_project_assembly(); - - if (project_assembly) { - const Variant *script_metadata_var = CSharpLanguage::get_singleton()->get_scripts_metadata().getptr(get_path()); - if (script_metadata_var) { - Dictionary script_metadata = script_metadata_var->operator Dictionary()["class"]; - const Variant *namespace_ = script_metadata.getptr("namespace"); - const Variant *class_name = script_metadata.getptr("class_name"); - ERR_FAIL_NULL_V(namespace_, ERR_BUG); - ERR_FAIL_NULL_V(class_name, ERR_BUG); - GDMonoClass *klass = project_assembly->get_class(namespace_->operator String(), class_name->operator String()); - if (klass && CACHED_CLASS(GodotObject)->is_assignable_from(klass)) { - script_class = klass; - } - } else { - // Missing script metadata. Fallback to legacy method - script_class = project_assembly->get_object_derived_class(name); + const DotNetScriptLookupInfo *lookup_info = + CSharpLanguage::get_singleton()->lookup_dotnet_script(get_path()); + + if (lookup_info) { + GDMonoClass *klass = lookup_info->script_class; + if (klass) { + ERR_FAIL_COND_V(!CACHED_CLASS(GodotObject)->is_assignable_from(klass), FAILED); + script_class = klass; } + } - valid = script_class != nullptr; + valid = script_class != nullptr; - if (script_class) { + if (script_class) { #ifdef DEBUG_ENABLED - print_verbose("Found class " + script_class->get_full_name() + " for script " + get_path()); + print_verbose("Found class " + script_class->get_full_name() + " for script " + get_path()); #endif - native = GDMonoUtils::get_class_native_base(script_class); + native = GDMonoUtils::get_class_native_base(script_class); - CRASH_COND(native == nullptr); + CRASH_COND(native == nullptr); - update_script_class_info(this); + update_script_class_info(this); - _update_exports(); - } - - return OK; + _update_exports(); } - return ERR_FILE_MISSING_DEPENDENCIES; + return OK; } ScriptLanguage *CSharpScript::get_language() const { diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index a31135cd32..40f7ed4552 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -66,6 +66,18 @@ TScriptInstance *cast_script_instance(ScriptInstance *p_inst) { #define CAST_CSHARP_INSTANCE(m_inst) (cast_script_instance<CSharpInstance, CSharpLanguage>(m_inst)) +struct DotNetScriptLookupInfo { + String class_namespace; + String class_name; + GDMonoClass *script_class = nullptr; + + DotNetScriptLookupInfo() {} // Required by HashMap... + + DotNetScriptLookupInfo(const String &p_class_namespace, const String &p_class_name, GDMonoClass *p_script_class) : + class_namespace(p_class_namespace), class_name(p_class_name), script_class(p_script_class) { + } +}; + class CSharpScript : public Script { GDCLASS(CSharpScript, Script); @@ -390,16 +402,15 @@ class CSharpLanguage : public ScriptLanguage { int lang_idx = -1; - Dictionary scripts_metadata; - bool scripts_metadata_invalidated = true; + HashMap<String, DotNetScriptLookupInfo> dotnet_script_lookup_map; + + void lookup_script_for_class(GDMonoClass *p_class); // For debug_break and debug_break_parse int _debug_parse_err_line = -1; String _debug_parse_err_file; String _debug_error; - void _load_scripts_metadata(); - friend class GDMono; void _on_scripts_domain_unloaded(); @@ -436,18 +447,13 @@ public: void reload_assemblies(bool p_soft_reload); #endif - _FORCE_INLINE_ Dictionary get_scripts_metadata_or_nothing() { - return scripts_metadata_invalidated ? Dictionary() : scripts_metadata; - } + _FORCE_INLINE_ ManagedCallableMiddleman *get_managed_callable_middleman() const { return managed_callable_middleman; } - _FORCE_INLINE_ const Dictionary &get_scripts_metadata() { - if (scripts_metadata_invalidated) { - _load_scripts_metadata(); - } - return scripts_metadata; - } + void lookup_scripts_in_assembly(GDMonoAssembly *p_assembly); - _FORCE_INLINE_ ManagedCallableMiddleman *get_managed_callable_middleman() const { return managed_callable_middleman; } + const DotNetScriptLookupInfo *lookup_dotnet_script(const String &p_script_path) const { + return dotnet_script_lookup_map.getptr(p_script_path); + } String get_name() const override; diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk.sln b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk.sln index 56c0cb7703..d1868f52ef 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk.sln +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk.sln @@ -2,6 +2,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Godot.NET.Sdk", "Godot.NET.Sdk\Godot.NET.Sdk.csproj", "{31B00BFA-DEA1-42FA-A472-9E54A92A8A5F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Godot.SourceGenerators", "Godot.SourceGenerators\Godot.SourceGenerators.csproj", "{32D31B23-2A45-4099-B4F5-95B4C8FF7D9F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Godot.SourceGenerators.Sample", "Godot.SourceGenerators.Sample\Godot.SourceGenerators.Sample.csproj", "{7297A614-8DF5-43DE-9EAD-99671B26BD1F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotSharp", "..\..\glue\GodotSharp\GodotSharp\GodotSharp.csproj", "{AEBF0036-DA76-4341-B651-A3F2856AB2FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -12,5 +18,17 @@ Global {31B00BFA-DEA1-42FA-A472-9E54A92A8A5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {31B00BFA-DEA1-42FA-A472-9E54A92A8A5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {31B00BFA-DEA1-42FA-A472-9E54A92A8A5F}.Release|Any CPU.Build.0 = Release|Any CPU + {32D31B23-2A45-4099-B4F5-95B4C8FF7D9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32D31B23-2A45-4099-B4F5-95B4C8FF7D9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32D31B23-2A45-4099-B4F5-95B4C8FF7D9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32D31B23-2A45-4099-B4F5-95B4C8FF7D9F}.Release|Any CPU.Build.0 = Release|Any CPU + {7297A614-8DF5-43DE-9EAD-99671B26BD1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7297A614-8DF5-43DE-9EAD-99671B26BD1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7297A614-8DF5-43DE-9EAD-99671B26BD1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7297A614-8DF5-43DE-9EAD-99671B26BD1F}.Release|Any CPU.Build.0 = Release|Any CPU + {AEBF0036-DA76-4341-B651-A3F2856AB2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEBF0036-DA76-4341-B651-A3F2856AB2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEBF0036-DA76-4341-B651-A3F2856AB2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEBF0036-DA76-4341-B651-A3F2856AB2FA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj index 8304d9e321..ef8add0ba8 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.csproj @@ -8,43 +8,33 @@ <PackageId>Godot.NET.Sdk</PackageId> <Version>4.0.0</Version> - <PackageProjectUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk</PackageProjectUrl> + <PackageVersion>$(PackageVersion_Godot_NET_Sdk)</PackageVersion> + <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk</RepositoryUrl> + <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> <PackageType>MSBuildSdk</PackageType> <PackageTags>MSBuildSdk</PackageTags> + <PackageLicenseExpression>MIT</PackageLicenseExpression> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> - </PropertyGroup> - <PropertyGroup> - <NuspecFile>Godot.NET.Sdk.nuspec</NuspecFile> - <GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);SetNuSpecProperties</GenerateNuspecDependsOn> + <!-- Exclude target framework from the package dependencies as we don't include the build output --> + <SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking> + <IncludeBuildOutput>false</IncludeBuildOutput> </PropertyGroup> - <Target Name="ReadGodotNETSdkVersion" BeforeTargets="BeforeBuild;BeforeRebuild;CoreCompile"> - <PropertyGroup> - <PackageVersion>$([System.IO.File]::ReadAllText('$(ProjectDir)Godot.NET.Sdk_PackageVersion.txt').Trim())</PackageVersion> - </PropertyGroup> - </Target> + <ItemGroup> + <!-- Package Sdk\Sdk.props and Sdk\Sdk.targets file --> + <None Include="Sdk\Sdk.props" Pack="true" PackagePath="Sdk" Visible="false" /> + <None Include="Sdk\Sdk.targets" Pack="true" PackagePath="Sdk" Visible="false" /> + <!-- SdkPackageVersions.props --> - <Target Name="SetNuSpecProperties" Condition=" Exists('$(NuspecFile)') " DependsOnTargets="ReadGodotNETSdkVersion"> - <PropertyGroup> - <NuspecProperties> - id=$(PackageId); - description=$(Description); - authors=$(Authors); - version=$(PackageVersion); - packagetype=$(PackageType); - tags=$(PackageTags); - projecturl=$(PackageProjectUrl) - </NuspecProperties> - </PropertyGroup> - </Target> + <None Include="..\..\..\SdkPackageVersions.props" Pack="true" PackagePath="Sdk" Visible="false" /> + </ItemGroup> <Target Name="CopyNupkgToSConsOutputDir" AfterTargets="Pack"> <PropertyGroup> <GodotSourceRootPath>$(SolutionDir)\..\..\..\..\</GodotSourceRootPath> <GodotOutputDataDir>$(GodotSourceRootPath)\bin\GodotSharp\</GodotOutputDataDir> </PropertyGroup> - <Copy SourceFiles="$(OutputPath)$(PackageId).$(PackageVersion).nupkg" - DestinationFolder="$(GodotOutputDataDir)Tools\nupkgs\" /> + <Copy SourceFiles="$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg" DestinationFolder="$(GodotOutputDataDir)Tools\nupkgs\" /> </Target> </Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.nuspec b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.nuspec deleted file mode 100644 index ba68a4da43..0000000000 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk.nuspec +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<package xmlns="http://schemas.microsoft.com/packaging/2011/10/nuspec.xsd"> - <metadata> - <id>$id$</id> - <version>$version$</version> - <description>$description$</description> - <authors>$authors$</authors> - <owners>$authors$</owners> - <projectUrl>$projecturl$</projectUrl> - <requireLicenseAcceptance>false</requireLicenseAcceptance> - <license type="expression">MIT</license> - <licenseUrl>https://licenses.nuget.org/MIT</licenseUrl> - <tags>$tags$</tags> - <packageTypes> - <packageType name="$packagetype$" /> - </packageTypes> - <repository url="$projecturl$" /> - </metadata> - <files> - <file src="Sdk\**" target="Sdk" /> - </files> -</package> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk_PackageVersion.txt b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk_PackageVersion.txt deleted file mode 100644 index 34749489b9..0000000000 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Godot.NET.Sdk_PackageVersion.txt +++ /dev/null @@ -1 +0,0 @@ -4.0.0-dev3 diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.props b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.props index 5febcf3175..0128f5c706 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.props +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.props @@ -1,4 +1,6 @@ <Project> + <Import Project="$(MSBuildThisFileDirectory)\SdkPackageVersions.props" /> + <PropertyGroup> <!-- Determines if we should import Microsoft.NET.Sdk, if it wasn't already imported. --> <GodotSdkImportsMicrosoftNetSdk Condition=" '$(UsingMicrosoftNETSdk)' != 'true' ">true</GodotSdkImportsMicrosoftNetSdk> @@ -94,6 +96,7 @@ <DefineConstants>$(GodotDefineConstants);$(DefineConstants)</DefineConstants> </PropertyGroup> + <!-- Godot API references --> <ItemGroup> <!-- TODO: diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets index f5afd75505..92e299d2f3 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets @@ -14,4 +14,9 @@ --> <DefineConstants Condition=" '$(GodotRealTIsDouble)' == 'true' ">GODOT_REAL_T_IS_DOUBLE;$(DefineConstants)</DefineConstants> </PropertyGroup> + + <!-- C# source generators --> + <ItemGroup Condition=" '$(DisableImplicitGodotGeneratorReferences)' != 'true' "> + <PackageReference Include="Godot.SourceGenerators" Version="$(PackageVersion_Godot_SourceGenerators)" /> + </ItemGroup> </Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Bar.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Bar.cs new file mode 100644 index 0000000000..5eaebc4474 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Bar.cs @@ -0,0 +1,15 @@ +namespace Godot.SourceGenerators.Sample +{ + partial class Bar : Godot.Object + { + } + + // Foo in another file + partial class Foo + { + } + + partial class NotSameNameAsFile : Godot.Object + { + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Foo.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Foo.cs new file mode 100644 index 0000000000..21a5bfe560 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Foo.cs @@ -0,0 +1,11 @@ +namespace Godot.SourceGenerators.Sample +{ + partial class Foo : Godot.Object + { + } + + // Foo again in the same file + partial class Foo + { + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Godot.SourceGenerators.Sample.csproj b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Godot.SourceGenerators.Sample.csproj new file mode 100644 index 0000000000..24f7909861 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Godot.SourceGenerators.Sample.csproj @@ -0,0 +1,31 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netstandard2.1</TargetFramework> + </PropertyGroup> + + <PropertyGroup> + <!-- $(GodotProjectDir) would normally be defined by the Godot.NET.Sdk --> + <GodotProjectDir>$(MSBuildProjectDirectory)</GodotProjectDir> + </PropertyGroup> + + <PropertyGroup> + <!-- The emitted files are not part of the compilation nor design. + They're only for peeking at the generated sources. Sometimes the + emitted files get corrupted, but that won't break anything. --> + <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> + <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GeneratedFiles</CompilerGeneratedFilesOutputPath> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\..\glue\GodotSharp\GodotSharp\GodotSharp.csproj"> + <Private>False</Private> + </ProjectReference> + <ProjectReference Include="..\Godot.SourceGenerators\Godot.SourceGenerators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" /> + </ItemGroup> + + <!-- This file is imported automatically when using PackageReference to + reference Godot.SourceGenerators, but not when using ProjectReference --> + <Import Project="..\Godot.SourceGenerators\Godot.SourceGenerators.props" /> + +</Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Common.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Common.cs new file mode 100644 index 0000000000..4867c986e6 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Common.cs @@ -0,0 +1,33 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Godot.SourceGenerators +{ + public static class Common + { + public static void ReportNonPartialGodotScriptClass( + GeneratorExecutionContext context, + ClassDeclarationSyntax cds, INamedTypeSymbol symbol + ) + { + string message = + "Missing partial modifier on declaration of type '" + + $"{symbol.FullQualifiedName()}' which is a subclass of '{GodotClasses.Object}'"; + + string description = $"{message}. Subclasses of '{GodotClasses.Object}' must be " + + "declared with the partial modifier or annotated with the " + + $"attribute '{GodotClasses.DisableGodotGeneratorsAttr}'."; + + context.ReportDiagnostic(Diagnostic.Create( + new DiagnosticDescriptor(id: "GODOT-G0001", + title: message, + messageFormat: message, + category: "Usage", + DiagnosticSeverity.Error, + isEnabledByDefault: true, + description), + cds.GetLocation(), + cds.SyntaxTree.FilePath)); + } + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs new file mode 100644 index 0000000000..c3e74822d5 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ExtensionMethods.cs @@ -0,0 +1,86 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Godot.SourceGenerators +{ + static class ExtensionMethods + { + public static bool TryGetGlobalAnalyzerProperty( + this GeneratorExecutionContext context, string property, out string? value + ) => context.AnalyzerConfigOptions.GlobalOptions + .TryGetValue("build_property." + property, out value); + + private static bool InheritsFrom(this INamedTypeSymbol? symbol, string baseName) + { + if (symbol == null) + return false; + + while (true) + { + if (symbol.ToString() == baseName) + { + return true; + } + + if (symbol.BaseType != null) + { + symbol = symbol.BaseType; + continue; + } + + break; + } + + return false; + } + + private static bool IsGodotScriptClass( + this ClassDeclarationSyntax cds, Compilation compilation, + out INamedTypeSymbol? symbol + ) + { + var sm = compilation.GetSemanticModel(cds.SyntaxTree); + + var classTypeSymbol = sm.GetDeclaredSymbol(cds); + + if (classTypeSymbol?.BaseType == null + || !classTypeSymbol.BaseType.InheritsFrom(GodotClasses.Object)) + { + symbol = null; + return false; + } + + symbol = classTypeSymbol; + return true; + } + + public static IEnumerable<(ClassDeclarationSyntax cds, INamedTypeSymbol symbol)> SelectGodotScriptClasses( + this IEnumerable<ClassDeclarationSyntax> source, + Compilation compilation + ) + { + foreach (var cds in source) + { + if (cds.IsGodotScriptClass(compilation, out var symbol)) + yield return (cds, symbol!); + } + } + + public static bool IsPartial(this ClassDeclarationSyntax cds) + => cds.Modifiers.Any(SyntaxKind.PartialKeyword); + + public static bool HasDisableGeneratorsAttribute(this INamedTypeSymbol symbol) + => symbol.GetAttributes().Any(attr => + attr.AttributeClass?.ToString() == GodotClasses.DisableGodotGeneratorsAttr); + + private static SymbolDisplayFormat FullyQualifiedFormatOmitGlobal { get; } = + SymbolDisplayFormat.FullyQualifiedFormat + .WithGlobalNamespaceStyle(SymbolDisplayGlobalNamespaceStyle.Omitted); + + public static string FullQualifiedName(this INamedTypeSymbol symbol) + => symbol.ToDisplayString(NullableFlowState.NotNull, FullyQualifiedFormatOmitGlobal); + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj new file mode 100644 index 0000000000..224d7e5b5a --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.csproj @@ -0,0 +1,40 @@ +<Project Sdk="Microsoft.NET.Sdk"> + <PropertyGroup> + <TargetFramework>netstandard2.0</TargetFramework> + <LangVersion>8.0</LangVersion> + <Nullable>enable</Nullable> + </PropertyGroup> + <PropertyGroup> + <Description>Core C# source generator for Godot projects.</Description> + <Authors>Godot Engine contributors</Authors> + + <PackageId>Godot.SourceGenerators</PackageId> + <Version>4.0.0</Version> + <PackageVersion>$(PackageVersion_Godot_SourceGenerators)</PackageVersion> + <RepositoryUrl>https://github.com/godotengine/godot/tree/master/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators</RepositoryUrl> + <PackageProjectUrl>$(RepositoryUrl)</PackageProjectUrl> + <PackageLicenseExpression>MIT</PackageLicenseExpression> + + <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <!-- Generates a package at build --> + <IncludeBuildOutput>false</IncludeBuildOutput> <!-- Do not include the generator as a lib dependency --> + </PropertyGroup> + <ItemGroup> + <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.8.0" PrivateAssets="all" /> + <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.1" PrivateAssets="all" /> + </ItemGroup> + <ItemGroup> + <!-- Package the generator in the analyzer directory of the nuget package --> + <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> + + <!-- Package the props file --> + <None Include="Godot.SourceGenerators.props" Pack="true" PackagePath="build" Visible="false" /> + </ItemGroup> + + <Target Name="CopyNupkgToSConsOutputDir" AfterTargets="Pack"> + <PropertyGroup> + <GodotSourceRootPath>$(SolutionDir)\..\..\..\..\</GodotSourceRootPath> + <GodotOutputDataDir>$(GodotSourceRootPath)\bin\GodotSharp\</GodotOutputDataDir> + </PropertyGroup> + <Copy SourceFiles="$(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg" DestinationFolder="$(GodotOutputDataDir)Tools\nupkgs\" /> + </Target> +</Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.props b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.props new file mode 100644 index 0000000000..f9b47ad5b1 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/Godot.SourceGenerators.props @@ -0,0 +1,7 @@ +<Project> + <ItemGroup> + <!-- $(GodotProjectDir) is defined by Godot.NET.Sdk --> + <CompilerVisibleProperty Include="GodotProjectDir" /> + <CompilerVisibleProperty Include="GodotScriptPathAttributeGenerator" /> + </ItemGroup> +</Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotClasses.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotClasses.cs new file mode 100644 index 0000000000..29e41d155a --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotClasses.cs @@ -0,0 +1,9 @@ +namespace Godot.SourceGenerators +{ + public static class GodotClasses + { + public const string Object = "Godot.Object"; + public const string DisableGodotGeneratorsAttr = "Godot.DisableGodotGeneratorsAttribute"; + public const string AssemblyHasScriptsAttr = "Godot.AssemblyHasScriptsAttribute"; + } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs new file mode 100644 index 0000000000..150e59e414 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; + +namespace Godot.SourceGenerators +{ + [Generator] + public class ScriptPathAttributeGenerator : ISourceGenerator + { + public void Execute(GeneratorExecutionContext context) + { + if (context.TryGetGlobalAnalyzerProperty("GodotScriptPathAttributeGenerator", out string? toggle) + && toggle == "disabled") + { + return; + } + + // NOTE: IsNullOrEmpty doesn't work well with nullable checks + // ReSharper disable once ReplaceWithStringIsNullOrEmpty + if (!context.TryGetGlobalAnalyzerProperty("GodotProjectDir", out string? godotProjectDir) + || godotProjectDir!.Length == 0) + { + throw new InvalidOperationException("Property 'GodotProjectDir' is null or empty."); + } + + var godotClasses = context.Compilation.SyntaxTrees + .SelectMany(tree => + tree.GetRoot().DescendantNodes() + .OfType<ClassDeclarationSyntax>() + // Ignore inner classes + .Where(cds => !(cds.Parent is ClassDeclarationSyntax)) + .SelectGodotScriptClasses(context.Compilation) + // Report and skip non-partial classes + .Where(x => + { + if (x.cds.IsPartial() || x.symbol.HasDisableGeneratorsAttribute()) + return true; + Common.ReportNonPartialGodotScriptClass(context, x.cds, x.symbol); + return false; + }) + ) + // Ignore classes whose name is not the same as the file name + .Where(x => Path.GetFileNameWithoutExtension(x.cds.SyntaxTree.FilePath) == x.symbol.Name) + .GroupBy(x => x.symbol) + .ToDictionary(g => g.Key, g => g.Select(x => x.cds)); + + foreach (var godotClass in godotClasses) + { + VisitGodotScriptClass(context, godotProjectDir, + symbol: godotClass.Key, + classDeclarations: godotClass.Value); + } + + if (godotClasses.Count <= 0) + return; + + AddScriptTypesAssemblyAttr(context, godotClasses); + } + + private static void VisitGodotScriptClass( + GeneratorExecutionContext context, + string godotProjectDir, + INamedTypeSymbol symbol, + IEnumerable<ClassDeclarationSyntax> classDeclarations + ) + { + var attributesBuilder = new StringBuilder(); + + // Remember syntax trees for which we already added an attribute, to prevent unnecessary duplicates. + var attributedTrees = new List<SyntaxTree>(); + + foreach (var cds in classDeclarations) + { + if (attributedTrees.Contains(cds.SyntaxTree)) + continue; + + attributedTrees.Add(cds.SyntaxTree); + + if (attributesBuilder.Length != 0) + attributesBuilder.Append("\n "); + + attributesBuilder.Append(@"[ScriptPathAttribute(""res://"); + attributesBuilder.Append(RelativeToDir(cds.SyntaxTree.FilePath, godotProjectDir)); + attributesBuilder.Append(@""")]"); + } + + string classNs = symbol.ContainingNamespace.Name; + string className = symbol.Name; + + var source = $@"using Godot; +namespace {classNs} +{{ + {attributesBuilder} + partial class {className} + {{ + }} +}} +"; + context.AddSource(classNs + "." + className + "_ScriptPath_Generated", + SourceText.From(source, Encoding.UTF8)); + } + + private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context, + Dictionary<INamedTypeSymbol, IEnumerable<ClassDeclarationSyntax>> godotClasses) + { + var sourceBuilder = new StringBuilder(); + + sourceBuilder.Append("[assembly:"); + sourceBuilder.Append(GodotClasses.AssemblyHasScriptsAttr); + sourceBuilder.Append("(new System.Type[] {"); + + bool first = true; + + foreach (var godotClass in godotClasses) + { + var qualifiedName = godotClass.Key.ToDisplayString( + NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat); + if (!first) + sourceBuilder.Append(", "); + first = false; + sourceBuilder.Append("typeof("); + sourceBuilder.Append(qualifiedName); + sourceBuilder.Append(")"); + } + + sourceBuilder.Append("})]\n"); + + context.AddSource("AssemblyScriptTypes_Generated", + SourceText.From(sourceBuilder.ToString(), Encoding.UTF8)); + } + + public void Initialize(GeneratorInitializationContext context) + { + } + + private static string RelativeToDir(string path, string dir) + { + // Make sure the directory ends with a path separator + dir = Path.Combine(dir, " ").TrimEnd(); + + if (Path.DirectorySeparatorChar == '\\') + dir = dir.Replace("/", "\\") + "\\"; + + var fullPath = new Uri(Path.GetFullPath(path), UriKind.Absolute); + var relRoot = new Uri(Path.GetFullPath(dir), UriKind.Absolute); + + // MakeRelativeUri converts spaces to %20, hence why we need UnescapeDataString + return Uri.UnescapeDataString(relRoot.MakeRelativeUri(fullPath).ToString()); + } + } +} diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs index 4e2c0f17cc..cdac9acb25 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs @@ -1,11 +1,5 @@ using System; -using GodotTools.Core; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; using Microsoft.Build.Construction; -using Microsoft.Build.Globbing; namespace GodotTools.ProjectEditor { @@ -31,47 +25,6 @@ namespace GodotTools.ProjectEditor return root != null ? new MSBuildProject(root) : null; } - private static List<string> GetAllFilesRecursive(string rootDirectory, string mask) - { - string[] files = Directory.GetFiles(rootDirectory, mask, SearchOption.AllDirectories); - - // We want relative paths - for (int i = 0; i < files.Length; i++) - { - files[i] = files[i].RelativeToPath(rootDirectory); - } - - return new List<string>(files); - } - - // NOTE: Assumes auto-including items. Only used by the scripts metadata generator, which will be replaced with source generators in the future. - public static IEnumerable<string> GetIncludeFiles(string projectPath, string itemType) - { - var excluded = new List<string>(); - var includedFiles = GetAllFilesRecursive(Path.GetDirectoryName(projectPath), "*.cs"); - - var root = ProjectRootElement.Open(projectPath); - Debug.Assert(root != null); - - foreach (var item in root.Items) - { - if (string.IsNullOrEmpty(item.Condition)) - continue; - - if (item.ItemType != itemType) - continue; - - string normalizedRemove = item.Remove.NormalizePath(); - - var glob = MSBuildGlob.Parse(normalizedRemove); - excluded.AddRange(includedFiles.Where(includedFile => glob.IsMatch(includedFile))); - } - - includedFiles.RemoveAll(f => excluded.Contains(f)); - - return includedFiles; - } - public static void MigrateToProjectSdksStyle(MSBuildProject project, string projectName) { var origRoot = project.Root; diff --git a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets index 1d382dcb43..aab2d73bdd 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets +++ b/modules/mono/editor/GodotTools/GodotTools.Shared/GenerateGodotNupkgsVersions.targets @@ -3,7 +3,6 @@ <Target Name="SetPropertiesForGenerateGodotNupkgsVersions"> <PropertyGroup> - <GodotNETSdkPackageVersionFile>$(SolutionDir)..\Godot.NET.Sdk\Godot.NET.Sdk\Godot.NET.Sdk_PackageVersion.txt</GodotNETSdkPackageVersionFile> <GeneratedGodotNupkgsVersionsFile>$(IntermediateOutputPath)GodotNupkgsVersions.g.cs</GeneratedGodotNupkgsVersionsFile> </PropertyGroup> </Target> @@ -18,13 +17,14 @@ </Target> <Target Name="_GenerateGodotNupkgsVersionsFile" DependsOnTargets="SetPropertiesForGenerateGodotNupkgsVersions" - Inputs="$(MSBuildProjectFile);@(GodotNETSdkPackageVersionFile)" + Inputs="$(MSBuildProjectFile);$(MSBuildThisFileDirectory);$(MSBuildProjectFile)\..\..\..\SdkPackageVersions.props" Outputs="$(GeneratedGodotNupkgsVersionsFile)"> <PropertyGroup> <GenerateGodotNupkgsVersionsCode><![CDATA[ namespace $(RootNamespace) { public class GeneratedGodotNupkgsVersions { - public const string GodotNETSdk = "$([System.IO.File]::ReadAllText('$(GodotNETSdkPackageVersionFile)').Trim())"%3b + public const string GodotNETSdk = "$(PackageVersion_Godot_NET_Sdk)"%3b + public const string GodotSourceGenerators = "$(PackageVersion_Godot_SourceGenerators)"%3b } } ]]></GenerateGodotNupkgsVersionsCode> diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs index b96b0c8175..2b6f972529 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs @@ -218,43 +218,12 @@ namespace GodotTools.Build Godot.GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message); } - GenerateEditorScriptMetadata(); - if (GodotSharpEditor.Instance.SkipBuildBeforePlaying) return true; // Requested play from an external editor/IDE which already built the project return BuildProjectBlocking("Debug"); } - // NOTE: This will be replaced with C# source generators in 4.0 - public static void GenerateEditorScriptMetadata() - { - string editorScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor"); - string playerScriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, "scripts_metadata.editor_player"); - - CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, editorScriptsMetadataPath); - - if (!File.Exists(editorScriptsMetadataPath)) - return; - - try - { - File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath); - } - catch (IOException e) - { - throw new IOException("Failed to copy scripts metadata file.", innerException: e); - } - } - - // NOTE: This will be replaced with C# source generators in 4.0 - public static string GenerateExportedGameScriptMetadata(bool isDebug) - { - string scriptsMetadataPath = Path.Combine(GodotSharpDirs.ResMetadataDir, $"scripts_metadata.{(isDebug ? "debug" : "release")}"); - CsProjOperations.GenerateScriptsMetadata(GodotSharpDirs.ProjectCsProjPath, scriptsMetadataPath); - return scriptsMetadataPath; - } - public static void Initialize() { // Build tool settings diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs index 708ec73454..ed69c2b833 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs @@ -43,8 +43,6 @@ namespace GodotTools.Build GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message); } - BuildManager.GenerateEditorScriptMetadata(); - if (!BuildManager.BuildProjectBlocking("Debug")) return; // Build failed @@ -74,8 +72,6 @@ namespace GodotTools.Build GD.PushError("Failed to setup Godot NuGet Offline Packages: " + e.Message); } - BuildManager.GenerateEditorScriptMetadata(); - if (!BuildManager.BuildProjectBlocking("Debug", targets: new[] {"Rebuild"})) return; // Build failed diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs index 793ef7fd71..16dd1c8c6b 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/NuGetUtils.cs @@ -290,7 +290,8 @@ namespace GodotTools.Build private static readonly (string packageId, string packageVersion)[] PackagesToAdd = { - ("Godot.NET.Sdk", GeneratedGodotNupkgsVersions.GodotNETSdk) + ("Godot.NET.Sdk", GeneratedGodotNupkgsVersions.GodotNETSdk), + ("Godot.SourceGenerators", GeneratedGodotNupkgsVersions.GodotSourceGenerators), }; } } diff --git a/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs b/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs index 1d800b8151..e43f10804d 100644 --- a/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs +++ b/modules/mono/editor/GodotTools/GodotTools/CsProjOperations.cs @@ -1,11 +1,6 @@ using Godot; using System; -using System.Linq; -using Godot.Collections; -using GodotTools.Internals; using GodotTools.ProjectEditor; -using File = GodotTools.Utils.File; -using Directory = GodotTools.Utils.Directory; namespace GodotTools { @@ -23,86 +18,5 @@ namespace GodotTools return string.Empty; } } - - private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); - - private static ulong ConvertToTimestamp(this DateTime value) - { - TimeSpan elapsedTime = value - Epoch; - return (ulong)elapsedTime.TotalSeconds; - } - - private static bool TryParseFileMetadata(string includeFile, ulong modifiedTime, out Dictionary fileMetadata) - { - fileMetadata = null; - - var parseError = ScriptClassParser.ParseFile(includeFile, out var classes, out string errorStr); - - if (parseError != Error.Ok) - { - GD.PushError($"Failed to determine namespace and class for script: {includeFile}. Parse error: {errorStr ?? parseError.ToString()}"); - return false; - } - - string searchName = System.IO.Path.GetFileNameWithoutExtension(includeFile); - - var firstMatch = classes.FirstOrDefault(classDecl => - classDecl.BaseCount != 0 && // If it doesn't inherit anything, it can't be a Godot.Object. - classDecl.SearchName == searchName // Filter by the name we're looking for - ); - - if (firstMatch == null) - return false; // Not found - - fileMetadata = new Dictionary - { - ["modified_time"] = $"{modifiedTime}", - ["class"] = new Dictionary - { - ["namespace"] = firstMatch.Namespace, - ["class_name"] = firstMatch.Name, - ["nested"] = firstMatch.Nested - } - }; - - return true; - } - - public static void GenerateScriptsMetadata(string projectPath, string outputPath) - { - var metadataDict = Internal.GetScriptsMetadataOrNothing().Duplicate(); - - bool IsUpToDate(string includeFile, ulong modifiedTime) - { - return metadataDict.TryGetValue(includeFile, out var oldFileVar) && - ulong.TryParse(((Dictionary)oldFileVar)["modified_time"] as string, - out ulong storedModifiedTime) && storedModifiedTime == modifiedTime; - } - - var outdatedFiles = ProjectUtils.GetIncludeFiles(projectPath, "Compile") - .Select(path => ("res://" + path).SimplifyGodotPath()) - .ToDictionary(path => path, path => File.GetLastWriteTime(path).ConvertToTimestamp()) - .Where(pair => !IsUpToDate(includeFile: pair.Key, modifiedTime: pair.Value)) - .ToArray(); - - foreach (var pair in outdatedFiles) - { - metadataDict.Remove(pair.Key); - - string includeFile = pair.Key; - - if (TryParseFileMetadata(includeFile, modifiedTime: pair.Value, out var fileMetadata)) - metadataDict[includeFile] = fileMetadata; - } - - string json = metadataDict.Count <= 0 ? "{}" : JSON.Print(metadataDict); - - string baseDir = outputPath.GetBaseDir(); - - if (!Directory.Exists(baseDir)) - Directory.CreateDirectory(baseDir); - - File.WriteAllText(outputPath, json); - } } } diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs index e9bb701562..270be8b6bf 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs @@ -157,9 +157,6 @@ namespace GodotTools.Export string buildConfig = isDebug ? "ExportDebug" : "ExportRelease"; - string scriptsMetadataPath = BuildManager.GenerateExportedGameScriptMetadata(isDebug); - AddFile(scriptsMetadataPath, scriptsMetadataPath); - if (!BuildManager.BuildProjectBlocking(buildConfig, platform: platform)) throw new Exception("Failed to build project"); diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs index 7e5049e4b7..77370090ec 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Internal.cs @@ -1,7 +1,5 @@ -using System; using System.Runtime.CompilerServices; using Godot; -using Godot.Collections; using GodotTools.IdeMessaging.Requests; namespace GodotTools.Internals @@ -42,9 +40,6 @@ namespace GodotTools.Internals public static void EditorNodeShowScriptScreen() => internal_EditorNodeShowScriptScreen(); - public static Dictionary<string, object> GetScriptsMetadataOrNothing() => - internal_GetScriptsMetadataOrNothing(typeof(Dictionary<string, object>)); - public static string MonoWindowsInstallRoot => internal_MonoWindowsInstallRoot(); public static void EditorRunPlay() => internal_EditorRunPlay(); @@ -101,9 +96,6 @@ namespace GodotTools.Internals private static extern void internal_EditorNodeShowScriptScreen(); [MethodImpl(MethodImplOptions.InternalCall)] - private static extern Dictionary<string, object> internal_GetScriptsMetadataOrNothing(Type dictType); - - [MethodImpl(MethodImplOptions.InternalCall)] private static extern string internal_MonoWindowsInstallRoot(); [MethodImpl(MethodImplOptions.InternalCall)] diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/ScriptClassParser.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/ScriptClassParser.cs deleted file mode 100644 index c72a84c513..0000000000 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/ScriptClassParser.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using Godot; -using Godot.Collections; - -namespace GodotTools.Internals -{ - public static class ScriptClassParser - { - public class ClassDecl - { - public string Name { get; } - public string Namespace { get; } - public bool Nested { get; } - public long BaseCount { get; } - - public string SearchName => Nested ? - Name.Substring(Name.LastIndexOf(".", StringComparison.Ordinal) + 1) : - Name; - - public ClassDecl(string name, string @namespace, bool nested, long baseCount) - { - Name = name; - Namespace = @namespace; - Nested = nested; - BaseCount = baseCount; - } - } - - [MethodImpl(MethodImplOptions.InternalCall)] - private static extern Error internal_ParseFile(string filePath, Array<Dictionary> classes, out string errorStr); - - public static Error ParseFile(string filePath, out IEnumerable<ClassDecl> classes, out string errorStr) - { - var classesArray = new Array<Dictionary>(); - var error = internal_ParseFile(filePath, classesArray, out errorStr); - if (error != Error.Ok) - { - classes = null; - return error; - } - - var classesList = new List<ClassDecl>(); - - foreach (var classDeclDict in classesArray) - { - classesList.Add(new ClassDecl( - (string)classDeclDict["name"], - (string)classDeclDict["namespace"], - (bool)classDeclDict["nested"], - (long)classDeclDict["base_count"] - )); - } - - classes = classesList; - - return Error.Ok; - } - } -} diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 667e4a3879..21efd58938 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -49,7 +49,6 @@ #include "../utils/osx_utils.h" #include "code_completion.h" #include "godotsharp_export.h" -#include "script_class_parser.h" MonoString *godot_icall_GodotSharpDirs_ResDataDir() { return GDMonoMarshal::mono_string_from_godot(GodotSharpDirs::get_res_data_dir()); @@ -172,36 +171,6 @@ MonoBoolean godot_icall_EditorProgress_Step(MonoString *p_task, MonoString *p_st return EditorNode::progress_task_step(task, state, p_step, (bool)p_force_refresh); } -int32_t godot_icall_ScriptClassParser_ParseFile(MonoString *p_filepath, MonoObject *p_classes, MonoString **r_error_str) { - *r_error_str = nullptr; - - String filepath = GDMonoMarshal::mono_string_to_godot(p_filepath); - - ScriptClassParser scp; - Error err = scp.parse_file(filepath); - if (err == OK) { - Array classes = GDMonoMarshal::mono_object_to_variant(p_classes); - const Vector<ScriptClassParser::ClassDecl> &class_decls = scp.get_classes(); - - for (int i = 0; i < class_decls.size(); i++) { - const ScriptClassParser::ClassDecl &classDecl = class_decls[i]; - - Dictionary classDeclDict; - classDeclDict["name"] = classDecl.name; - classDeclDict["namespace"] = classDecl.namespace_; - classDeclDict["nested"] = classDecl.nested; - classDeclDict["base_count"] = classDecl.base.size(); - classes.push_back(classDeclDict); - } - } else { - String error_str = scp.get_error(); - if (!error_str.is_empty()) { - *r_error_str = GDMonoMarshal::mono_string_from_godot(error_str); - } - } - return err; -} - uint32_t godot_icall_ExportPlugin_GetExportedAssemblyDependencies(MonoObject *p_initial_assemblies, MonoString *p_build_config, MonoString *p_custom_bcl_dir, MonoObject *r_assembly_dependencies) { Dictionary initial_dependencies = GDMonoMarshal::mono_object_to_variant(p_initial_assemblies); @@ -289,18 +258,6 @@ void godot_icall_Internal_EditorNodeShowScriptScreen() { EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT); } -MonoObject *godot_icall_Internal_GetScriptsMetadataOrNothing(MonoReflectionType *p_dict_reftype) { - Dictionary maybe_metadata = CSharpLanguage::get_singleton()->get_scripts_metadata_or_nothing(); - - MonoType *dict_type = mono_reflection_type_get_type(p_dict_reftype); - - int type_encoding = mono_type_get_type(dict_type); - MonoClass *type_class_raw = mono_class_from_mono_type(dict_type); - GDMonoClass *type_class = GDMono::get_singleton()->get_class(type_class_raw); - - return GDMonoMarshal::variant_to_mono_object(maybe_metadata, ManagedType(type_encoding, type_class)); -} - MonoString *godot_icall_Internal_MonoWindowsInstallRoot() { #ifdef WINDOWS_ENABLED String install_root_dir = GDMono::get_singleton()->get_mono_reg_info().install_root_dir; @@ -395,9 +352,6 @@ void register_editor_internal_calls() { GDMonoUtils::add_internal_call("GodotTools.Internals.EditorProgress::internal_Dispose", godot_icall_EditorProgress_Dispose); GDMonoUtils::add_internal_call("GodotTools.Internals.EditorProgress::internal_Step", godot_icall_EditorProgress_Step); - // ScriptClassParser - GDMonoUtils::add_internal_call("GodotTools.Internals.ScriptClassParser::internal_ParseFile", godot_icall_ScriptClassParser_ParseFile); - // ExportPlugin GDMonoUtils::add_internal_call("GodotTools.Export.ExportPlugin::internal_GetExportedAssemblyDependencies", godot_icall_ExportPlugin_GetExportedAssemblyDependencies); @@ -416,7 +370,6 @@ void register_editor_internal_calls() { GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorDebuggerNodeReloadScripts", godot_icall_Internal_EditorDebuggerNodeReloadScripts); GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_ScriptEditorEdit", godot_icall_Internal_ScriptEditorEdit); GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorNodeShowScriptScreen", godot_icall_Internal_EditorNodeShowScriptScreen); - GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GetScriptsMetadataOrNothing", godot_icall_Internal_GetScriptsMetadataOrNothing); GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_MonoWindowsInstallRoot", godot_icall_Internal_MonoWindowsInstallRoot); GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorRunPlay", godot_icall_Internal_EditorRunPlay); GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorRunStop", godot_icall_Internal_EditorRunStop); diff --git a/modules/mono/editor/script_class_parser.cpp b/modules/mono/editor/script_class_parser.cpp deleted file mode 100644 index e81cbe4ebd..0000000000 --- a/modules/mono/editor/script_class_parser.cpp +++ /dev/null @@ -1,753 +0,0 @@ -/*************************************************************************/ -/* script_class_parser.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "script_class_parser.h" - -#include "core/os/os.h" -#include "core/templates/map.h" - -#include "../utils/string_utils.h" - -const char *ScriptClassParser::token_names[ScriptClassParser::TK_MAX] = { - "[", - "]", - "{", - "}", - ".", - ":", - ",", - "Symbol", - "Identifier", - "String", - "Number", - "<", - ">", - "EOF", - "Error" -}; - -String ScriptClassParser::get_token_name(ScriptClassParser::Token p_token) { - ERR_FAIL_INDEX_V(p_token, TK_MAX, "<error>"); - return token_names[p_token]; -} - -ScriptClassParser::Token ScriptClassParser::get_token() { - while (true) { - switch (code[idx]) { - case '\n': { - line++; - idx++; - break; - }; - case 0: { - return TK_EOF; - } break; - case '{': { - idx++; - return TK_CURLY_BRACKET_OPEN; - }; - case '}': { - idx++; - return TK_CURLY_BRACKET_CLOSE; - }; - case '[': { - idx++; - return TK_BRACKET_OPEN; - }; - case ']': { - idx++; - return TK_BRACKET_CLOSE; - }; - case '<': { - idx++; - return TK_OP_LESS; - }; - case '>': { - idx++; - return TK_OP_GREATER; - }; - case ':': { - idx++; - return TK_COLON; - }; - case ',': { - idx++; - return TK_COMMA; - }; - case '.': { - idx++; - return TK_PERIOD; - }; - case '#': { - //compiler directive - while (code[idx] != '\n' && code[idx] != 0) { - idx++; - } - continue; - } break; - case '/': { - switch (code[idx + 1]) { - case '*': { // block comment - idx += 2; - while (true) { - if (code[idx] == 0) { - error_str = "Unterminated comment"; - error = true; - return TK_ERROR; - } else if (code[idx] == '*' && code[idx + 1] == '/') { - idx += 2; - break; - } else if (code[idx] == '\n') { - line++; - } - - idx++; - } - - } break; - case '/': { // line comment skip - while (code[idx] != '\n' && code[idx] != 0) { - idx++; - } - - } break; - default: { - value = "/"; - idx++; - return TK_SYMBOL; - } - } - - continue; // a comment - } break; - case '\'': - case '"': { - bool verbatim = idx != 0 && code[idx - 1] == '@'; - - char32_t begin_str = code[idx]; - idx++; - String tk_string = String(); - while (true) { - if (code[idx] == 0) { - error_str = "Unterminated String"; - error = true; - return TK_ERROR; - } else if (code[idx] == begin_str) { - if (verbatim && code[idx + 1] == '"') { // '""' is verbatim string's '\"' - idx += 2; // skip next '"' as well - continue; - } - - idx += 1; - break; - } else if (code[idx] == '\\' && !verbatim) { - //escaped characters... - idx++; - char32_t next = code[idx]; - if (next == 0) { - error_str = "Unterminated String"; - error = true; - return TK_ERROR; - } - char32_t res = 0; - - switch (next) { - case 'b': - res = 8; - break; - case 't': - res = 9; - break; - case 'n': - res = 10; - break; - case 'f': - res = 12; - break; - case 'r': - res = 13; - break; - case '\"': - res = '\"'; - break; - case '\\': - res = '\\'; - break; - default: { - res = next; - } break; - } - - tk_string += res; - - } else { - if (code[idx] == '\n') { - line++; - } - tk_string += code[idx]; - } - idx++; - } - - value = tk_string; - - return TK_STRING; - } break; - default: { - if (code[idx] <= 32) { - idx++; - break; - } - - if ((code[idx] >= 33 && code[idx] <= 47) || (code[idx] >= 58 && code[idx] <= 63) || (code[idx] >= 91 && code[idx] <= 94) || code[idx] == 96 || (code[idx] >= 123 && code[idx] <= 127)) { - value = String::chr(code[idx]); - idx++; - return TK_SYMBOL; - } - - if (code[idx] == '-' || (code[idx] >= '0' && code[idx] <= '9')) { - //a number - const char32_t *rptr; - double number = String::to_float(&code[idx], &rptr); - idx += (rptr - &code[idx]); - value = number; - return TK_NUMBER; - - } else if ((code[idx] == '@' && code[idx + 1] != '"') || code[idx] == '_' || (code[idx] >= 'A' && code[idx] <= 'Z') || (code[idx] >= 'a' && code[idx] <= 'z') || code[idx] > 127) { - String id; - - id += code[idx]; - idx++; - - while (code[idx] == '_' || (code[idx] >= 'A' && code[idx] <= 'Z') || (code[idx] >= 'a' && code[idx] <= 'z') || (code[idx] >= '0' && code[idx] <= '9') || code[idx] > 127) { - id += code[idx]; - idx++; - } - - value = id; - return TK_IDENTIFIER; - } else if (code[idx] == '@' && code[idx + 1] == '"') { - // begin of verbatim string - idx++; - } else { - error_str = "Unexpected character."; - error = true; - return TK_ERROR; - } - } - } - } -} - -Error ScriptClassParser::_skip_generic_type_params() { - Token tk; - - while (true) { - tk = get_token(); - - if (tk == TK_IDENTIFIER) { - tk = get_token(); - // Type specifications can end with "?" to denote nullable types, such as IList<int?> - if (tk == TK_SYMBOL) { - tk = get_token(); - if (value.operator String() != "?") { - error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found unexpected symbol '" + value + "'"; - error = true; - return ERR_PARSE_ERROR; - } - if (tk != TK_OP_GREATER && tk != TK_COMMA) { - error_str = "Nullable type symbol '?' is only allowed after an identifier, but found " + get_token_name(tk) + " next."; - error = true; - return ERR_PARSE_ERROR; - } - } - - if (tk == TK_PERIOD) { - while (true) { - tk = get_token(); - - if (tk != TK_IDENTIFIER) { - error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - tk = get_token(); - - if (tk != TK_PERIOD) { - break; - } - } - } - - if (tk == TK_OP_LESS) { - Error err = _skip_generic_type_params(); - if (err) { - return err; - } - tk = get_token(); - } - - if (tk == TK_OP_GREATER) { - return OK; - } else if (tk != TK_COMMA) { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - } else if (tk == TK_OP_LESS) { - error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found " + get_token_name(TK_OP_LESS); - error = true; - return ERR_PARSE_ERROR; - } else if (tk == TK_OP_GREATER) { - return OK; - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - } -} - -Error ScriptClassParser::_parse_type_full_name(String &r_full_name) { - Token tk = get_token(); - - if (tk != TK_IDENTIFIER) { - error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - r_full_name += String(value); - - if (code[idx] == '<') { - idx++; - - // We don't mind if the base is generic, but we skip it any ways since this information is not needed - Error err = _skip_generic_type_params(); - if (err) { - return err; - } - } - - if (code[idx] != '.') { // We only want to take the next token if it's a period - return OK; - } - - tk = get_token(); - - CRASH_COND(tk != TK_PERIOD); // Assertion - - r_full_name += "."; - - return _parse_type_full_name(r_full_name); -} - -Error ScriptClassParser::_parse_class_base(Vector<String> &r_base) { - String name; - - Error err = _parse_type_full_name(name); - if (err) { - return err; - } - - Token tk = get_token(); - - if (tk == TK_COMMA) { - err = _parse_class_base(r_base); - if (err) { - return err; - } - } else if (tk == TK_IDENTIFIER && String(value) == "where") { - err = _parse_type_constraints(); - if (err) { - return err; - } - - // An open curly bracket was parsed by _parse_type_constraints, so we can exit - } else if (tk == TK_CURLY_BRACKET_OPEN) { - // we are finished when we hit the open curly bracket - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - r_base.push_back(name); - - return OK; -} - -Error ScriptClassParser::_parse_type_constraints() { - Token tk = get_token(); - if (tk != TK_IDENTIFIER) { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - tk = get_token(); - if (tk != TK_COLON) { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - while (true) { - tk = get_token(); - if (tk == TK_IDENTIFIER) { - if (String(value) == "where") { - return _parse_type_constraints(); - } - - tk = get_token(); - if (tk == TK_PERIOD) { - while (true) { - tk = get_token(); - - if (tk != TK_IDENTIFIER) { - error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - tk = get_token(); - - if (tk != TK_PERIOD) { - break; - } - } - } - } - - if (tk == TK_COMMA) { - continue; - } else if (tk == TK_IDENTIFIER && String(value) == "where") { - return _parse_type_constraints(); - } else if (tk == TK_SYMBOL && String(value) == "(") { - tk = get_token(); - if (tk != TK_SYMBOL || String(value) != ")") { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - } else if (tk == TK_OP_LESS) { - Error err = _skip_generic_type_params(); - if (err) { - return err; - } - } else if (tk == TK_CURLY_BRACKET_OPEN) { - return OK; - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - } -} - -Error ScriptClassParser::_parse_namespace_name(String &r_name, int &r_curly_stack) { - Token tk = get_token(); - - if (tk == TK_IDENTIFIER) { - r_name += String(value); - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - - tk = get_token(); - - if (tk == TK_PERIOD) { - r_name += "."; - return _parse_namespace_name(r_name, r_curly_stack); - } else if (tk == TK_CURLY_BRACKET_OPEN) { - r_curly_stack++; - return OK; - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } -} - -Error ScriptClassParser::parse(const String &p_code) { - code = p_code; - idx = 0; - line = 0; - error_str = String(); - error = false; - value = Variant(); - classes.clear(); - - Token tk = get_token(); - - Map<int, NameDecl> name_stack; - int curly_stack = 0; - int type_curly_stack = 0; - - while (!error && tk != TK_EOF) { - String identifier = value; - if (tk == TK_IDENTIFIER && (identifier == "class" || identifier == "struct")) { - bool is_class = identifier == "class"; - - tk = get_token(); - - if (tk == TK_IDENTIFIER) { - String name = value; - int at_level = curly_stack; - - ClassDecl class_decl; - - for (Map<int, NameDecl>::Element *E = name_stack.front(); E; E = E->next()) { - const NameDecl &name_decl = E->value(); - - if (name_decl.type == NameDecl::NAMESPACE_DECL) { - if (E != name_stack.front()) { - class_decl.namespace_ += "."; - } - class_decl.namespace_ += name_decl.name; - } else { - class_decl.name += name_decl.name + "."; - } - } - - class_decl.name += name; - class_decl.nested = type_curly_stack > 0; - - bool generic = false; - - while (true) { - tk = get_token(); - - if (tk == TK_COLON) { - Error err = _parse_class_base(class_decl.base); - if (err) { - return err; - } - - curly_stack++; - type_curly_stack++; - - break; - } else if (tk == TK_CURLY_BRACKET_OPEN) { - curly_stack++; - type_curly_stack++; - break; - } else if (tk == TK_OP_LESS && !generic) { - generic = true; - - Error err = _skip_generic_type_params(); - if (err) { - return err; - } - } else if (tk == TK_IDENTIFIER && String(value) == "where") { - Error err = _parse_type_constraints(); - if (err) { - return err; - } - - // An open curly bracket was parsed by _parse_type_constraints, so we can exit - curly_stack++; - type_curly_stack++; - break; - } else { - error_str = "Unexpected token: " + get_token_name(tk); - error = true; - return ERR_PARSE_ERROR; - } - } - - NameDecl name_decl; - name_decl.name = name; - name_decl.type = is_class ? NameDecl::CLASS_DECL : NameDecl::STRUCT_DECL; - name_stack[at_level] = name_decl; - - if (is_class) { - if (!generic) { // no generics, thanks - classes.push_back(class_decl); - } else if (OS::get_singleton()->is_stdout_verbose()) { - String full_name = class_decl.namespace_; - if (full_name.length()) { - full_name += "."; - } - full_name += class_decl.name; - OS::get_singleton()->print("Ignoring generic class declaration: %s\n", full_name.utf8().get_data()); - } - } - } - } else if (tk == TK_IDENTIFIER && identifier == "namespace") { - if (type_curly_stack > 0) { - error_str = "Found namespace nested inside type."; - error = true; - return ERR_PARSE_ERROR; - } - - String name; - int at_level = curly_stack; - - Error err = _parse_namespace_name(name, curly_stack); - if (err) { - return err; - } - - NameDecl name_decl; - name_decl.name = name; - name_decl.type = NameDecl::NAMESPACE_DECL; - name_stack[at_level] = name_decl; - } else if (tk == TK_CURLY_BRACKET_OPEN) { - curly_stack++; - } else if (tk == TK_CURLY_BRACKET_CLOSE) { - curly_stack--; - if (name_stack.has(curly_stack)) { - if (name_stack[curly_stack].type != NameDecl::NAMESPACE_DECL) { - type_curly_stack--; - } - name_stack.erase(curly_stack); - } - } - - tk = get_token(); - } - - if (!error && tk == TK_EOF && curly_stack > 0) { - error_str = "Reached EOF with missing close curly brackets."; - error = true; - } - - if (error) { - return ERR_PARSE_ERROR; - } - - return OK; -} - -static String get_preprocessor_directive(const String &p_line, int p_from) { - CRASH_COND(p_line[p_from] != '#'); - p_from++; - int i = p_from; - while (i < p_line.length() && (p_line[i] == '_' || (p_line[i] >= 'A' && p_line[i] <= 'Z') || - (p_line[i] >= 'a' && p_line[i] <= 'z') || p_line[i] > 127)) { - i++; - } - return p_line.substr(p_from, i - p_from); -} - -static void run_dummy_preprocessor(String &r_source, const String &p_filepath) { - Vector<String> lines = r_source.split("\n", /* p_allow_empty: */ true); - - bool *include_lines = memnew_arr(bool, lines.size()); - - int if_level = -1; - Vector<bool> is_branch_being_compiled; - - for (int i = 0; i < lines.size(); i++) { - const String &line = lines[i]; - - const int line_len = line.length(); - - int j; - for (j = 0; j < line_len; j++) { - if (line[j] != ' ' && line[j] != '\t') { - if (line[j] == '#') { - // First non-whitespace char of the line is '#' - include_lines[i] = false; - - String directive = get_preprocessor_directive(line, j); - - if (directive == "if") { - if_level++; - is_branch_being_compiled.push_back(if_level == 0 || is_branch_being_compiled[if_level - 1]); - } else if (directive == "elif") { - ERR_CONTINUE_MSG(if_level == -1, "Found unexpected '#elif' directive. File: '" + p_filepath + "'."); - is_branch_being_compiled.write[if_level] = false; - } else if (directive == "else") { - ERR_CONTINUE_MSG(if_level == -1, "Found unexpected '#else' directive. File: '" + p_filepath + "'."); - is_branch_being_compiled.write[if_level] = false; - } else if (directive == "endif") { - ERR_CONTINUE_MSG(if_level == -1, "Found unexpected '#endif' directive. File: '" + p_filepath + "'."); - is_branch_being_compiled.remove(if_level); - if_level--; - } - - break; - } else { - // First non-whitespace char of the line is not '#' - include_lines[i] = if_level == -1 || is_branch_being_compiled[if_level]; - break; - } - } - } - - if (j == line_len) { - // Loop ended without finding a non-whitespace character. - // Either the line was empty or it only contained whitespaces. - include_lines[i] = if_level == -1 || is_branch_being_compiled[if_level]; - } - } - - r_source.clear(); - - // Custom join ignoring lines removed by the preprocessor - for (int i = 0; i < lines.size(); i++) { - if (i > 0 && include_lines[i - 1]) { - r_source += '\n'; - } - - if (include_lines[i]) { - r_source += lines[i]; - } - } -} - -Error ScriptClassParser::parse_file(const String &p_filepath) { - String source; - - Error ferr = read_all_file_utf8(p_filepath, source); - - ERR_FAIL_COND_V_MSG(ferr != OK, ferr, - ferr == ERR_INVALID_DATA ? - "File '" + p_filepath + "' contains invalid unicode (UTF-8), so it was not loaded." - " Please ensure that scripts are saved in valid UTF-8 unicode." : - "Failed to read file: '" + p_filepath + "'."); - - run_dummy_preprocessor(source, p_filepath); - - return parse(source); -} - -String ScriptClassParser::get_error() { - return error_str; -} - -Vector<ScriptClassParser::ClassDecl> ScriptClassParser::get_classes() { - return classes; -} diff --git a/modules/mono/editor/script_class_parser.h b/modules/mono/editor/script_class_parser.h deleted file mode 100644 index 75a46bb4e5..0000000000 --- a/modules/mono/editor/script_class_parser.h +++ /dev/null @@ -1,108 +0,0 @@ -/*************************************************************************/ -/* script_class_parser.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef SCRIPT_CLASS_PARSER_H -#define SCRIPT_CLASS_PARSER_H - -#include "core/string/ustring.h" -#include "core/templates/vector.h" -#include "core/variant/variant.h" - -class ScriptClassParser { -public: - struct NameDecl { - enum Type { - NAMESPACE_DECL, - CLASS_DECL, - STRUCT_DECL - }; - - String name; - Type type = NAMESPACE_DECL; - }; - - struct ClassDecl { - String name; - String namespace_; - Vector<String> base; - bool nested = false; - }; - -private: - String code; - int idx = 0; - int line = 0; - String error_str; - bool error = false; - Variant value; - - Vector<ClassDecl> classes; - - enum Token { - TK_BRACKET_OPEN, - TK_BRACKET_CLOSE, - TK_CURLY_BRACKET_OPEN, - TK_CURLY_BRACKET_CLOSE, - TK_PERIOD, - TK_COLON, - TK_COMMA, - TK_SYMBOL, - TK_IDENTIFIER, - TK_STRING, - TK_NUMBER, - TK_OP_LESS, - TK_OP_GREATER, - TK_EOF, - TK_ERROR, - TK_MAX - }; - - static const char *token_names[TK_MAX]; - static String get_token_name(Token p_token); - - Token get_token(); - - Error _skip_generic_type_params(); - - Error _parse_type_full_name(String &r_full_name); - Error _parse_class_base(Vector<String> &r_base); - Error _parse_type_constraints(); - Error _parse_namespace_name(String &r_name, int &r_curly_stack); - -public: - Error parse(const String &p_code); - Error parse_file(const String &p_filepath); - - String get_error(); - - Vector<ClassDecl> get_classes(); -}; - -#endif // SCRIPT_CLASS_PARSER_H diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs new file mode 100644 index 0000000000..ef135da51a --- /dev/null +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs @@ -0,0 +1,22 @@ +using System; + +namespace Godot +{ + [AttributeUsage(AttributeTargets.Assembly)] + public class AssemblyHasScriptsAttribute : Attribute + { + private readonly bool requiresLookup; + private readonly System.Type[] scriptTypes; + + public AssemblyHasScriptsAttribute() + { + requiresLookup = true; + } + + public AssemblyHasScriptsAttribute(System.Type[] scriptTypes) + { + requiresLookup = false; + this.scriptTypes = scriptTypes; + } + } +} diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/DisableGodotGeneratorsAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/DisableGodotGeneratorsAttribute.cs new file mode 100644 index 0000000000..ac6cffceb2 --- /dev/null +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/DisableGodotGeneratorsAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Godot +{ + [AttributeUsage(AttributeTargets.Class)] + public class DisableGodotGeneratorsAttribute : Attribute + { + } +} diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs new file mode 100644 index 0000000000..12eb1035c3 --- /dev/null +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace Godot +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] + public class ScriptPathAttribute : Attribute + { + private string path; + + public ScriptPathAttribute(string path) + { + this.path = path; + } + } +} diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotUnhandledExceptionEvent.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotUnhandledExceptionEvent.cs new file mode 100644 index 0000000000..702a6c76ba --- /dev/null +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/GodotUnhandledExceptionEvent.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Godot +{ + public static partial class GD + { + /// <summary> + /// Fires when an unhandled exception occurs, regardless of project settings. + /// </summary> + public static event EventHandler<UnhandledExceptionArgs> UnhandledException; + + private static void OnUnhandledException(Exception e) + { + UnhandledException?.Invoke(null, new UnhandledExceptionArgs(e)); + } + } +} diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/UnhandledExceptionArgs.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/UnhandledExceptionArgs.cs new file mode 100644 index 0000000000..be01674568 --- /dev/null +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/UnhandledExceptionArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Godot +{ + /// <summary> + /// Event arguments for when unhandled exceptions occur. + /// </summary> + public class UnhandledExceptionArgs + { + /// <summary> + /// Exception object + /// </summary> + public Exception Exception { get; private set; } + + internal UnhandledExceptionArgs(Exception exception) + { + Exception = exception; + } + } +} diff --git a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj index 7c1a23d510..54aaaf1f92 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj +++ b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj @@ -14,9 +14,12 @@ <ItemGroup> <Compile Include="Core\AABB.cs" /> <Compile Include="Core\Array.cs" /> + <Compile Include="Core\Attributes\AssemblyHasScriptsAttribute.cs" /> + <Compile Include="Core\Attributes\DisableGodotGeneratorsAttribute.cs" /> <Compile Include="Core\Attributes\ExportAttribute.cs" /> <Compile Include="Core\Attributes\GodotMethodAttribute.cs" /> <Compile Include="Core\Attributes\RPCAttributes.cs" /> + <Compile Include="Core\Attributes\ScriptPathAttribute.cs" /> <Compile Include="Core\Attributes\SignalAttribute.cs" /> <Compile Include="Core\Attributes\ToolAttribute.cs" /> <Compile Include="Core\Basis.cs" /> @@ -37,6 +40,7 @@ <Compile Include="Core\GodotSynchronizationContext.cs" /> <Compile Include="Core\GodotTaskScheduler.cs" /> <Compile Include="Core\GodotTraceListener.cs" /> + <Compile Include="Core\GodotUnhandledExceptionEvent.cs" /> <Compile Include="Core\Interfaces\IAwaitable.cs" /> <Compile Include="Core\Interfaces\IAwaiter.cs" /> <Compile Include="Core\Interfaces\ISerializationListener.cs" /> @@ -56,6 +60,7 @@ <Compile Include="Core\StringName.cs" /> <Compile Include="Core\Transform.cs" /> <Compile Include="Core\Transform2D.cs" /> + <Compile Include="Core\UnhandledExceptionArgs.cs" /> <Compile Include="Core\Vector2.cs" /> <Compile Include="Core\Vector2i.cs" /> <Compile Include="Core\Vector3.cs" /> diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 43a39a4966..560788fb3a 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -1006,6 +1006,7 @@ bool GDMono::_load_project_assembly() { if (success) { mono_assembly_set_main(project_assembly->get_assembly()); + CSharpLanguage::get_singleton()->lookup_scripts_in_assembly(project_assembly); } return success; diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp index 1fe06bfbee..a1556bace5 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.cpp +++ b/modules/mono/mono_gd/gd_mono_assembly.cpp @@ -345,6 +345,45 @@ String GDMonoAssembly::get_path() const { return String::utf8(mono_image_get_filename(image)); } +bool GDMonoAssembly::has_attribute(GDMonoClass *p_attr_class) { +#ifdef DEBUG_ENABLED + ERR_FAIL_NULL_V(p_attr_class, false); +#endif + + if (!attrs_fetched) { + fetch_attributes(); + } + + if (!attributes) { + return false; + } + + return mono_custom_attrs_has_attr(attributes, p_attr_class->get_mono_ptr()); +} + +MonoObject *GDMonoAssembly::get_attribute(GDMonoClass *p_attr_class) { +#ifdef DEBUG_ENABLED + ERR_FAIL_NULL_V(p_attr_class, nullptr); +#endif + + if (!attrs_fetched) { + fetch_attributes(); + } + + if (!attributes) { + return nullptr; + } + + return mono_custom_attrs_get_attr(attributes, p_attr_class->get_mono_ptr()); +} + +void GDMonoAssembly::fetch_attributes() { + ERR_FAIL_COND(attributes != nullptr); + + attributes = mono_custom_attrs_from_assembly(assembly); + attrs_fetched = true; +} + GDMonoClass *GDMonoAssembly::get_class(const StringName &p_namespace, const StringName &p_name) { ERR_FAIL_NULL_V(image, nullptr); @@ -390,70 +429,6 @@ GDMonoClass *GDMonoAssembly::get_class(MonoClass *p_mono_class) { return wrapped_class; } -GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class) { - GDMonoClass *match = nullptr; - - if (gdobject_class_cache_updated) { - Map<StringName, GDMonoClass *>::Element *result = gdobject_class_cache.find(p_class); - - if (result) { - match = result->get(); - } - } else { - List<GDMonoClass *> nested_classes; - - int rows = mono_image_get_table_rows(image, MONO_TABLE_TYPEDEF); - - for (int i = 1; i < rows; i++) { - MonoClass *mono_class = mono_class_get(image, (i + 1) | MONO_TOKEN_TYPE_DEF); - - if (!mono_class_is_assignable_from(CACHED_CLASS_RAW(GodotObject), mono_class)) { - continue; - } - - GDMonoClass *current = get_class(mono_class); - - if (!current) { - continue; - } - - nested_classes.push_back(current); - - if (!match && current->get_name() == p_class) { - match = current; - } - - while (!nested_classes.is_empty()) { - GDMonoClass *current_nested = nested_classes.front()->get(); - nested_classes.pop_front(); - - void *iter = nullptr; - - while (true) { - MonoClass *raw_nested = mono_class_get_nested_types(current_nested->get_mono_ptr(), &iter); - - if (!raw_nested) { - break; - } - - GDMonoClass *nested_class = get_class(raw_nested); - - if (nested_class) { - gdobject_class_cache.insert(nested_class->get_name(), nested_class); - nested_classes.push_back(nested_class); - } - } - } - - gdobject_class_cache.insert(current->get_name(), current); - } - - gdobject_class_cache_updated = true; - } - - return match; -} - GDMonoAssembly *GDMonoAssembly::load(const String &p_name, MonoAssemblyName *p_aname, bool p_refonly, const Vector<String> &p_search_dirs) { if (GDMono::get_singleton()->get_corlib_assembly() && (p_name == "mscorlib" || p_name == "mscorlib.dll")) { return GDMono::get_singleton()->get_corlib_assembly(); diff --git a/modules/mono/mono_gd/gd_mono_assembly.h b/modules/mono/mono_gd/gd_mono_assembly.h index 350fcf3210..6191c491f4 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.h +++ b/modules/mono/mono_gd/gd_mono_assembly.h @@ -71,13 +71,13 @@ class GDMonoAssembly { MonoImage *image; MonoAssembly *assembly; + bool attrs_fetched = false; + MonoCustomAttrInfo *attributes = nullptr; + #ifdef GD_MONO_HOT_RELOAD uint64_t modified_time = 0; #endif - bool gdobject_class_cache_updated = false; - Map<StringName, GDMonoClass *> gdobject_class_cache; - HashMap<ClassKey, GDMonoClass *, ClassKey::Hasher> cached_classes; Map<MonoClass *, GDMonoClass *> cached_raw; @@ -111,11 +111,14 @@ public: String get_path() const; + bool has_attribute(GDMonoClass *p_attr_class); + MonoObject *get_attribute(GDMonoClass *p_attr_class); + + void fetch_attributes(); + GDMonoClass *get_class(const StringName &p_namespace, const StringName &p_name); GDMonoClass *get_class(MonoClass *p_mono_class); - GDMonoClass *get_object_derived_class(const StringName &p_class); - static String find_assembly(const String &p_name); static void fill_search_dirs(Vector<String> &r_search_dirs, const String &p_custom_config = String(), const String &p_custom_bcl_dir = String()); diff --git a/modules/mono/mono_gd/gd_mono_cache.cpp b/modules/mono/mono_gd/gd_mono_cache.cpp index aea467660f..d66cc29b9a 100644 --- a/modules/mono/mono_gd/gd_mono_cache.cpp +++ b/modules/mono/mono_gd/gd_mono_cache.cpp @@ -148,6 +148,11 @@ void CachedData::clear_godot_api_cache() { class_PuppetSyncAttribute = nullptr; class_GodotMethodAttribute = nullptr; field_GodotMethodAttribute_methodName = nullptr; + class_ScriptPathAttribute = nullptr; + field_ScriptPathAttribute_path = nullptr; + class_AssemblyHasScriptsAttribute = nullptr; + field_AssemblyHasScriptsAttribute_requiresLookup = nullptr; + field_AssemblyHasScriptsAttribute_scriptTypes = nullptr; field_GodotObject_ptr = nullptr; field_StringName_ptr = nullptr; @@ -272,6 +277,11 @@ void update_godot_api_cache() { CACHE_CLASS_AND_CHECK(PuppetSyncAttribute, GODOT_API_CLASS(PuppetSyncAttribute)); CACHE_CLASS_AND_CHECK(GodotMethodAttribute, GODOT_API_CLASS(GodotMethodAttribute)); CACHE_FIELD_AND_CHECK(GodotMethodAttribute, methodName, CACHED_CLASS(GodotMethodAttribute)->get_field("methodName")); + CACHE_CLASS_AND_CHECK(ScriptPathAttribute, GODOT_API_CLASS(ScriptPathAttribute)); + CACHE_FIELD_AND_CHECK(ScriptPathAttribute, path, CACHED_CLASS(ScriptPathAttribute)->get_field("path")); + CACHE_CLASS_AND_CHECK(AssemblyHasScriptsAttribute, GODOT_API_CLASS(AssemblyHasScriptsAttribute)); + CACHE_FIELD_AND_CHECK(AssemblyHasScriptsAttribute, requiresLookup, CACHED_CLASS(AssemblyHasScriptsAttribute)->get_field("requiresLookup")); + CACHE_FIELD_AND_CHECK(AssemblyHasScriptsAttribute, scriptTypes, CACHED_CLASS(AssemblyHasScriptsAttribute)->get_field("scriptTypes")); CACHE_FIELD_AND_CHECK(GodotObject, ptr, CACHED_CLASS(GodotObject)->get_field(BINDINGS_PTR_FIELD)); CACHE_FIELD_AND_CHECK(StringName, ptr, CACHED_CLASS(StringName)->get_field(BINDINGS_PTR_FIELD)); diff --git a/modules/mono/mono_gd/gd_mono_cache.h b/modules/mono/mono_gd/gd_mono_cache.h index fb75cb4b1c..51370da452 100644 --- a/modules/mono/mono_gd/gd_mono_cache.h +++ b/modules/mono/mono_gd/gd_mono_cache.h @@ -119,6 +119,11 @@ struct CachedData { GDMonoClass *class_PuppetSyncAttribute; GDMonoClass *class_GodotMethodAttribute; GDMonoField *field_GodotMethodAttribute_methodName; + GDMonoClass *class_ScriptPathAttribute; + GDMonoField *field_ScriptPathAttribute_path; + GDMonoClass *class_AssemblyHasScriptsAttribute; + GDMonoField *field_AssemblyHasScriptsAttribute_requiresLookup; + GDMonoField *field_AssemblyHasScriptsAttribute_scriptTypes; GDMonoField *field_GodotObject_ptr; GDMonoField *field_StringName_ptr; diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp index 65e2680905..fa93c6533a 100644 --- a/modules/mono/mono_gd/gd_mono_internals.cpp +++ b/modules/mono/mono_gd/gd_mono_internals.cpp @@ -43,7 +43,6 @@ #include <mono/metadata/exception.h> namespace GDMonoInternals { - void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) { // This method should not fail @@ -113,9 +112,11 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged) { void unhandled_exception(MonoException *p_exc) { mono_print_unhandled_exception((MonoObject *)p_exc); + gd_unhandled_exception_event(p_exc); if (GDMono::get_singleton()->get_unhandled_exception_policy() == GDMono::POLICY_TERMINATE_APP) { // Too bad 'mono_invoke_unhandled_exception_hook' is not exposed to embedders + mono_unhandled_exception((MonoObject *)p_exc); GDMono::unhandled_exception_hook((MonoObject *)p_exc, nullptr); GD_UNREACHABLE(); } else { @@ -127,4 +128,14 @@ void unhandled_exception(MonoException *p_exc) { #endif } } + +void gd_unhandled_exception_event(MonoException *p_exc) { + MonoImage *mono_image = GDMono::get_singleton()->get_core_api_assembly()->get_image(); + + MonoClass *gd_klass = mono_class_from_name(mono_image, "Godot", "GD"); + MonoMethod *unhandled_exception_method = mono_class_get_method_from_name(gd_klass, "OnUnhandledException", -1); + void *args[1]; + args[0] = p_exc; + mono_runtime_invoke(unhandled_exception_method, nullptr, (void **)args, nullptr); +} } // namespace GDMonoInternals diff --git a/modules/mono/mono_gd/gd_mono_internals.h b/modules/mono/mono_gd/gd_mono_internals.h index 34d2d35b2d..26eb270eee 100644 --- a/modules/mono/mono_gd/gd_mono_internals.h +++ b/modules/mono/mono_gd/gd_mono_internals.h @@ -38,7 +38,6 @@ #include "core/object/class_db.h" namespace GDMonoInternals { - void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged); /** @@ -46,6 +45,8 @@ void tie_managed_to_unmanaged(MonoObject *managed, Object *unmanaged); * Use GDMonoUtils::debug_unhandled_exception(MonoException *) instead. */ void unhandled_exception(MonoException *p_exc); + +void gd_unhandled_exception_event(MonoException *p_exc); } // namespace GDMonoInternals #endif // GD_MONO_INTERNALS_H diff --git a/modules/text_server_adv/bitmap_font_adv.cpp b/modules/text_server_adv/bitmap_font_adv.cpp index e33556b232..df7b42eac6 100644 --- a/modules/text_server_adv/bitmap_font_adv.cpp +++ b/modules/text_server_adv/bitmap_font_adv.cpp @@ -361,6 +361,10 @@ Error BitmapFontDataAdvanced::load_from_file(const String &p_filename, int p_bas base_size = height; } + if (hb_handle) { + hb_font_destroy(hb_handle); + } + hb_handle = hb_bmp_font_create(this, base_size, nullptr); valid = true; memdelete(f); @@ -379,12 +383,10 @@ Error BitmapFontDataAdvanced::bitmap_new(float p_height, float p_ascent, int p_b char_map.clear(); textures.clear(); kerning_map.clear(); - - for (Map<float, hb_font_t *>::Element *E = cache.front(); E; E = E->next()) { - hb_font_destroy(E->get()); + if (hb_handle) { + hb_font_destroy(hb_handle); } - cache.clear(); - + hb_handle = hb_bmp_font_create(this, base_size, nullptr); valid = true; return OK; @@ -466,10 +468,7 @@ float BitmapFontDataAdvanced::get_base_size() const { hb_font_t *BitmapFontDataAdvanced::get_hb_handle(int p_size) { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!valid, nullptr); - if (!cache.has(p_size)) { - cache[p_size] = hb_bmp_font_create(this, p_size, nullptr); - } - return cache[p_size]; + return hb_handle; } bool BitmapFontDataAdvanced::has_char(char32_t p_char) const { @@ -516,6 +515,10 @@ Vector2 BitmapFontDataAdvanced::get_size(uint32_t p_char, int p_size) const { return c->rect.size * (float(p_size) / float(base_size)); } +float BitmapFontDataAdvanced::get_font_scale(int p_size) const { + return float(p_size) / float(base_size); +} + Vector2 BitmapFontDataAdvanced::get_kerning(uint32_t p_char, uint32_t p_next, int p_size) const { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!valid, Vector2()); @@ -543,13 +546,13 @@ Vector2 BitmapFontDataAdvanced::draw_glyph(RID p_canvas, int p_size, const Vecto ERR_FAIL_COND_V(c->texture_idx < -1 || c->texture_idx >= textures.size(), Vector2()); if (c->texture_idx != -1) { Point2i cpos = p_pos; - cpos += c->align * (float(p_size) / float(base_size)); - cpos.y -= ascent * (float(p_size) / float(base_size)); + cpos += (c->align + Vector2(0, -ascent)) * (float(p_size) / float(base_size)); + Size2i csize = c->rect.size * (float(p_size) / float(base_size)); if (RenderingServer::get_singleton() != nullptr) { //if (distance_field_hint) { // Not implemented. // RenderingServer::get_singleton()->canvas_item_set_distance_field_mode(p_canvas, true); //} - RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas, Rect2(cpos, c->rect.size * (float(p_size) / float(base_size))), textures[c->texture_idx]->get_rid(), c->rect, p_color, false, false); + RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas, Rect2(cpos, csize), textures[c->texture_idx]->get_rid(), c->rect, p_color, false, false); //if (distance_field_hint) { // RenderingServer::get_singleton()->canvas_item_set_distance_field_mode(p_canvas, false); //} @@ -576,7 +579,7 @@ Vector2 BitmapFontDataAdvanced::draw_glyph_outline(RID p_canvas, int p_size, int } BitmapFontDataAdvanced::~BitmapFontDataAdvanced() { - for (Map<float, hb_font_t *>::Element *E = cache.front(); E; E = E->next()) { - hb_font_destroy(E->get()); + if (hb_handle) { + hb_font_destroy(hb_handle); } } diff --git a/modules/text_server_adv/bitmap_font_adv.h b/modules/text_server_adv/bitmap_font_adv.h index da7c2b00ac..7b620021e1 100644 --- a/modules/text_server_adv/bitmap_font_adv.h +++ b/modules/text_server_adv/bitmap_font_adv.h @@ -63,11 +63,11 @@ private: HashMap<uint32_t, Character> char_map; Map<KerningPairKey, int> kerning_map; - Map<float, hb_font_t *> cache; + hb_font_t *hb_handle = nullptr; float height = 0.f; float ascent = 0.f; - float base_size = 0.f; + int base_size = 0; bool distance_field_hint = false; public: @@ -101,6 +101,7 @@ public: virtual bool has_outline() const override { return false; }; virtual float get_base_size() const override; + virtual float get_font_scale(int p_size) const override; virtual hb_font_t *get_hb_handle(int p_size) override; diff --git a/modules/text_server_fb/bitmap_font_fb.cpp b/modules/text_server_fb/bitmap_font_fb.cpp index c58f8cbba1..313f170f04 100644 --- a/modules/text_server_fb/bitmap_font_fb.cpp +++ b/modules/text_server_fb/bitmap_font_fb.cpp @@ -319,14 +319,13 @@ Vector2 BitmapFontDataFallback::draw_glyph(RID p_canvas, int p_size, const Vecto ERR_FAIL_COND_V(c->texture_idx < -1 || c->texture_idx >= textures.size(), Vector2()); if (c->texture_idx != -1) { Point2i cpos = p_pos; - cpos += c->align * (float(p_size) / float(base_size)); - cpos.y -= ascent * (float(p_size) / float(base_size)); - + cpos += (c->align + Vector2(0, -ascent)) * (float(p_size) / float(base_size)); + Size2i csize = c->rect.size * (float(p_size) / float(base_size)); if (RenderingServer::get_singleton() != nullptr) { //if (distance_field_hint) { // Not implemented. // RenderingServer::get_singleton()->canvas_item_set_distance_field_mode(p_canvas, true); //} - RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas, Rect2(cpos, c->rect.size * (float(p_size) / float(base_size))), textures[c->texture_idx]->get_rid(), c->rect, p_color, false, false); + RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas, Rect2(cpos, csize), textures[c->texture_idx]->get_rid(), c->rect, p_color, false, false); //if (distance_field_hint) { // RenderingServer::get_singleton()->canvas_item_set_distance_field_mode(p_canvas, false); //} diff --git a/platform/javascript/SCsub b/platform/javascript/SCsub index 50b61c0db3..a760e36982 100644 --- a/platform/javascript/SCsub +++ b/platform/javascript/SCsub @@ -17,7 +17,7 @@ sys_env.AddJSLibraries( [ "js/libs/library_godot_audio.js", "js/libs/library_godot_display.js", - "js/libs/library_godot_http_request.js", + "js/libs/library_godot_fetch.js", "js/libs/library_godot_os.js", "js/libs/library_godot_runtime.js", ] @@ -86,40 +86,6 @@ wrap_list = [ ] js_wrapped = env.Textfile("#bin/godot", [env.File(f) for f in wrap_list], TEXTFILESUFFIX="${PROGSUFFIX}.wrapped.js") -zip_dir = env.Dir("#bin/.javascript_zip") -binary_name = "godot.tools" if env["tools"] else "godot" -out_files = [ - zip_dir.File(binary_name + ".js"), - zip_dir.File(binary_name + ".wasm"), - zip_dir.File(binary_name + ".html"), - zip_dir.File(binary_name + ".audio.worklet.js"), -] -html_file = "#misc/dist/html/full-size.html" -if env["tools"]: - subst_dict = {"@GODOT_VERSION@": env.GetBuildVersion()} - html_file = env.Substfile( - target="#bin/godot${PROGSUFFIX}.html", source="#misc/dist/html/editor.html", SUBST_DICT=subst_dict - ) - -in_files = [js_wrapped, build[1], html_file, "#platform/javascript/js/libs/audio.worklet.js"] -if env["gdnative_enabled"]: - in_files.append(build[2]) # Runtime - out_files.append(zip_dir.File(binary_name + ".side.wasm")) -elif env["threads_enabled"]: - in_files.append(build[2]) # Worker - out_files.append(zip_dir.File(binary_name + ".worker.js")) - -if env["tools"]: - in_files.append("#misc/dist/html/logo.svg") - out_files.append(zip_dir.File("logo.svg")) - in_files.append("#icon.png") - out_files.append(zip_dir.File("favicon.png")) - -zip_files = env.InstallAs(out_files, in_files) -env.Zip( - "#bin/godot", - zip_files, - ZIPROOT=zip_dir, - ZIPSUFFIX="${PROGSUFFIX}${ZIPSUFFIX}", - ZIPCOMSTR="Archiving $SOURCES as $TARGET", -) +# Extra will be the thread worker, or the GDNative side, or None +extra = build[2] if len(build) > 2 else None +env.CreateTemplateZip(js_wrapped, build[1], extra) diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py index 4297088c09..e80ef374ec 100644 --- a/platform/javascript/detect.py +++ b/platform/javascript/detect.py @@ -7,7 +7,7 @@ from emscripten_helpers import ( add_js_libraries, add_js_pre, add_js_externs, - get_build_version, + create_template_zip, ) from methods import get_compiler_version from SCons.Util import WhereIs @@ -147,12 +147,12 @@ def configure(env): env.AddMethod(add_js_pre, "AddJSPre") env.AddMethod(add_js_externs, "AddJSExterns") - # Add method for getting build version string. - env.AddMethod(get_build_version, "GetBuildVersion") - # Add method that joins/compiles our Engine files. env.AddMethod(create_engine_file, "CreateEngineFile") + # Add method for creating the final zip file + env.AddMethod(create_template_zip, "CreateTemplateZip") + # Closure compiler extern and support for ecmascript specs (const, let, etc). env["ENV"]["EMCC_CLOSURE_ARGS"] = "--language_in ECMASCRIPT6" diff --git a/platform/javascript/display_server_javascript.cpp b/platform/javascript/display_server_javascript.cpp index a605f22e16..12e06e24dc 100644 --- a/platform/javascript/display_server_javascript.cpp +++ b/platform/javascript/display_server_javascript.cpp @@ -683,7 +683,7 @@ DisplayServerJavaScript::DisplayServerJavaScript(const String &p_rendering_drive godot_js_config_canvas_id_get(canvas_id, 256); // Handle contextmenu, webglcontextlost - godot_js_display_setup_canvas(p_resolution.x, p_resolution.y, p_mode == WINDOW_MODE_FULLSCREEN); + godot_js_display_setup_canvas(p_resolution.x, p_resolution.y, p_mode == WINDOW_MODE_FULLSCREEN, OS::get_singleton()->is_hidpi_allowed() ? 1 : 0); // Check if it's windows. swap_cancel_ok = godot_js_display_is_swap_ok_cancel() == 1; diff --git a/platform/javascript/emscripten_helpers.py b/platform/javascript/emscripten_helpers.py index d08555916b..04fbba8a41 100644 --- a/platform/javascript/emscripten_helpers.py +++ b/platform/javascript/emscripten_helpers.py @@ -15,7 +15,7 @@ def run_closure_compiler(target, source, env, for_signature): return " ".join(cmd) -def get_build_version(env): +def get_build_version(): import version name = "custom_build" @@ -30,6 +30,65 @@ def create_engine_file(env, target, source, externs): return env.Textfile(target, [env.File(s) for s in source]) +def create_template_zip(env, js, wasm, extra): + binary_name = "godot.tools" if env["tools"] else "godot" + zip_dir = env.Dir("#bin/.javascript_zip") + in_files = [ + js, + wasm, + "#platform/javascript/js/libs/audio.worklet.js", + ] + out_files = [ + zip_dir.File(binary_name + ".js"), + zip_dir.File(binary_name + ".wasm"), + zip_dir.File(binary_name + ".audio.worklet.js"), + ] + # GDNative/Threads specific + if env["gdnative_enabled"]: + in_files.append(extra) # Runtime + out_files.append(zip_dir.File(binary_name + ".side.wasm")) + elif env["threads_enabled"]: + in_files.append(extra) # Worker + out_files.append(zip_dir.File(binary_name + ".worker.js")) + + service_worker = "#misc/dist/html/service-worker.js" + if env["tools"]: + # HTML + html = "#misc/dist/html/editor.html" + subst_dict = {"@GODOT_VERSION@": get_build_version(), "@GODOT_NAME@": "GodotEngine"} + html = env.Substfile(target="#bin/godot${PROGSUFFIX}.html", source=html, SUBST_DICT=subst_dict) + in_files.append(html) + out_files.append(zip_dir.File(binary_name + ".html")) + # And logo/favicon + in_files.append("#misc/dist/html/logo.svg") + out_files.append(zip_dir.File("logo.svg")) + in_files.append("#icon.png") + out_files.append(zip_dir.File("favicon.png")) + # PWA + service_worker = env.Substfile( + target="#bin/godot${PROGSUFFIX}.service.worker.js", source=service_worker, SUBST_DICT=subst_dict + ) + in_files.append(service_worker) + out_files.append(zip_dir.File("service.worker.js")) + in_files.append("#misc/dist/html/manifest.json") + out_files.append(zip_dir.File("manifest.json")) + in_files.append("#misc/dist/html/offline.html") + out_files.append(zip_dir.File("offline.html")) + else: + # HTML + in_files.append("#misc/dist/html/full-size.html") + out_files.append(zip_dir.File(binary_name + ".html")) + + zip_files = env.InstallAs(out_files, in_files) + env.Zip( + "#bin/godot", + zip_files, + ZIPROOT=zip_dir, + ZIPSUFFIX="${PROGSUFFIX}${ZIPSUFFIX}", + ZIPCOMSTR="Archiving $SOURCES as $TARGET", + ) + + def add_js_libraries(env, libraries): env.Append(JS_LIBS=env.File(libraries)) diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 353cc49ef8..46d0458ca1 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -242,7 +242,7 @@ class EditorExportPlatformJavaScript : public EditorExportPlatform { return name; } - void _fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug, int p_flags, const Vector<SharedObject> p_shared_objects); + void _fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug, int p_flags, const Vector<SharedObject> p_shared_objects, const Dictionary &p_file_sizes); static void _server_thread_poll(void *data); @@ -281,7 +281,7 @@ public: ~EditorExportPlatformJavaScript(); }; -void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug, int p_flags, const Vector<SharedObject> p_shared_objects) { +void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Ref<EditorExportPreset> &p_preset, const String &p_name, bool p_debug, int p_flags, const Vector<SharedObject> p_shared_objects, const Dictionary &p_file_sizes) { String str_template = String::utf8(reinterpret_cast<const char *>(p_html.ptr()), p_html.size()); String str_export; Vector<String> lines = str_template.split("\n"); @@ -300,6 +300,7 @@ void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Re config["gdnativeLibs"] = libs; config["executable"] = p_name; config["args"] = args; + config["fileSizes"] = p_file_sizes; const String str_config = JSON::print(config); for (int i = 0; i < lines.size(); i++) { @@ -472,6 +473,8 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese return ERR_FILE_CORRUPT; } + Vector<uint8_t> html; + Dictionary file_sizes; do { //get filename unz_file_info info; @@ -480,6 +483,16 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese String file = fname; + // HTML is handled later + if (file == "godot.html") { + if (custom_html.is_empty()) { + html.resize(info.uncompressed_size); + unzOpenCurrentFile(pkg); + unzReadCurrentFile(pkg, html.ptrw(), html.size()); + unzCloseCurrentFile(pkg); + } + continue; + } Vector<uint8_t> data; data.resize(info.uncompressed_size); @@ -490,14 +503,7 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese //write - if (file == "godot.html") { - if (!custom_html.is_empty()) { - continue; - } - _fix_html(data, p_preset, p_path.get_file().get_basename(), p_debug, p_flags, shared_objects); - file = p_path.get_file(); - - } else if (file == "godot.js") { + if (file == "godot.js") { file = p_path.get_file().get_basename() + ".js"; } else if (file == "godot.worker.js") { @@ -511,6 +517,7 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese } else if (file == "godot.wasm") { file = p_path.get_file().get_basename() + ".wasm"; + file_sizes[file.get_file()] = (uint64_t)info.uncompressed_size; } String dst = p_path.get_base_dir().plus_file(file); @@ -532,19 +539,26 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese EditorNode::get_singleton()->show_warning(TTR("Could not read custom HTML shell:") + "\n" + custom_html); return ERR_FILE_CANT_READ; } - Vector<uint8_t> buf; - buf.resize(f->get_len()); - f->get_buffer(buf.ptrw(), buf.size()); + html.resize(f->get_len()); + f->get_buffer(html.ptrw(), html.size()); memdelete(f); - _fix_html(buf, p_preset, p_path.get_file().get_basename(), p_debug, p_flags, shared_objects); - + } + { + FileAccess *f = FileAccess::open(pck_path, FileAccess::READ); + if (f) { + file_sizes[pck_path.get_file()] = (uint64_t)f->get_len(); + memdelete(f); + f = NULL; + } + _fix_html(html, p_preset, p_path.get_file().get_basename(), p_debug, p_flags, shared_objects, file_sizes); f = FileAccess::open(p_path, FileAccess::WRITE); if (!f) { EditorNode::get_singleton()->show_warning(TTR("Could not write file:") + "\n" + p_path); return ERR_FILE_CANT_WRITE; } - f->store_buffer(buf.ptr(), buf.size()); + f->store_buffer(html.ptr(), html.size()); memdelete(f); + html.resize(0); } Ref<Image> splash; diff --git a/platform/javascript/godot_js.h b/platform/javascript/godot_js.h index 5aa8677a54..f86aadd2c2 100644 --- a/platform/javascript/godot_js.h +++ b/platform/javascript/godot_js.h @@ -92,7 +92,7 @@ extern int godot_js_display_gamepad_sample_get(int p_idx, float r_btns[16], int3 extern void godot_js_display_notification_cb(void (*p_callback)(int p_notification), int p_enter, int p_exit, int p_in, int p_out); extern void godot_js_display_paste_cb(void (*p_callback)(const char *p_text)); extern void godot_js_display_drop_files_cb(void (*p_callback)(char **p_filev, int p_filec)); -extern void godot_js_display_setup_canvas(int p_width, int p_height, int p_fullscreen); +extern void godot_js_display_setup_canvas(int p_width, int p_height, int p_fullscreen, int p_hidpi); #ifdef __cplusplus } #endif diff --git a/platform/javascript/http_client.h.inc b/platform/javascript/http_client.h.inc index 2ef1ad5b83..842a93fcba 100644 --- a/platform/javascript/http_client.h.inc +++ b/platform/javascript/http_client.h.inc @@ -30,24 +30,21 @@ // HTTPClient's additional private members in the javascript platform -Error prepare_request(Method p_method, const String &p_url, const Vector<String> &p_headers); +Error make_request(Method p_method, const String &p_url, const Vector<String> &p_headers, const uint8_t *p_body, int p_body_len); +static void _parse_headers(int p_len, const char **p_headers, void *p_ref); -int xhr_id; +int js_id = 0; int read_limit = 4096; -int response_read_offset = 0; Status status = STATUS_DISCONNECTED; String host; int port = -1; bool use_tls = false; -String username; -String password; int polled_response_code = 0; -String polled_response_header; -PackedByteArray polled_response; +Vector<String> response_headers; +Vector<uint8_t> response_buffer; #ifdef DEBUG_ENABLED -bool has_polled = false; uint64_t last_polling_frame = 0; #endif diff --git a/platform/javascript/http_client_javascript.cpp b/platform/javascript/http_client_javascript.cpp index 1136ea299d..b79c965854 100644 --- a/platform/javascript/http_client_javascript.cpp +++ b/platform/javascript/http_client_javascript.cpp @@ -30,7 +30,38 @@ #include "core/io/http_client.h" -#include "http_request.h" +#ifdef __cplusplus +extern "C" { +#endif + +#include "stddef.h" + +typedef enum { + GODOT_JS_FETCH_STATE_REQUESTING = 0, + GODOT_JS_FETCH_STATE_BODY = 1, + GODOT_JS_FETCH_STATE_DONE = 2, + GODOT_JS_FETCH_STATE_ERROR = -1, +} godot_js_fetch_state_t; + +extern int godot_js_fetch_create(const char *p_method, const char *p_url, const char **p_headers, int p_headers_len, const uint8_t *p_body, int p_body_len); +extern int godot_js_fetch_read_headers(int p_id, void (*parse_callback)(int p_size, const char **p_headers, void *p_ref), void *p_ref); +extern int godot_js_fetch_read_chunk(int p_id, uint8_t *p_buf, int p_buf_size); +extern void godot_js_fetch_free(int p_id); +extern godot_js_fetch_state_t godot_js_fetch_state_get(int p_id); +extern int godot_js_fetch_body_length_get(int p_id); +extern int godot_js_fetch_http_status_get(int p_id); +extern int godot_js_fetch_is_chunked(int p_id); + +#ifdef __cplusplus +} +#endif + +void HTTPClient::_parse_headers(int p_len, const char **p_headers, void *p_ref) { + HTTPClient *client = static_cast<HTTPClient *>(p_ref); + for (int i = 0; i < p_len; i++) { + client->response_headers.push_back(String::utf8(p_headers[i])); + } +} Error HTTPClient::connect_to_host(const String &p_host, int p_port, bool p_ssl, bool p_verify_host) { close(); @@ -74,7 +105,7 @@ Ref<StreamPeer> HTTPClient::get_connection() const { ERR_FAIL_V_MSG(REF(), "Accessing an HTTPClient's StreamPeer is not supported for the HTML5 platform."); } -Error HTTPClient::prepare_request(Method p_method, const String &p_url, const Vector<String> &p_headers) { +Error HTTPClient::make_request(Method p_method, const String &p_url, const Vector<String> &p_headers, const uint8_t *p_body, int p_body_len) { ERR_FAIL_INDEX_V(p_method, METHOD_MAX, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V_MSG(p_method == METHOD_TRACE || p_method == METHOD_CONNECT, ERR_UNAVAILABLE, "HTTP methods TRACE and CONNECT are not supported for the HTML5 platform."); ERR_FAIL_COND_V(status != STATUS_CONNECTED, ERR_INVALID_PARAMETER); @@ -83,46 +114,33 @@ Error HTTPClient::prepare_request(Method p_method, const String &p_url, const Ve ERR_FAIL_COND_V(!p_url.begins_with("/"), ERR_INVALID_PARAMETER); String url = (use_tls ? "https://" : "http://") + host + ":" + itos(port) + p_url; - godot_xhr_reset(xhr_id); - godot_xhr_open(xhr_id, _methods[p_method], url.utf8().get_data(), - username.is_empty() ? nullptr : username.utf8().get_data(), - password.is_empty() ? nullptr : password.utf8().get_data()); - + Vector<CharString> keeper; + Vector<const char *> c_strings; for (int i = 0; i < p_headers.size(); i++) { - int header_separator = p_headers[i].find(": "); - ERR_FAIL_COND_V(header_separator < 0, ERR_INVALID_PARAMETER); - godot_xhr_set_request_header(xhr_id, - p_headers[i].left(header_separator).utf8().get_data(), - p_headers[i].right(header_separator + 2).utf8().get_data()); + keeper.push_back(p_headers[i].utf8()); + c_strings.push_back(keeper[i].get_data()); + } + if (js_id) { + godot_js_fetch_free(js_id); } - response_read_offset = 0; + js_id = godot_js_fetch_create(_methods[p_method], url.utf8().get_data(), c_strings.ptrw(), c_strings.size(), p_body, p_body_len); status = STATUS_REQUESTING; return OK; } Error HTTPClient::request_raw(Method p_method, const String &p_url, const Vector<String> &p_headers, const Vector<uint8_t> &p_body) { - Error err = prepare_request(p_method, p_url, p_headers); - if (err != OK) - return err; if (p_body.is_empty()) { - godot_xhr_send(xhr_id, nullptr, 0); - } else { - godot_xhr_send(xhr_id, p_body.ptr(), p_body.size()); + return make_request(p_method, p_url, p_headers, nullptr, 0); } - return OK; + return make_request(p_method, p_url, p_headers, p_body.ptr(), p_body.size()); } Error HTTPClient::request(Method p_method, const String &p_url, const Vector<String> &p_headers, const String &p_body) { - Error err = prepare_request(p_method, p_url, p_headers); - if (err != OK) - return err; if (p_body.is_empty()) { - godot_xhr_send(xhr_id, nullptr, 0); - } else { - const CharString cs = p_body.utf8(); - godot_xhr_send(xhr_id, cs.get_data(), cs.length()); + return make_request(p_method, p_url, p_headers, nullptr, 0); } - return OK; + const CharString cs = p_body.utf8(); + return make_request(p_method, p_url, p_headers, (const uint8_t *)cs.get_data(), cs.size() - 1); } void HTTPClient::close() { @@ -130,10 +148,13 @@ void HTTPClient::close() { port = -1; use_tls = false; status = STATUS_DISCONNECTED; - polled_response.resize(0); polled_response_code = 0; - polled_response_header = String(); - godot_xhr_reset(xhr_id); + response_headers.resize(0); + response_buffer.resize(0); + if (js_id) { + godot_js_fetch_free(js_id); + js_id = 0; + } } HTTPClient::Status HTTPClient::get_status() const { @@ -141,12 +162,11 @@ HTTPClient::Status HTTPClient::get_status() const { } bool HTTPClient::has_response() const { - return !polled_response_header.is_empty(); + return response_headers.size() > 0; } bool HTTPClient::is_response_chunked() const { - // TODO evaluate using moz-chunked-arraybuffer, fetch & ReadableStream - return false; + return godot_js_fetch_is_chunked(js_id); } int HTTPClient::get_response_code() const { @@ -154,36 +174,42 @@ int HTTPClient::get_response_code() const { } Error HTTPClient::get_response_headers(List<String> *r_response) { - if (polled_response_header.is_empty()) + if (!response_headers.size()) { return ERR_INVALID_PARAMETER; - - Vector<String> header_lines = polled_response_header.split("\r\n", false); - for (int i = 0; i < header_lines.size(); ++i) { - r_response->push_back(header_lines[i]); } - polled_response_header = String(); + for (int i = 0; i < response_headers.size(); i++) { + r_response->push_back(response_headers[i]); + } + response_headers.clear(); return OK; } int HTTPClient::get_response_body_length() const { - return polled_response.size(); + return godot_js_fetch_body_length_get(js_id); } PackedByteArray HTTPClient::read_response_body_chunk() { ERR_FAIL_COND_V(status != STATUS_BODY, PackedByteArray()); - int to_read = MIN(read_limit, polled_response.size() - response_read_offset); - PackedByteArray chunk; - chunk.resize(to_read); - memcpy(chunk.ptrw(), polled_response.ptr() + response_read_offset, to_read); - response_read_offset += to_read; - - if (response_read_offset == polled_response.size()) { - status = STATUS_CONNECTED; - polled_response.resize(0); - godot_xhr_reset(xhr_id); + if (response_buffer.size() != read_limit) { + response_buffer.resize(read_limit); + } + int read = godot_js_fetch_read_chunk(js_id, response_buffer.ptrw(), read_limit); + + // Check if the stream is over. + godot_js_fetch_state_t state = godot_js_fetch_state_get(js_id); + if (state == GODOT_JS_FETCH_STATE_DONE) { + status = STATUS_DISCONNECTED; + } else if (state != GODOT_JS_FETCH_STATE_BODY) { + status = STATUS_CONNECTION_ERROR; } + PackedByteArray chunk; + if (!read) { + return chunk; + } + chunk.resize(read); + copymem(chunk.ptrw(), response_buffer.ptr(), read); return chunk; } @@ -217,48 +243,48 @@ Error HTTPClient::poll() { return OK; case STATUS_CONNECTED: - case STATUS_BODY: return OK; + case STATUS_BODY: { + godot_js_fetch_state_t state = godot_js_fetch_state_get(js_id); + if (state == GODOT_JS_FETCH_STATE_DONE) { + status = STATUS_DISCONNECTED; + } else if (state != GODOT_JS_FETCH_STATE_BODY) { + status = STATUS_CONNECTION_ERROR; + return ERR_CONNECTION_ERROR; + } + return OK; + } + case STATUS_CONNECTION_ERROR: return ERR_CONNECTION_ERROR; case STATUS_REQUESTING: { #ifdef DEBUG_ENABLED - if (!has_polled) { - has_polled = true; - } else { - // forcing synchronous requests is not possible on the web - if (last_polling_frame == Engine::get_singleton()->get_process_frames()) { - WARN_PRINT("HTTPClient polled multiple times in one frame, " - "but request cannot progress more than once per " - "frame on the HTML5 platform."); - } + // forcing synchronous requests is not possible on the web + if (last_polling_frame == Engine::get_singleton()->get_process_frames()) { + WARN_PRINT("HTTPClient polled multiple times in one frame, " + "but request cannot progress more than once per " + "frame on the HTML5 platform."); } last_polling_frame = Engine::get_singleton()->get_process_frames(); #endif - polled_response_code = godot_xhr_get_status(xhr_id); - if (godot_xhr_get_ready_state(xhr_id) != XHR_READY_STATE_DONE) { + polled_response_code = godot_js_fetch_http_status_get(js_id); + godot_js_fetch_state_t js_state = godot_js_fetch_state_get(js_id); + if (js_state == GODOT_JS_FETCH_STATE_REQUESTING) { return OK; - } else if (!polled_response_code) { + } else if (js_state == GODOT_JS_FETCH_STATE_ERROR) { + // Fetch is in error state. + status = STATUS_CONNECTION_ERROR; + return ERR_CONNECTION_ERROR; + } + if (godot_js_fetch_read_headers(js_id, &_parse_headers, this)) { + // Failed to parse headers. status = STATUS_CONNECTION_ERROR; return ERR_CONNECTION_ERROR; } - status = STATUS_BODY; - - PackedByteArray bytes; - int len = godot_xhr_get_response_headers_length(xhr_id); - bytes.resize(len + 1); - - godot_xhr_get_response_headers(xhr_id, reinterpret_cast<char *>(bytes.ptrw()), len); - bytes.ptrw()[len] = 0; - - polled_response_header = String::utf8(reinterpret_cast<const char *>(bytes.ptr())); - - polled_response.resize(godot_xhr_get_response_length(xhr_id)); - godot_xhr_get_response(xhr_id, polled_response.ptrw(), polled_response.size()); break; } @@ -269,9 +295,8 @@ Error HTTPClient::poll() { } HTTPClient::HTTPClient() { - xhr_id = godot_xhr_new(); } HTTPClient::~HTTPClient() { - godot_xhr_free(xhr_id); + close(); } diff --git a/platform/javascript/http_request.h b/platform/javascript/http_request.h deleted file mode 100644 index a9d6faade2..0000000000 --- a/platform/javascript/http_request.h +++ /dev/null @@ -1,73 +0,0 @@ -/*************************************************************************/ -/* http_request.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef HTTP_REQUEST_H -#define HTTP_REQUEST_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stddef.h" - -typedef enum { - XHR_READY_STATE_UNSENT = 0, - XHR_READY_STATE_OPENED = 1, - XHR_READY_STATE_HEADERS_RECEIVED = 2, - XHR_READY_STATE_LOADING = 3, - XHR_READY_STATE_DONE = 4, -} godot_xhr_ready_state_t; - -extern int godot_xhr_new(); -extern void godot_xhr_reset(int p_xhr_id); -extern void godot_xhr_free(int p_xhr_id); - -extern int godot_xhr_open(int p_xhr_id, const char *p_method, const char *p_url, const char *p_user = nullptr, const char *p_password = nullptr); - -extern void godot_xhr_set_request_header(int p_xhr_id, const char *p_header, const char *p_value); - -extern void godot_xhr_send(int p_xhr_id, const void *p_data, int p_len); -extern void godot_xhr_abort(int p_xhr_id); - -/* this is an HTTPClient::ResponseCode, not ::Status */ -extern int godot_xhr_get_status(int p_xhr_id); -extern godot_xhr_ready_state_t godot_xhr_get_ready_state(int p_xhr_id); - -extern int godot_xhr_get_response_headers_length(int p_xhr_id); -extern void godot_xhr_get_response_headers(int p_xhr_id, char *r_dst, int p_len); - -extern int godot_xhr_get_response_length(int p_xhr_id); -extern void godot_xhr_get_response(int p_xhr_id, void *r_dst, int p_len); - -#ifdef __cplusplus -} -#endif - -#endif /* HTTP_REQUEST_H */ diff --git a/platform/javascript/js/engine/config.js b/platform/javascript/js/engine/config.js index bba20dc360..82ff273ecf 100644 --- a/platform/javascript/js/engine/config.js +++ b/platform/javascript/js/engine/config.js @@ -101,6 +101,11 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- */ gdnativeLibs: [], /** + * @ignore + * @type {Array.<string>} + */ + fileSizes: [], + /** * A callback function for handling Godot's ``OS.execute`` calls. * * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game. @@ -219,6 +224,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); this.persistentPaths = parse('persistentPaths', this.persistentPaths); this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); + this.fileSizes = parse('fileSizes', this.fileSizes); this.args = parse('args', this.args); this.onExecute = parse('onExecute', this.onExecute); this.onExit = parse('onExit', this.onExit); @@ -227,10 +233,10 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- /** * @ignore * @param {string} loadPath - * @param {Promise} loadPromise + * @param {Response} response */ - Config.prototype.getModuleConfig = function (loadPath, loadPromise) { - let loader = loadPromise; + Config.prototype.getModuleConfig = function (loadPath, response) { + let r = response; return { 'print': this.onPrint, 'printErr': this.onPrintError, @@ -238,12 +244,17 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- 'noExitRuntime': true, 'dynamicLibraries': [`${loadPath}.side.wasm`], 'instantiateWasm': function (imports, onSuccess) { - loader.then(function (xhr) { - WebAssembly.instantiate(xhr.response, imports).then(function (result) { - onSuccess(result['instance'], result['module']); + function done(result) { + onSuccess(result['instance'], result['module']); + } + if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') { + WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done); + } else { + r.arrayBuffer().then(function (buffer) { + WebAssembly.instantiate(buffer, imports).then(done); }); - }); - loader = null; + } + r = null; return {}; }, 'locateFile': function (path) { diff --git a/platform/javascript/js/engine/engine.externs.js b/platform/javascript/js/engine/engine.externs.js index 1a94dd15ec..35a66a93ae 100644 --- a/platform/javascript/js/engine/engine.externs.js +++ b/platform/javascript/js/engine/engine.externs.js @@ -1,3 +1,4 @@ var Godot; var WebAssembly = {}; WebAssembly.instantiate = function(buffer, imports) {}; +WebAssembly.instantiateStreaming = function(response, imports) {}; diff --git a/platform/javascript/js/engine/engine.js b/platform/javascript/js/engine/engine.js index c51955ed3d..19a0552c8c 100644 --- a/platform/javascript/js/engine/engine.js +++ b/platform/javascript/js/engine/engine.js @@ -35,14 +35,15 @@ const Engine = (function () { * Load the engine from the specified base path. * * @param {string} basePath Base path of the engine to load. + * @param {number=} [size=0] The file size if known. * @returns {Promise} A Promise that resolves once the engine is loaded. * * @function Engine.load */ - Engine.load = function (basePath) { + Engine.load = function (basePath, size) { if (loadPromise == null) { loadPath = basePath; - loadPromise = preloader.loadPromise(`${loadPath}.wasm`); + loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true); requestAnimationFrame(preloader.animateProgress); } return loadPromise; @@ -96,23 +97,27 @@ const Engine = (function () { initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.')); return initPromise; } - Engine.load(basePath); + Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]); } - preloader.setProgressFunc(this.config.onProgress); - let config = this.config.getModuleConfig(loadPath, loadPromise); const me = this; - initPromise = new Promise(function (resolve, reject) { - Godot(config).then(function (module) { - module['initFS'](me.config.persistentPaths).then(function (fs_err) { - me.rtenv = module; - if (me.config.unloadAfterInit) { - Engine.unload(); - } - resolve(); - config = null; + function doInit(promise) { + return promise.then(function (response) { + return Godot(me.config.getModuleConfig(loadPath, response.clone())); + }).then(function (module) { + const paths = me.config.persistentPaths; + return module['initFS'](paths).then(function (err) { + return Promise.resolve(module); }); + }).then(function (module) { + me.rtenv = module; + if (me.config.unloadAfterInit) { + Engine.unload(); + } + return Promise.resolve(); }); - }); + } + preloader.setProgressFunc(this.config.onProgress); + initPromise = doInit(loadPromise); return initPromise; }, @@ -133,7 +138,7 @@ const Engine = (function () { * @returns {Promise} A Promise that resolves once the file is loaded. */ preloadFile: function (file, path) { - return preloader.preload(file, path); + return preloader.preload(file, path, this.config.fileSizes[file]); }, /** diff --git a/platform/javascript/js/engine/preloader.js b/platform/javascript/js/engine/preloader.js index ec34fb93f2..3535fdb361 100644 --- a/platform/javascript/js/engine/preloader.js +++ b/platform/javascript/js/engine/preloader.js @@ -1,54 +1,79 @@ const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars - const loadXHR = function (resolve, reject, file, tracker, attempts) { - const xhr = new XMLHttpRequest(); + function getTrackedResponse(response, load_status) { + let clen = 0; + let compressed = false; + response.headers.forEach(function (value, header) { + const h = header.toLowerCase().trim(); + // We can't accurately compute compressed stream length. + if (h === 'content-encoding') { + compressed = true; + } else if (h === 'content-length') { + const length = parseInt(value, 10); + if (!Number.isNaN(length) && length > 0) { + clen = length; + } + } + }); + if (!compressed && clen) { + load_status.total = clen; + } + function onloadprogress(reader, controller) { + return reader.read().then(function (result) { + if (load_status.done) { + return Promise.resolve(); + } + if (result.value) { + controller.enqueue(result.value); + load_status.loaded += result.value.length; + } + if (!result.done) { + return onloadprogress(reader, controller); + } + load_status.done = true; + return Promise.resolve(); + }); + } + const reader = response.body.getReader(); + return new Response(new ReadableStream({ + start: function (controller) { + onloadprogress(reader, controller).then(function () { + controller.close(); + }); + }, + }), { headers: response.headers }); + } + + function loadFetch(file, tracker, fileSize, raw) { tracker[file] = { - total: 0, + total: fileSize || 0, loaded: 0, - final: false, + done: false, }; - xhr.onerror = function () { + return fetch(file).then(function (response) { + if (!response.ok) { + return Promise.reject(new Error(`Failed loading file '${file}'`)); + } + const tr = getTrackedResponse(response, tracker[file]); + if (raw) { + return Promise.resolve(tr); + } + return tr.arrayBuffer(); + }); + } + + function retry(func, attempts = 1) { + function onerror(err) { if (attempts <= 1) { - reject(new Error(`Failed loading file '${file}'`)); - } else { + return Promise.reject(err); + } + return new Promise(function (resolve, reject) { setTimeout(function () { - loadXHR(resolve, reject, file, tracker, attempts - 1); + retry(func, attempts - 1).then(resolve).catch(reject); }, 1000); - } - }; - xhr.onabort = function () { - tracker[file].final = true; - reject(new Error(`Loading file '${file}' was aborted.`)); - }; - xhr.onloadstart = function (ev) { - tracker[file].total = ev.total; - tracker[file].loaded = ev.loaded; - }; - xhr.onprogress = function (ev) { - tracker[file].loaded = ev.loaded; - tracker[file].total = ev.total; - }; - xhr.onload = function () { - if (xhr.status >= 400) { - if (xhr.status < 500 || attempts <= 1) { - reject(new Error(`Failed loading file '${file}': ${xhr.statusText}`)); - xhr.abort(); - } else { - setTimeout(function () { - loadXHR(resolve, reject, file, tracker, attempts - 1); - }, 1000); - } - } else { - tracker[file].final = true; - resolve(xhr); - } - }; - // Make request. - xhr.open('GET', file); - if (!file.endsWith('.js')) { - xhr.responseType = 'arraybuffer'; + }); } - xhr.send(); - }; + return func().catch(onerror); + } const DOWNLOAD_ATTEMPTS_MAX = 4; const loadingFiles = {}; @@ -63,7 +88,7 @@ const Preloader = /** @constructor */ function () { // eslint-disable-line no-un Object.keys(loadingFiles).forEach(function (file) { const stat = loadingFiles[file]; - if (!stat.final) { + if (!stat.done) { progressIsFinal = false; } if (!totalIsValid || stat.total === 0) { @@ -92,21 +117,19 @@ const Preloader = /** @constructor */ function () { // eslint-disable-line no-un progressFunc = callback; }; - this.loadPromise = function (file) { - return new Promise(function (resolve, reject) { - loadXHR(resolve, reject, file, loadingFiles, DOWNLOAD_ATTEMPTS_MAX); - }); + this.loadPromise = function (file, fileSize, raw = false) { + return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX); }; this.preloadedFiles = []; - this.preload = function (pathOrBuffer, destPath) { + this.preload = function (pathOrBuffer, destPath, fileSize) { let buffer = null; if (typeof pathOrBuffer === 'string') { const me = this; - return this.loadPromise(pathOrBuffer).then(function (xhr) { + return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) { me.preloadedFiles.push({ path: destPath || pathOrBuffer, - buffer: xhr.response, + buffer: buf, }); return Promise.resolve(); }); diff --git a/platform/javascript/js/libs/library_godot_audio.js b/platform/javascript/js/libs/library_godot_audio.js index 8e385e9176..ac4055516c 100644 --- a/platform/javascript/js/libs/library_godot_audio.js +++ b/platform/javascript/js/libs/library_godot_audio.js @@ -238,6 +238,9 @@ const GodotAudioWorklet = { close: function () { return new Promise(function (resolve, reject) { + if (GodotAudioWorklet.promise === null) { + return; + } GodotAudioWorklet.promise.then(function () { GodotAudioWorklet.worklet.port.postMessage({ 'cmd': 'stop', @@ -247,7 +250,7 @@ const GodotAudioWorklet = { GodotAudioWorklet.worklet = null; GodotAudioWorklet.promise = null; resolve(); - }); + }).catch(function (err) { /* aborted? */ }); }); }, }, diff --git a/platform/javascript/js/libs/library_godot_display.js b/platform/javascript/js/libs/library_godot_display.js index fdb5cc0ec2..b4f1fee4ed 100644 --- a/platform/javascript/js/libs/library_godot_display.js +++ b/platform/javascript/js/libs/library_godot_display.js @@ -400,6 +400,10 @@ const GodotDisplayScreen = { $GodotDisplayScreen__deps: ['$GodotConfig', '$GodotOS', '$GL', 'emscripten_webgl_get_current_context'], $GodotDisplayScreen: { desired_size: [0, 0], + hidpi: true, + getPixelRatio: function () { + return GodotDisplayScreen.hidpi ? window.devicePixelRatio || 1 : 1; + }, isFullscreen: function () { const elem = document.fullscreenElement || document.mozFullscreenElement || document.webkitFullscreenElement || document.msFullscreenElement; @@ -477,7 +481,7 @@ const GodotDisplayScreen = { } return 0; } - const scale = window.devicePixelRatio || 1; + const scale = GodotDisplayScreen.getPixelRatio(); if (isFullscreen || wantsFullWindow) { // We need to match screen size. width = window.innerWidth * scale; @@ -555,7 +559,7 @@ const GodotDisplay = { godot_js_display_pixel_ratio_get__sig: 'f', godot_js_display_pixel_ratio_get: function () { - return window.devicePixelRatio || 1; + return GodotDisplayScreen.getPixelRatio(); }, godot_js_display_fullscreen_request__sig: 'i', @@ -581,7 +585,7 @@ const GodotDisplay = { godot_js_display_screen_size_get__sig: 'vii', godot_js_display_screen_size_get: function (width, height) { - const scale = window.devicePixelRatio || 1; + const scale = GodotDisplayScreen.getPixelRatio(); GodotRuntime.setHeapValue(width, window.screen.width * scale, 'i32'); GodotRuntime.setHeapValue(height, window.screen.height * scale, 'i32'); }, @@ -671,7 +675,7 @@ const GodotDisplay = { document.head.appendChild(link); } const old_icon = GodotDisplay.window_icon; - const png = new Blob([GodotRuntime.heapCopy(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); + const png = new Blob([GodotRuntime.heapSlice(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); GodotDisplay.window_icon = URL.createObjectURL(png); link.href = GodotDisplay.window_icon; if (old_icon) { @@ -711,7 +715,7 @@ const GodotDisplay = { const shape = GodotRuntime.parseString(p_shape); const old_shape = GodotDisplayCursor.cursors[shape]; if (p_len > 0) { - const png = new Blob([GodotRuntime.heapCopy(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); + const png = new Blob([GodotRuntime.heapSlice(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); const url = URL.createObjectURL(png); GodotDisplayCursor.cursors[shape] = { url: url, @@ -776,8 +780,8 @@ const GodotDisplay = { GodotDisplayListeners.add(canvas, 'drop', GodotDisplayDragDrop.handler(dropFiles)); }, - godot_js_display_setup_canvas__sig: 'viii', - godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen) { + godot_js_display_setup_canvas__sig: 'viiii', + godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen, p_hidpi) { const canvas = GodotConfig.canvas; GodotDisplayListeners.add(canvas, 'contextmenu', function (ev) { ev.preventDefault(); @@ -786,6 +790,7 @@ const GodotDisplay = { alert('WebGL context lost, please reload the page'); // eslint-disable-line no-alert ev.preventDefault(); }, false); + GodotDisplayScreen.hidpi = !!p_hidpi; switch (GodotConfig.canvas_resize_policy) { case 0: // None GodotDisplayScreen.desired_size = [canvas.width, canvas.height]; diff --git a/platform/javascript/js/libs/library_godot_fetch.js b/platform/javascript/js/libs/library_godot_fetch.js new file mode 100644 index 0000000000..4ae6a23593 --- /dev/null +++ b/platform/javascript/js/libs/library_godot_fetch.js @@ -0,0 +1,258 @@ +/*************************************************************************/ +/* library_godot_fetch.js */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +const GodotFetch = { + $GodotFetch__deps: ['$GodotRuntime'], + $GodotFetch: { + + onread: function (id, result) { + const obj = IDHandler.get(id); + if (!obj) { + return; + } + if (result.value) { + obj.chunks.push(result.value); + } + obj.reading = false; + obj.done = result.done; + }, + + onresponse: function (id, response) { + const obj = IDHandler.get(id); + if (!obj) { + return; + } + let size = -1; + let compressed = false; + let chunked = false; + response.headers.forEach(function (value, header) { + const v = value.toLowerCase().trim(); + const h = header.toLowerCase().trim(); + if (h === 'content-encoding') { + compressed = true; + size = -1; + } else if (h === 'content-length') { + const len = Number.parseInt(value, 10); + if (!Number.isNaN(len) && !compressed) { + size = len; + } + } else if (h === 'transfer-encoding' && v === 'chunked') { + chunked = true; + } + }); + obj.bodySize = size; + obj.status = response.status; + obj.response = response; + obj.reader = response.body.getReader(); + obj.chunked = chunked; + }, + + onerror: function (id, err) { + GodotRuntime.error(err); + const obj = IDHandler.get(id); + if (!obj) { + return; + } + obj.error = err; + }, + + create: function (method, url, headers, body) { + const obj = { + request: null, + response: null, + reader: null, + error: null, + done: false, + reading: false, + status: 0, + chunks: [], + bodySize: -1, + }; + const id = IDHandler.add(obj); + const init = { + method: method, + headers: headers, + body: body, + }; + obj.request = fetch(url, init); + obj.request.then(GodotFetch.onresponse.bind(null, id)).catch(GodotFetch.onerror.bind(null, id)); + return id; + }, + + free: function (id) { + const obj = IDHandler.get(id); + if (!obj) { + return; + } + IDHandler.remove(id); + if (!obj.request) { + return; + } + // Try to abort + obj.request.then(function (response) { + response.abort(); + }).catch(function (e) { /* nothing to do */ }); + }, + + read: function (id) { + const obj = IDHandler.get(id); + if (!obj) { + return; + } + if (obj.reader && !obj.reading) { + if (obj.done) { + obj.reader = null; + return; + } + obj.reading = true; + obj.reader.read().then(GodotFetch.onread.bind(null, id)).catch(GodotFetch.onerror.bind(null, id)); + } + }, + }, + + godot_js_fetch_create__sig: 'iii', + godot_js_fetch_create: function (p_method, p_url, p_headers, p_headers_size, p_body, p_body_size) { + const method = GodotRuntime.parseString(p_method); + const url = GodotRuntime.parseString(p_url); + const headers = GodotRuntime.parseStringArray(p_headers, p_headers_size); + const body = p_body_size ? GodotRuntime.heapSlice(HEAP8, p_body, p_body_size) : null; + return GodotFetch.create(method, url, headers.map(function (hv) { + const idx = hv.indexOf(':'); + if (idx <= 0) { + return []; + } + return [ + hv.slice(0, idx).trim(), + hv.slice(idx + 1).trim(), + ]; + }).filter(function (v) { + return v.length === 2; + }), body); + }, + + godot_js_fetch_state_get__sig: 'ii', + godot_js_fetch_state_get: function (p_id) { + const obj = IDHandler.get(p_id); + if (!obj) { + return -1; + } + if (obj.error) { + return -1; + } + if (!obj.response) { + return 0; + } + if (obj.reader) { + return 1; + } + if (obj.done) { + return 2; + } + return -1; + }, + + godot_js_fetch_http_status_get__sig: 'ii', + godot_js_fetch_http_status_get: function (p_id) { + const obj = IDHandler.get(p_id); + if (!obj || !obj.response) { + return 0; + } + return obj.status; + }, + + godot_js_fetch_read_headers__sig: 'iii', + godot_js_fetch_read_headers: function (p_id, p_parse_cb, p_ref) { + const obj = IDHandler.get(p_id); + if (!obj || !obj.response) { + return 1; + } + const cb = GodotRuntime.get_func(p_parse_cb); + const arr = []; + obj.response.headers.forEach(function (v, h) { + arr.push(`${h}:${v}`); + }); + const c_ptr = GodotRuntime.allocStringArray(arr); + cb(arr.length, c_ptr, p_ref); + GodotRuntime.freeStringArray(c_ptr, arr.length); + return 0; + }, + + godot_js_fetch_read_chunk__sig: 'ii', + godot_js_fetch_read_chunk: function (p_id, p_buf, p_buf_size) { + const obj = IDHandler.get(p_id); + if (!obj || !obj.response) { + return 0; + } + let to_read = p_buf_size; + const chunks = obj.chunks; + while (to_read && chunks.length) { + const chunk = obj.chunks[0]; + if (chunk.length > to_read) { + GodotRuntime.heapCopy(HEAP8, chunk.slice(0, to_read), p_buf); + chunks[0] = chunk.slice(to_read); + to_read = 0; + } else { + GodotRuntime.heapCopy(HEAP8, chunk, p_buf); + to_read -= chunk.length; + chunks.pop(); + } + } + if (!chunks.length) { + GodotFetch.read(p_id); + } + return p_buf_size - to_read; + }, + + godot_js_fetch_body_length_get__sig: 'ii', + godot_js_fetch_body_length_get: function (p_id) { + const obj = IDHandler.get(p_id); + if (!obj || !obj.response) { + return -1; + } + return obj.bodySize; + }, + + godot_js_fetch_is_chunked__sig: 'ii', + godot_js_fetch_is_chunked: function (p_id) { + const obj = IDHandler.get(p_id); + if (!obj || !obj.response) { + return -1; + } + return obj.chunked ? 1 : 0; + }, + + godot_js_fetch_free__sig: 'vi', + godot_js_fetch_free: function (id) { + GodotFetch.free(id); + }, +}; + +autoAddDeps(GodotFetch, '$GodotFetch'); +mergeInto(LibraryManager.library, GodotFetch); diff --git a/platform/javascript/js/libs/library_godot_http_request.js b/platform/javascript/js/libs/library_godot_http_request.js deleted file mode 100644 index 7dc2a2df29..0000000000 --- a/platform/javascript/js/libs/library_godot_http_request.js +++ /dev/null @@ -1,142 +0,0 @@ -/*************************************************************************/ -/* http_request.js */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -const GodotHTTPRequest = { - $GodotHTTPRequest__deps: ['$GodotRuntime'], - $GodotHTTPRequest: { - requests: [], - - getUnusedRequestId: function () { - const idMax = GodotHTTPRequest.requests.length; - for (let potentialId = 0; potentialId < idMax; ++potentialId) { - if (GodotHTTPRequest.requests[potentialId] instanceof XMLHttpRequest) { - continue; - } - return potentialId; - } - GodotHTTPRequest.requests.push(null); - return idMax; - }, - - setupRequest: function (xhr) { - xhr.responseType = 'arraybuffer'; - }, - }, - - godot_xhr_new__sig: 'i', - godot_xhr_new: function () { - const newId = GodotHTTPRequest.getUnusedRequestId(); - GodotHTTPRequest.requests[newId] = new XMLHttpRequest(); - GodotHTTPRequest.setupRequest(GodotHTTPRequest.requests[newId]); - return newId; - }, - - godot_xhr_reset__sig: 'vi', - godot_xhr_reset: function (xhrId) { - GodotHTTPRequest.requests[xhrId] = new XMLHttpRequest(); - GodotHTTPRequest.setupRequest(GodotHTTPRequest.requests[xhrId]); - }, - - godot_xhr_free__sig: 'vi', - godot_xhr_free: function (xhrId) { - GodotHTTPRequest.requests[xhrId].abort(); - GodotHTTPRequest.requests[xhrId] = null; - }, - - godot_xhr_open__sig: 'viiiii', - godot_xhr_open: function (xhrId, method, url, p_user, p_password) { - const user = p_user > 0 ? GodotRuntime.parseString(p_user) : null; - const password = p_password > 0 ? GodotRuntime.parseString(p_password) : null; - GodotHTTPRequest.requests[xhrId].open(GodotRuntime.parseString(method), GodotRuntime.parseString(url), true, user, password); - }, - - godot_xhr_set_request_header__sig: 'viii', - godot_xhr_set_request_header: function (xhrId, header, value) { - GodotHTTPRequest.requests[xhrId].setRequestHeader(GodotRuntime.parseString(header), GodotRuntime.parseString(value)); - }, - - godot_xhr_send__sig: 'viii', - godot_xhr_send: function (xhrId, p_ptr, p_len) { - let data = null; - if (p_ptr && p_len) { - data = GodotRuntime.heapCopy(HEAP8, p_ptr, p_len); - } - GodotHTTPRequest.requests[xhrId].send(data); - }, - - godot_xhr_abort__sig: 'vi', - godot_xhr_abort: function (xhrId) { - GodotHTTPRequest.requests[xhrId].abort(); - }, - - godot_xhr_get_status__sig: 'ii', - godot_xhr_get_status: function (xhrId) { - return GodotHTTPRequest.requests[xhrId].status; - }, - - godot_xhr_get_ready_state__sig: 'ii', - godot_xhr_get_ready_state: function (xhrId) { - return GodotHTTPRequest.requests[xhrId].readyState; - }, - - godot_xhr_get_response_headers_length__sig: 'ii', - godot_xhr_get_response_headers_length: function (xhrId) { - const headers = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); - return headers === null ? 0 : GodotRuntime.strlen(headers); - }, - - godot_xhr_get_response_headers__sig: 'viii', - godot_xhr_get_response_headers: function (xhrId, dst, len) { - const str = GodotHTTPRequest.requests[xhrId].getAllResponseHeaders(); - if (str === null) { - return; - } - GodotRuntime.stringToHeap(str, dst, len); - }, - - godot_xhr_get_response_length__sig: 'ii', - godot_xhr_get_response_length: function (xhrId) { - const body = GodotHTTPRequest.requests[xhrId].response; - return body === null ? 0 : body.byteLength; - }, - - godot_xhr_get_response__sig: 'viii', - godot_xhr_get_response: function (xhrId, dst, len) { - let buf = GodotHTTPRequest.requests[xhrId].response; - if (buf === null) { - return; - } - buf = new Uint8Array(buf).subarray(0, len); - HEAPU8.set(buf, dst); - }, -}; - -autoAddDeps(GodotHTTPRequest, '$GodotHTTPRequest'); -mergeInto(LibraryManager.library, GodotHTTPRequest); diff --git a/platform/javascript/js/libs/library_godot_runtime.js b/platform/javascript/js/libs/library_godot_runtime.js index 7e36ff8ab5..3da1ed8f06 100644 --- a/platform/javascript/js/libs/library_godot_runtime.js +++ b/platform/javascript/js/libs/library_godot_runtime.js @@ -72,11 +72,16 @@ const GodotRuntime = { return p_heap.subarray(p_ptr / bytes, p_ptr / bytes + p_len); }, - heapCopy: function (p_heap, p_ptr, p_len) { + heapSlice: function (p_heap, p_ptr, p_len) { const bytes = p_heap.BYTES_PER_ELEMENT; return p_heap.slice(p_ptr / bytes, p_ptr / bytes + p_len); }, + heapCopy: function (p_dst, p_src, p_ptr) { + const bytes = p_src.BYTES_PER_ELEMENT; + return p_dst.set(p_src, p_ptr / bytes); + }, + /* * Strings */ @@ -84,6 +89,15 @@ const GodotRuntime = { return UTF8ToString(p_ptr); // eslint-disable-line no-undef }, + parseStringArray: function (p_ptr, p_size) { + const strings = []; + const ptrs = GodotRuntime.heapSub(HEAP32, p_ptr, p_size); // TODO wasm64 + ptrs.forEach(function (ptr) { + strings.push(GodotRuntime.parseString(ptr)); + }); + return strings; + }, + strlen: function (p_str) { return lengthBytesUTF8(p_str); // eslint-disable-line no-undef }, diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index d7f7054acb..3bc859e17d 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -4030,7 +4030,10 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode use_prime = 0; } - if (getenv("LD_LIBRARY_PATH")) { + // Some tools use fake libGL libraries and have them override the real one using + // LD_LIBRARY_PATH, so we skip them. *But* Steam also sets LD_LIBRARY_PATH for its + // runtime and includes system `/lib` and `/lib64`... so ignore Steam. + if (use_prime == -1 && getenv("LD_LIBRARY_PATH") && !getenv("STEAM_RUNTIME_LIBRARY_PATH")) { String ld_library_path(getenv("LD_LIBRARY_PATH")); Vector<String> libraries = ld_library_path.split(":"); diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index c5ac4e1a05..9030cc4263 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -569,6 +569,7 @@ void Camera2D::_set_old_smoothing(float p_enable) { void Camera2D::set_enable_follow_smoothing(bool p_enabled) { smoothing_enabled = p_enabled; + notify_property_list_changed(); } bool Camera2D::is_follow_smoothing_enabled() const { @@ -642,6 +643,12 @@ bool Camera2D::is_margin_drawing_enabled() const { return margin_drawing_enabled; } +void Camera2D::_validate_property(PropertyInfo &property) const { + if (!smoothing_enabled && property.name == "smoothing_speed") { + property.usage = PROPERTY_USAGE_NOEDITOR; + } +} + void Camera2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_offset", "offset"), &Camera2D::set_offset); ClassDB::bind_method(D_METHOD("get_offset"), &Camera2D::get_offset); diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 252d2686fc..220e208eb0 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -97,8 +97,10 @@ protected: protected: virtual Transform2D get_camera_transform(); + void _notification(int p_what); static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: void set_offset(const Vector2 &p_offset); diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index 39d7705226..38198c496e 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -41,13 +41,13 @@ void CollisionPolygon2D::_build_polygon() { parent->shape_owner_clear_shapes(owner_id); - if (polygon.size() == 0) { - return; - } - bool solids = build_mode == BUILD_SOLIDS; if (solids) { + if (polygon.size() < 3) { + return; + } + //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them Vector<Vector<Vector2>> decomp = _decompose_in_convex(); @@ -58,6 +58,10 @@ void CollisionPolygon2D::_build_polygon() { } } else { + if (polygon.size() < 2) { + return; + } + Ref<ConcavePolygonShape2D> concave = memnew(ConcavePolygonShape2D); Vector<Vector2> segments; @@ -132,25 +136,28 @@ void CollisionPolygon2D::_notification(int p_what) { break; } - for (int i = 0; i < polygon.size(); i++) { + int polygon_count = polygon.size(); + for (int i = 0; i < polygon_count; i++) { Vector2 p = polygon[i]; - Vector2 n = polygon[(i + 1) % polygon.size()]; + Vector2 n = polygon[(i + 1) % polygon_count]; // draw line with width <= 1, so it does not scale with zoom and break pixel exact editing draw_line(p, n, Color(0.9, 0.2, 0.0, 0.8), 1); } + + if (polygon_count > 2) { #define DEBUG_DECOMPOSE #if defined(TOOLS_ENABLED) && defined(DEBUG_DECOMPOSE) + Vector<Vector<Vector2>> decomp = _decompose_in_convex(); - Vector<Vector<Vector2>> decomp = _decompose_in_convex(); - - Color c(0.4, 0.9, 0.1); - for (int i = 0; i < decomp.size(); i++) { - c.set_hsv(Math::fmod(c.get_h() + 0.738, 1), c.get_s(), c.get_v(), 0.5); - draw_colored_polygon(decomp[i], c); - } + Color c(0.4, 0.9, 0.1); + for (int i = 0; i < decomp.size(); i++) { + c.set_hsv(Math::fmod(c.get_h() + 0.738, 1), c.get_s(), c.get_v(), 0.5); + draw_colored_polygon(decomp[i], c); + } #else - draw_colored_polygon(polygon, get_tree()->get_debug_collisions_color()); + draw_colored_polygon(polygon, get_tree()->get_debug_collisions_color()); #endif + } if (one_way_collision) { Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); @@ -211,6 +218,8 @@ void CollisionPolygon2D::set_build_mode(BuildMode p_mode) { _build_polygon(); _update_in_shape_owner(); } + update(); + update_configuration_warning(); } CollisionPolygon2D::BuildMode CollisionPolygon2D::get_build_mode() const { @@ -241,11 +250,27 @@ String CollisionPolygon2D::get_configuration_warning() const { warning += TTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } - if (polygon.is_empty()) { + int polygon_count = polygon.size(); + if (polygon_count == 0) { if (!warning.is_empty()) { warning += "\n\n"; } warning += TTR("An empty CollisionPolygon2D has no effect on collision."); + } else { + bool solids = build_mode == BUILD_SOLIDS; + if (solids) { + if (polygon_count < 3) { + if (!warning.is_empty()) { + warning += "\n\n"; + } + warning += TTR("Invalid polygon. At least 3 points are needed in 'Solids' build mode."); + } + } else if (polygon_count < 2) { + if (!warning.is_empty()) { + warning += "\n\n"; + } + warning += TTR("Invalid polygon. At least 2 points are needed in 'Segments' build mode."); + } } return warning; diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index 15fcb08422..58e15e3cca 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -159,6 +159,7 @@ int Light2D::get_item_shadow_cull_mask() const { void Light2D::set_shadow_enabled(bool p_enabled) { shadow = p_enabled; RS::get_singleton()->canvas_light_set_shadow_enabled(canvas_light, shadow); + notify_property_list_changed(); } bool Light2D::is_shadow_enabled() const { @@ -221,6 +222,12 @@ float Light2D::get_shadow_smooth() const { return shadow_smooth; } +void Light2D::_validate_property(PropertyInfo &property) const { + if (!shadow && (property.name == "shadow_color" || property.name == "shadow_filter" || property.name == "shadow_filter_smooth" || property.name == "shadow_item_cull_mask")) { + property.usage = PROPERTY_USAGE_NOEDITOR; + } +} + void Light2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &Light2D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &Light2D::is_enabled); diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h index 4279baf15b..de8a2bb6d0 100644 --- a/scene/2d/light_2d.h +++ b/scene/2d/light_2d.h @@ -77,6 +77,7 @@ protected: _FORCE_INLINE_ RID _get_light() const { return canvas_light; } void _notification(int p_what); static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: void set_enabled(bool p_enabled); diff --git a/scene/2d/polygon_2d.cpp b/scene/2d/polygon_2d.cpp index a60a32f1d2..2bb75e5967 100644 --- a/scene/2d/polygon_2d.cpp +++ b/scene/2d/polygon_2d.cpp @@ -88,13 +88,13 @@ bool Polygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_toler } return Geometry2D::is_point_in_polygon(p_point - get_offset(), polygon2d); } +#endif void Polygon2D::_validate_property(PropertyInfo &property) const { if (!invert && property.name == "invert_border") { property.usage = PROPERTY_USAGE_NOEDITOR; } } -#endif void Polygon2D::_skeleton_bone_setup_changed() { update(); diff --git a/scene/2d/polygon_2d.h b/scene/2d/polygon_2d.h index 43a66aad13..b329251277 100644 --- a/scene/2d/polygon_2d.h +++ b/scene/2d/polygon_2d.h @@ -72,13 +72,10 @@ class Polygon2D : public Node2D { void _skeleton_bone_setup_changed(); -#ifdef TOOLS_ENABLED - void _validate_property(PropertyInfo &property) const override; -#endif - protected: void _notification(int p_what); static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: #ifdef TOOLS_ENABLED diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 2cc3a74270..50625a0f39 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -159,30 +159,7 @@ void RayCast2D::_notification(int p_what) { if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; } - Transform2D xf; - xf.rotate(target_position.angle()); - xf.translate(Vector2(target_position.length(), 0)); - - // Draw an arrow indicating where the RayCast is pointing to - Color draw_col = get_tree()->get_debug_collisions_color(); - if (!enabled) { - float g = draw_col.get_v(); - draw_col.r = g; - draw_col.g = g; - draw_col.b = g; - } - draw_line(Vector2(), target_position, draw_col, 2); - Vector<Vector2> pts; - float tsize = 8.0; - pts.push_back(xf.xform(Vector2(tsize, 0))); - pts.push_back(xf.xform(Vector2(0, Math_SQRT12 * tsize))); - pts.push_back(xf.xform(Vector2(0, -Math_SQRT12 * tsize))); - Vector<Color> cols; - for (int i = 0; i < 3; i++) { - cols.push_back(draw_col); - } - - draw_primitive(pts, cols, Vector<Vector2>()); + _draw_debug_shape(); } break; @@ -212,7 +189,7 @@ void RayCast2D::_update_raycast_state() { } PhysicsDirectSpaceState2D::RayResult rr; - + bool prev_collision_state = collided; if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) { collided = true; against = rr.collider_id; @@ -224,6 +201,48 @@ void RayCast2D::_update_raycast_state() { against = ObjectID(); against_shape = 0; } + + if (prev_collision_state != collided) { + update(); + } +} + +void RayCast2D::_draw_debug_shape() { + Color draw_col = collided ? Color(1.0, 0.01, 0) : get_tree()->get_debug_collisions_color(); + if (!enabled) { + float g = draw_col.get_v(); + draw_col.r = g; + draw_col.g = g; + draw_col.b = g; + } + + // Draw an arrow indicating where the RayCast is pointing to + const float max_arrow_size = 6; + const float line_width = 1.4; + bool no_line = target_position.length() < line_width; + float arrow_size = CLAMP(target_position.length() * 2 / 3, line_width, max_arrow_size); + + if (no_line) { + arrow_size = target_position.length(); + } else { + draw_line(Vector2(), target_position - target_position.normalized() * arrow_size, draw_col, line_width); + } + + Transform2D xf; + xf.rotate(target_position.angle()); + xf.translate(Vector2(no_line ? 0 : target_position.length() - arrow_size, 0)); + + Vector<Vector2> pts; + pts.push_back(xf.xform(Vector2(arrow_size, 0))); + pts.push_back(xf.xform(Vector2(0, 0.5 * arrow_size))); + pts.push_back(xf.xform(Vector2(0, -0.5 * arrow_size))); + + Vector<Color> cols; + for (int i = 0; i < 3; i++) { + cols.push_back(draw_col); + } + + draw_primitive(pts, cols, Vector<Vector2>()); } void RayCast2D::force_raycast_update() { diff --git a/scene/2d/ray_cast_2d.h b/scene/2d/ray_cast_2d.h index dab3302e25..984c6bda49 100644 --- a/scene/2d/ray_cast_2d.h +++ b/scene/2d/ray_cast_2d.h @@ -51,6 +51,8 @@ class RayCast2D : public Node2D { bool collide_with_areas = false; bool collide_with_bodies = true; + void _draw_debug_shape(); + protected: void _notification(int p_what); void _update_raycast_state(); diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp index b5eab35605..7d6abe458a 100644 --- a/scene/3d/decal.cpp +++ b/scene/3d/decal.cpp @@ -154,13 +154,11 @@ Vector<Face3> Decal::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } -#ifdef TOOLS_ENABLED void Decal::_validate_property(PropertyInfo &property) const { if (!distance_fade_enabled && (property.name == "distance_fade_begin" || property.name == "distance_fade_length")) { property.usage = PROPERTY_USAGE_NOEDITOR; } } -#endif void Decal::_bind_methods() { ClassDB::bind_method(D_METHOD("set_extents", "extents"), &Decal::set_extents); diff --git a/scene/3d/decal.h b/scene/3d/decal.h index 20d86ee16c..ce19e76de1 100644 --- a/scene/3d/decal.h +++ b/scene/3d/decal.h @@ -62,12 +62,9 @@ private: float distance_fade_begin = 10.0; float distance_fade_length = 1.0; -#ifdef TOOLS_ENABLED - void _validate_property(PropertyInfo &property) const override; -#endif - protected: static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: void set_extents(const Vector3 &p_extents); diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index 87f54022b3..f109640aef 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -204,7 +204,7 @@ bool Light3D::is_editor_only() const { } void Light3D::_validate_property(PropertyInfo &property) const { - if (!shadow && (property.name == "shadow_color" || property.name == "shadow_color" || property.name == "shadow_bias" || property.name == "shadow_normal_bias" || property.name == "shadow_reverse_cull_face" || property.name == "shadow_transmittance_bias" || property.name == "shadow_blur")) { + if (!shadow && (property.name == "shadow_color" || property.name == "shadow_bias" || property.name == "shadow_normal_bias" || property.name == "shadow_reverse_cull_face" || property.name == "shadow_transmittance_bias" || property.name == "shadow_fog_fade" || property.name == "shadow_blur")) { property.usage = PROPERTY_USAGE_NOEDITOR; } diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp index bfe79f15f5..465de2cb47 100644 --- a/scene/3d/ray_cast_3d.cpp +++ b/scene/3d/ray_cast_3d.cpp @@ -37,10 +37,13 @@ void RayCast3D::set_target_position(const Vector3 &p_point) { target_position = p_point; - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) { - update_gizmo(); - } - if (is_inside_tree() && get_tree()->is_debugging_collisions_hint()) { + update_gizmo(); + + if (Engine::get_singleton()->is_editor_hint()) { + if (is_inside_tree()) { + _update_debug_shape_vertices(); + } + } else if (debug_shape) { _update_debug_shape(); } } @@ -146,6 +149,9 @@ bool RayCast3D::get_exclude_parent_body() const { void RayCast3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { + if (Engine::get_singleton()->is_editor_hint()) { + _update_debug_shape_vertices(); + } if (enabled && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(true); } else { @@ -183,10 +189,7 @@ void RayCast3D::_notification(int p_what) { bool prev_collision_state = collided; _update_raycast_state(); if (prev_collision_state != collided && get_tree()->is_debugging_collisions_hint()) { - if (debug_material.is_valid()) { - Ref<StandardMaterial3D> line_material = static_cast<Ref<StandardMaterial3D>>(debug_material); - line_material->set_albedo(collided ? Color(1.0, 0, 0) : Color(1.0, 0.8, 0.6)); - } + _update_debug_shape_material(true); } } break; @@ -310,6 +313,12 @@ void RayCast3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collide_with_bodies", "enable"), &RayCast3D::set_collide_with_bodies); ClassDB::bind_method(D_METHOD("is_collide_with_bodies_enabled"), &RayCast3D::is_collide_with_bodies_enabled); + ClassDB::bind_method(D_METHOD("set_debug_shape_custom_color", "debug_shape_custom_color"), &RayCast3D::set_debug_shape_custom_color); + ClassDB::bind_method(D_METHOD("get_debug_shape_custom_color"), &RayCast3D::get_debug_shape_custom_color); + + ClassDB::bind_method(D_METHOD("set_debug_shape_thickness", "debug_shape_thickness"), &RayCast3D::set_debug_shape_thickness); + ClassDB::bind_method(D_METHOD("get_debug_shape_thickness"), &RayCast3D::get_debug_shape_thickness); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "exclude_parent"), "set_exclude_parent_body", "get_exclude_parent_body"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "target_position"), "set_target_position", "get_target_position"); @@ -318,16 +327,80 @@ void RayCast3D::_bind_methods() { ADD_GROUP("Collide With", "collide_with"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_areas", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collide_with_areas", "is_collide_with_areas_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "collide_with_bodies", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collide_with_bodies", "is_collide_with_bodies_enabled"); + + ADD_GROUP("Debug Shape", "debug_shape"); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "debug_shape_custom_color"), "set_debug_shape_custom_color", "get_debug_shape_custom_color"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "debug_shape_thickness", PROPERTY_HINT_RANGE, "1,5"), "set_debug_shape_thickness", "get_debug_shape_thickness"); } -void RayCast3D::_create_debug_shape() { - if (!debug_material.is_valid()) { - debug_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); +float RayCast3D::get_debug_shape_thickness() const { + return debug_shape_thickness; +} + +void RayCast3D::_update_debug_shape_vertices() { + debug_shape_vertices.clear(); + debug_line_vertices.clear(); + + if (target_position == Vector3()) { + return; + } + + debug_line_vertices.push_back(Vector3()); + debug_line_vertices.push_back(target_position); + + if (debug_shape_thickness > 1) { + float scale_factor = 100.0; + Vector3 dir = Vector3(target_position).normalized(); + // Draw truncated pyramid + Vector3 normal = (fabs(dir.x) + fabs(dir.y) > CMP_EPSILON) ? Vector3(-dir.y, dir.x, 0).normalized() : Vector3(0, -dir.z, dir.y).normalized(); + normal *= debug_shape_thickness / scale_factor; + int vertices_strip_order[14] = { 4, 5, 0, 1, 2, 5, 6, 4, 7, 0, 3, 2, 7, 6 }; + for (int v = 0; v < 14; v++) { + Vector3 vertex = vertices_strip_order[v] < 4 ? normal : normal / 3.0 + target_position; + debug_shape_vertices.push_back(vertex.rotated(dir, Math_PI * (0.5 * (vertices_strip_order[v] % 4) + 0.25))); + } + } +} + +void RayCast3D::set_debug_shape_thickness(const float p_debug_shape_thickness) { + debug_shape_thickness = p_debug_shape_thickness; + update_gizmo(); + + if (Engine::get_singleton()->is_editor_hint()) { + if (is_inside_tree()) { + _update_debug_shape_vertices(); + } + } else if (debug_shape) { + _update_debug_shape(); + } +} + +const Vector<Vector3> &RayCast3D::get_debug_shape_vertices() const { + return debug_shape_vertices; +} - Ref<StandardMaterial3D> line_material = static_cast<Ref<StandardMaterial3D>>(debug_material); - line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); - line_material->set_albedo(Color(1.0, 0.8, 0.6)); +const Vector<Vector3> &RayCast3D::get_debug_line_vertices() const { + return debug_line_vertices; +} + +void RayCast3D::set_debug_shape_custom_color(const Color &p_color) { + debug_shape_custom_color = p_color; + if (debug_material.is_valid()) { + _update_debug_shape_material(); } +} + +Ref<StandardMaterial3D> RayCast3D::get_debug_material() { + _update_debug_shape_material(); + return debug_material; +} + +const Color &RayCast3D::get_debug_shape_custom_color() const { + return debug_shape_custom_color; +} + +void RayCast3D::_create_debug_shape() { + _update_debug_shape_material(); Ref<ArrayMesh> mesh = memnew(ArrayMesh); @@ -338,6 +411,35 @@ void RayCast3D::_create_debug_shape() { debug_shape = mi; } +void RayCast3D::_update_debug_shape_material(bool p_check_collision) { + if (!debug_material.is_valid()) { + Ref<StandardMaterial3D> material = memnew(StandardMaterial3D); + debug_material = material; + + material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); + material->set_transparency(BaseMaterial3D::TRANSPARENCY_ALPHA); + } + + Color color = debug_shape_custom_color; + if (color == Color(0.0, 0.0, 0.0)) { + // Use the default debug shape color defined in the Project Settings. + color = get_tree()->get_debug_collisions_color(); + } + + if (p_check_collision) { + if ((color.get_h() < 0.055 || color.get_h() > 0.945) && color.get_s() > 0.5 && color.get_v() > 0.5) { + // If base color is already quite reddish, hightlight collision with green color + color = Color(0.0, 1.0, 0.0, color.a); + } else { + // Else, hightlight collision with red color + color = Color(1.0, 0, 0, color.a); + } + } + + Ref<StandardMaterial3D> material = static_cast<Ref<StandardMaterial3D>>(debug_material); + material->set_albedo(color); +} + void RayCast3D::_update_debug_shape() { if (!enabled) { return; @@ -353,26 +455,28 @@ void RayCast3D::_update_debug_shape() { return; } - Vector<Vector3> verts; - verts.push_back(Vector3()); - verts.push_back(target_position); + _update_debug_shape_vertices(); - if (mesh->get_surface_count() == 0) { - Array a; - a.resize(Mesh::ARRAY_MAX); - a[Mesh::ARRAY_VERTEX] = verts; + mesh->clear_surfaces(); - uint32_t flags = Mesh::ARRAY_FLAG_USE_DYNAMIC_UPDATE; + Array a; + a.resize(Mesh::ARRAY_MAX); + uint32_t flags = 0; + int surface_count = 0; + + if (!debug_line_vertices.is_empty()) { + a[Mesh::ARRAY_VERTEX] = debug_line_vertices; mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, a, Array(), Dictionary(), flags); - mesh->surface_set_material(0, debug_material); - } else { - Vector<uint8_t> byte_array; - int array_size = sizeof(Vector3) * verts.size(); - byte_array.resize(array_size); - copymem(byte_array.ptrw(), verts.ptr(), array_size); + mesh->surface_set_material(surface_count, debug_material); + ++surface_count; + } - RS::get_singleton()->mesh_surface_update_region(mesh->get_rid(), 0, 0, byte_array); + if (!debug_shape_vertices.is_empty()) { + a[Mesh::ARRAY_VERTEX] = debug_shape_vertices; + mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLE_STRIP, a, Array(), Dictionary(), flags); + mesh->surface_set_material(surface_count, debug_material); + ++surface_count; } } diff --git a/scene/3d/ray_cast_3d.h b/scene/3d/ray_cast_3d.h index ae92189527..968cede9f2 100644 --- a/scene/3d/ray_cast_3d.h +++ b/scene/3d/ray_cast_3d.h @@ -51,9 +51,15 @@ class RayCast3D : public Node3D { Node *debug_shape = nullptr; Ref<Material> debug_material; + Color debug_shape_custom_color = Color(0.0, 0.0, 0.0); + int debug_shape_thickness = 2; + Vector<Vector3> debug_shape_vertices; + Vector<Vector3> debug_line_vertices; void _create_debug_shape(); void _update_debug_shape(); + void _update_debug_shape_material(bool p_check_collision = false); + void _update_debug_shape_vertices(); void _clear_debug_shape(); bool collide_with_areas = false; @@ -86,6 +92,17 @@ public: void set_exclude_parent_body(bool p_exclude_parent_body); bool get_exclude_parent_body() const; + const Color &get_debug_shape_custom_color() const; + void set_debug_shape_custom_color(const Color &p_color); + + const Vector<Vector3> &get_debug_shape_vertices() const; + const Vector<Vector3> &get_debug_line_vertices() const; + + Ref<StandardMaterial3D> get_debug_material(); + + float get_debug_shape_thickness() const; + void set_debug_shape_thickness(const float p_debug_thickness); + void force_raycast_update(); bool is_colliding() const; Object *get_collider() const; diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index f881181ccd..b7a3135bd5 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -625,11 +625,9 @@ void Sprite3D::_validate_property(PropertyInfo &property) const { property.usage |= PROPERTY_USAGE_KEYING_INCREMENTS; } -#ifdef TOOLS_ENABLED if (!region && property.name == "region_rect") { property.usage = PROPERTY_USAGE_NOEDITOR; } -#endif } void Sprite3D::_bind_methods() { diff --git a/scene/3d/vehicle_body_3d.cpp b/scene/3d/vehicle_body_3d.cpp index 0d25e2f21f..8b774444b9 100644 --- a/scene/3d/vehicle_body_3d.cpp +++ b/scene/3d/vehicle_body_3d.cpp @@ -407,7 +407,7 @@ real_t VehicleBody3D::_ray_cast(int p_idx, PhysicsDirectBodyState3D *s) { PhysicsDirectSpaceState3D *ss = s->get_space_state(); - bool col = ss->intersect_ray(source, target, rr, exclude); + bool col = ss->intersect_ray(source, target, rr, exclude, get_collision_mask()); wheel.m_raycastInfo.m_groundObject = nullptr; diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index b98caf3562..be73fd8f51 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -260,7 +260,8 @@ void Label::_notification(int p_what) { } } } - visible_glyphs = total_glyphs * percent_visible; + + visible_glyphs = MIN(total_glyphs, visible_chars); } Vector2 ofs; @@ -541,6 +542,8 @@ void Label::set_visible_characters(int p_amount) { visible_chars = p_amount; if (get_total_character_count() > 0) { percent_visible = (float)p_amount / (float)get_total_character_count(); + } else { + percent_visible = 1.0; } update(); } diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 3e8ebd2429..830ffc092f 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -1154,6 +1154,8 @@ void LineEdit::cursor_set_blink_enabled(const bool p_enabled) { } draw_caret = true; + + notify_property_list_changed(); } bool LineEdit::cursor_get_force_displayed() const { @@ -2075,6 +2077,12 @@ void LineEdit::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::NIL, "opentype_features/_new", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); } +void LineEdit::_validate_property(PropertyInfo &property) const { + if (!caret_blink_enabled && property.name == "caret_blink_speed") { + property.usage = PROPERTY_USAGE_NOEDITOR; + } +} + void LineEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("_text_changed"), &LineEdit::_text_changed); diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h index f1d9de255a..ef36377f2e 100644 --- a/scene/gui/line_edit.h +++ b/scene/gui/line_edit.h @@ -198,15 +198,15 @@ private: void _backspace(bool p_word = false, bool p_all_to_left = false); void _delete(bool p_word = false, bool p_all_to_right = false); - void _gui_input(Ref<InputEvent> p_event); - void _notification(int p_what); - protected: + void _notification(int p_what); static void _bind_methods(); + void _gui_input(Ref<InputEvent> p_event); bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List<PropertyInfo> *p_list) const; + void _validate_property(PropertyInfo &property) const override; public: void set_align(Align p_align); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 682584d73f..ed319f9fd0 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -3634,6 +3634,7 @@ void RichTextLabel::set_use_bbcode(bool p_enable) { } use_bbcode = p_enable; set_bbcode(bbcode); + notify_property_list_changed(); } bool RichTextLabel::is_using_bbcode() const { @@ -3771,6 +3772,12 @@ int RichTextLabel::get_content_height() const { return total_height; } +void RichTextLabel::_validate_property(PropertyInfo &property) const { + if (!use_bbcode && property.name == "bbcode_text") { + property.usage = PROPERTY_USAGE_NOEDITOR; + } +} + void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("_gui_input"), &RichTextLabel::_gui_input); ClassDB::bind_method(D_METHOD("get_text"), &RichTextLabel::get_text); diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 2351aff0a4..e3e457d1f2 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -81,7 +81,9 @@ public: }; protected: + void _notification(int p_what); static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; private: struct Item; @@ -441,9 +443,6 @@ private: bool fit_content_height = false; -protected: - void _notification(int p_what); - public: String get_text(); void add_text(const String &p_text); diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 2c9720e4b6..d82cc98e01 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -91,6 +91,14 @@ void SpinBox::_range_click_timeout() { } } +void SpinBox::_release_mouse() { + if (drag.enabled) { + drag.enabled = false; + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); + warp_mouse(drag.capture_pos); + } +} + void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { if (!is_editable()) { return; @@ -136,12 +144,7 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { //set_default_cursor_shape(CURSOR_ARROW); range_click_timer->stop(); - - if (drag.enabled) { - drag.enabled = false; - Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); - warp_mouse(drag.capture_pos); - } + _release_mouse(); drag.allowed = false; } @@ -199,6 +202,8 @@ void SpinBox::_notification(int p_what) { } else if (p_what == NOTIFICATION_ENTER_TREE) { _adjust_width_for_icon(get_theme_icon("updown")); _value_changed(0); + } else if (p_what == NOTIFICATION_EXIT_TREE) { + _release_mouse(); } else if (p_what == NOTIFICATION_TRANSLATION_CHANGED) { _value_changed(0); } else if (p_what == NOTIFICATION_THEME_CHANGED) { diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index 4c3adf30e8..e116adb64c 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -43,6 +43,7 @@ class SpinBox : public Range { Timer *range_click_timer; void _range_click_timeout(); + void _release_mouse(); void _text_entered(const String &p_string); virtual void _value_changed(double) override; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 5a7901c11b..e488e7a914 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -2190,9 +2190,14 @@ void TextEdit::_new_line(bool p_split_current_line, bool p_above) { // No need to move the brace below if we are not taking the text with us. char32_t closing_char = _get_right_pair_symbol(indent_char); - if ((closing_char != 0) && (closing_char == text[cursor.line][cursor.column]) && !p_split_current_line) { - brace_indent = true; - ins += "\n" + ins.substr(1, ins.length() - 2); + if ((closing_char != 0) && (closing_char == text[cursor.line][cursor.column])) { + if (p_split_current_line) { + brace_indent = true; + ins += "\n" + ins.substr(1, ins.length() - 2); + } else { + brace_indent = false; + ins = "\n" + ins.substr(1, ins.length() - 2); + } } } } @@ -2984,8 +2989,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } else { if (cursor.line < selection.selecting_line || (cursor.line == selection.selecting_line && cursor.column < selection.selecting_column)) { if (selection.shiftclick_left) { - SWAP(selection.from_column, selection.to_column); - SWAP(selection.from_line, selection.to_line); selection.shiftclick_left = !selection.shiftclick_left; } selection.from_column = cursor.column; diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp index d9b29daf26..85d7edd64b 100644 --- a/scene/main/canvas_layer.cpp +++ b/scene/main/canvas_layer.cpp @@ -258,13 +258,11 @@ void CanvasLayer::_update_follow_viewport(bool p_force_exit) { } } -#ifdef TOOLS_ENABLED void CanvasLayer::_validate_property(PropertyInfo &property) const { if (!follow_viewport && property.name == "follow_viewport_scale") { property.usage = PROPERTY_USAGE_NOEDITOR; } } -#endif void CanvasLayer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_layer", "layer"), &CanvasLayer::set_layer); diff --git a/scene/main/canvas_layer.h b/scene/main/canvas_layer.h index b20b291367..899039340a 100644 --- a/scene/main/canvas_layer.h +++ b/scene/main/canvas_layer.h @@ -61,13 +61,10 @@ class CanvasLayer : public Node { void _update_locrotscale(); void _update_follow_viewport(bool p_force_exit = false); -#ifdef TOOLS_ENABLED - void _validate_property(PropertyInfo &property) const override; -#endif - protected: void _notification(int p_what); static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: void set_layer(int p_xform); diff --git a/scene/main/window.cpp b/scene/main/window.cpp index e40e990cf7..d697a1a5dd 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -826,6 +826,9 @@ bool Window::is_using_font_oversampling() const { } DisplayServer::WindowID Window::get_window_id() const { + if (embedder) { + return parent->get_window_id(); + } return window_id; } diff --git a/scene/resources/camera_effects.cpp b/scene/resources/camera_effects.cpp index 00312fc7b2..34c6bc05bc 100644 --- a/scene/resources/camera_effects.cpp +++ b/scene/resources/camera_effects.cpp @@ -145,7 +145,6 @@ void CameraEffects::_update_override_exposure() { // Private methods, constructor and destructor -#ifdef TOOLS_ENABLED void CameraEffects::_validate_property(PropertyInfo &property) const { if ((!dof_blur_far_enabled && (property.name == "dof_blur_far_distance" || property.name == "dof_blur_far_transition")) || (!dof_blur_near_enabled && (property.name == "dof_blur_near_distance" || property.name == "dof_blur_near_transition")) || @@ -153,7 +152,6 @@ void CameraEffects::_validate_property(PropertyInfo &property) const { property.usage = PROPERTY_USAGE_NOEDITOR; } } -#endif void CameraEffects::_bind_methods() { // DOF blur diff --git a/scene/resources/camera_effects.h b/scene/resources/camera_effects.h index 51fb2b6cf7..b9338f4806 100644 --- a/scene/resources/camera_effects.h +++ b/scene/resources/camera_effects.h @@ -57,12 +57,9 @@ private: float override_exposure = 1.0; void _update_override_exposure(); -#ifdef TOOLS_ENABLED - void _validate_property(PropertyInfo &property) const override; -#endif - protected: static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: virtual RID get_rid() const override; diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp index d331f83daf..6e56f6e7fc 100644 --- a/scene/resources/convex_polygon_shape_2d.cpp +++ b/scene/resources/convex_polygon_shape_2d.cpp @@ -72,6 +72,10 @@ void ConvexPolygonShape2D::_bind_methods() { } void ConvexPolygonShape2D::draw(const RID &p_to_rid, const Color &p_color) { + if (points.size() < 3) { + return; + } + Vector<Color> col; col.push_back(p_color); RenderingServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index a94209c75f..ddf1fc3db4 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -1017,7 +1017,7 @@ void make_default_theme(bool p_hidpi, Ref<Font> p_font) { Ref<StyleBox> default_style; Ref<Texture2D> default_icon; Ref<Font> default_font; - int default_font_size = 16; + int default_font_size = 14; if (p_font.is_valid()) { default_font = p_font; } else if (p_hidpi) { diff --git a/scene/resources/style_box.cpp b/scene/resources/style_box.cpp index 9b80224c3f..2159f1bc97 100644 --- a/scene/resources/style_box.cpp +++ b/scene/resources/style_box.cpp @@ -460,6 +460,7 @@ Point2 StyleBoxFlat::get_shadow_offset() const { void StyleBoxFlat::set_anti_aliased(const bool &p_anti_aliased) { anti_aliased = p_anti_aliased; emit_changed(); + notify_property_list_changed(); } bool StyleBoxFlat::is_anti_aliased() const { @@ -781,6 +782,12 @@ float StyleBoxFlat::get_style_margin(Side p_side) const { return border_width[p_side]; } +void StyleBoxFlat::_validate_property(PropertyInfo &property) const { + if (!anti_aliased && property.name == "anti_aliasing_size") { + property.usage = PROPERTY_USAGE_NOEDITOR; + } +} + void StyleBoxFlat::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bg_color", "color"), &StyleBoxFlat::set_bg_color); ClassDB::bind_method(D_METHOD("get_bg_color"), &StyleBoxFlat::get_bg_color); diff --git a/scene/resources/style_box.h b/scene/resources/style_box.h index 8a273afbfd..dd5c873a00 100644 --- a/scene/resources/style_box.h +++ b/scene/resources/style_box.h @@ -159,6 +159,7 @@ class StyleBoxFlat : public StyleBox { protected: virtual float get_style_margin(Side p_side) const override; static void _bind_methods(); + void _validate_property(PropertyInfo &property) const override; public: //Color diff --git a/servers/physics_3d/body_3d_sw.cpp b/servers/physics_3d/body_3d_sw.cpp index 82356e77ef..9eff14bbeb 100644 --- a/servers/physics_3d/body_3d_sw.cpp +++ b/servers/physics_3d/body_3d_sw.cpp @@ -51,18 +51,18 @@ void Body3DSW::_update_transform_dependant() { } void Body3DSW::update_inertias() { - //update shapes and motions + // Update shapes and motions. switch (mode) { case PhysicsServer3D::BODY_MODE_RIGID: { - //update tensor for all shapes, not the best way but should be somehow OK. (inspired from bullet) + // Update tensor for all shapes, not the best way but should be somehow OK. (inspired from bullet) real_t total_area = 0; for (int i = 0; i < get_shape_count(); i++) { total_area += get_shape_area(i); } - // We have to recompute the center of mass + // We have to recompute the center of mass. center_of_mass_local.zero(); for (int i = 0; i < get_shape_count(); i++) { @@ -70,21 +70,24 @@ void Body3DSW::update_inertias() { real_t mass = area * this->mass / total_area; - // NOTE: we assume that the shape origin is also its center of mass + // NOTE: we assume that the shape origin is also its center of mass. center_of_mass_local += mass * get_shape_transform(i).origin; } center_of_mass_local /= mass; - // Recompute the inertia tensor + // Recompute the inertia tensor. Basis inertia_tensor; inertia_tensor.set_zero(); + bool inertia_set = false; for (int i = 0; i < get_shape_count(); i++) { if (is_shape_disabled(i)) { continue; } + inertia_set = true; + const Shape3DSW *shape = get_shape(i); real_t area = get_shape_area(i); @@ -102,7 +105,12 @@ void Body3DSW::update_inertias() { inertia_tensor += shape_inertia_tensor + (Basis() * shape_origin.dot(shape_origin) - shape_origin.outer(shape_origin)) * mass; } - // Compute the principal axes of inertia + // Set the inertia to a valid value when there are no valid shapes. + if (!inertia_set) { + inertia_tensor.set_diagonal(Vector3(1.0, 1.0, 1.0)); + } + + // Compute the principal axes of inertia. principal_inertia_axes_local = inertia_tensor.diagonalize().transposed(); _inv_inertia = inertia_tensor.get_main_diagonal().inverse(); diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index 081154aa1d..7f3fc2f8f4 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -527,11 +527,11 @@ void RendererCanvasCull::canvas_item_add_line(RID p_item, const Point2 &p_from, Item::CommandPrimitive *line = canvas_item->alloc_command<Item::CommandPrimitive>(); ERR_FAIL_COND(!line); if (p_width > 1.001) { - Vector2 t = (p_from - p_to).orthogonal().normalized(); - line->points[0] = p_from + t * p_width; - line->points[1] = p_from - t * p_width; - line->points[2] = p_to - t * p_width; - line->points[3] = p_to + t * p_width; + Vector2 t = (p_from - p_to).orthogonal().normalized() * p_width * 0.5; + line->points[0] = p_from + t; + line->points[1] = p_from - t; + line->points[2] = p_to - t; + line->points[3] = p_to + t; line->point_count = 4; } else { line->point_count = 2; diff --git a/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp index 62589cc97c..bfb5b729ef 100644 --- a/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp @@ -31,7 +31,6 @@ #include "renderer_scene_gi_rd.h" #include "core/config/project_settings.h" -#include "renderer_compositor_rd.h" #include "servers/rendering/renderer_rd/renderer_scene_render_rd.h" #include "servers/rendering/rendering_server_default.h" @@ -216,7 +215,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V cascade.solid_cell_buffer = RD::get_singleton()->storage_buffer_create(sizeof(SDFGI::Cascade::SolidCell) * solid_cell_count); cascade.solid_cell_dispatch_buffer = RD::get_singleton()->storage_buffer_create(sizeof(uint32_t) * 4, Vector<uint8_t>(), RD::STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT); - cascade.lights_buffer = RD::get_singleton()->storage_buffer_create(sizeof(SDGIShader::Light) * MAX(SDFGI::MAX_STATIC_LIGHTS, SDFGI::MAX_DYNAMIC_LIGHTS)); + cascade.lights_buffer = RD::get_singleton()->storage_buffer_create(sizeof(SDFGIShader::Light) * MAX(SDFGI::MAX_STATIC_LIGHTS, SDFGI::MAX_DYNAMIC_LIGHTS)); { Vector<RD::Uniform> uniforms; { @@ -293,7 +292,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - cascade.sdf_store_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_STORE), 0); + cascade.sdf_store_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_STORE), 0); } { @@ -341,7 +340,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - cascade.scroll_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_SCROLL), 0); + cascade.scroll_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_SCROLL), 0); } { Vector<RD::Uniform> uniforms; @@ -362,7 +361,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - cascade.scroll_occlusion_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_SCROLL_OCCLUSION), 0); + cascade.scroll_occlusion_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_SCROLL_OCCLUSION), 0); } } @@ -476,7 +475,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - sdf_initialize_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE), 0); + sdf_initialize_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE), 0); } { @@ -496,7 +495,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - sdf_initialize_half_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF), 0); + sdf_initialize_half_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF), 0); } //jump flood uniform set @@ -517,9 +516,9 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - jump_flood_uniform_set[0] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD), 0); + jump_flood_uniform_set[0] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD), 0); SWAP(uniforms.write[0].ids.write[0], uniforms.write[1].ids.write[0]); - jump_flood_uniform_set[1] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD), 0); + jump_flood_uniform_set[1] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD), 0); } //jump flood half uniform set { @@ -539,9 +538,9 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - jump_flood_half_uniform_set[0] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD), 0); + jump_flood_half_uniform_set[0] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD), 0); SWAP(uniforms.write[0].ids.write[0], uniforms.write[1].ids.write[0]); - jump_flood_half_uniform_set[1] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD), 0); + jump_flood_half_uniform_set[1] = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD), 0); } //upscale half size sdf @@ -570,7 +569,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V } upscale_jfa_uniform_set_index = (passes & 1) ? 0 : 1; - sdf_upscale_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE), 0); + sdf_upscale_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE), 0); } //occlusion uniform set @@ -600,7 +599,7 @@ void RendererSceneGIRD::SDFGI::create(RendererSceneEnvironmentRD *p_env, const V uniforms.push_back(u); } - occlusion_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDGIShader::PRE_PROCESS_OCCLUSION), 0); + occlusion_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.preprocess.version_get_shader(gi->sdfgi_shader.preprocess_shader, SDFGIShader::PRE_PROCESS_OCCLUSION), 0); } for (uint32_t i = 0; i < cascades.size(); i++) { @@ -845,9 +844,9 @@ void RendererSceneGIRD::SDFGI::update_light() { /* Update dynamic light */ RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.direct_light_pipeline[SDGIShader::DIRECT_LIGHT_MODE_DYNAMIC]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.direct_light_pipeline[SDFGIShader::DIRECT_LIGHT_MODE_DYNAMIC]); - SDGIShader::DirectLightPushConstant push_constant; + SDFGIShader::DirectLightPushConstant push_constant; push_constant.grid_size[0] = cascade_size; push_constant.grid_size[1] = cascade_size; @@ -879,7 +878,7 @@ void RendererSceneGIRD::SDFGI::update_light() { cascades[i].all_dynamic_lights_dirty = false; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascade.sdf_direct_light_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::DirectLightPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::DirectLightPushConstant)); RD::get_singleton()->compute_list_dispatch_indirect(compute_list, cascade.solid_cell_dispatch_buffer, 0); } RD::get_singleton()->compute_list_end(RD::BARRIER_MASK_COMPUTE); @@ -889,7 +888,7 @@ void RendererSceneGIRD::SDFGI::update_light() { void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, RendererSceneSkyRD::Sky *p_sky) { RD::get_singleton()->draw_command_begin_label("SDFGI Update Probes"); - SDGIShader::IntegratePushConstant push_constant; + SDFGIShader::IntegratePushConstant push_constant; push_constant.grid_size[1] = cascade_size; push_constant.grid_size[2] = cascade_size; push_constant.grid_size[0] = cascade_size; @@ -905,20 +904,20 @@ void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, push_constant.store_ambient_texture = p_env->volumetric_fog_enabled; RID sky_uniform_set = gi->sdfgi_shader.integrate_default_sky_uniform_set; - push_constant.sky_mode = SDGIShader::IntegratePushConstant::SKY_MODE_DISABLED; + push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_DISABLED; push_constant.y_mult = y_mult; if (reads_sky && p_env) { push_constant.sky_energy = p_env->bg_energy; if (p_env->background == RS::ENV_BG_CLEAR_COLOR) { - push_constant.sky_mode = SDGIShader::IntegratePushConstant::SKY_MODE_COLOR; + push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR; Color c = storage->get_default_clear_color().to_linear(); push_constant.sky_color[0] = c.r; push_constant.sky_color[1] = c.g; push_constant.sky_color[2] = c.b; } else if (p_env->background == RS::ENV_BG_COLOR) { - push_constant.sky_mode = SDGIShader::IntegratePushConstant::SKY_MODE_COLOR; + push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR; Color c = p_env->bg_color; push_constant.sky_color[0] = c.r; push_constant.sky_color[1] = c.g; @@ -948,7 +947,7 @@ void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, integrate_sky_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.integrate.version_get_shader(gi->sdfgi_shader.integrate_shader, 0), 1); } sky_uniform_set = integrate_sky_uniform_set; - push_constant.sky_mode = SDGIShader::IntegratePushConstant::SKY_MODE_SKY; + push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_SKY; } } } @@ -956,7 +955,7 @@ void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, render_pass++; RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(true); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDGIShader::INTEGRATE_MODE_PROCESS]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDFGIShader::INTEGRATE_MODE_PROCESS]); int32_t probe_divisor = cascade_size / SDFGI::PROBE_DIVISOR; for (uint32_t i = 0; i < cascades.size(); i++) { @@ -968,7 +967,7 @@ void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[i].integrate_uniform_set, 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sky_uniform_set, 1); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::IntegratePushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::IntegratePushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, probe_axis_count * probe_axis_count, probe_axis_count, 1); } @@ -982,7 +981,7 @@ void RendererSceneGIRD::SDFGI::store_probes() { RD::get_singleton()->barrier(RD::BARRIER_MASK_COMPUTE, RD::BARRIER_MASK_COMPUTE); RD::get_singleton()->draw_command_begin_label("SDFGI Store Probes"); - SDGIShader::IntegratePushConstant push_constant; + SDFGIShader::IntegratePushConstant push_constant; push_constant.grid_size[1] = cascade_size; push_constant.grid_size[2] = cascade_size; push_constant.grid_size[0] = cascade_size; @@ -1004,7 +1003,7 @@ void RendererSceneGIRD::SDFGI::store_probes() { RENDER_TIMESTAMP("Average Probes"); RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDGIShader::INTEGRATE_MODE_STORE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDFGIShader::INTEGRATE_MODE_STORE]); //convert to octahedral to store push_constant.image_size[0] *= SDFGI::LIGHTPROBE_OCT_SIZE; @@ -1014,7 +1013,7 @@ void RendererSceneGIRD::SDFGI::store_probes() { push_constant.cascade = i; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[i].integrate_uniform_set, 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, gi->sdfgi_shader.integrate_default_sky_uniform_set, 1); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::IntegratePushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::IntegratePushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, probe_axis_count * probe_axis_count * SDFGI::LIGHTPROBE_OCT_SIZE, probe_axis_count * SDFGI::LIGHTPROBE_OCT_SIZE, 1); } @@ -1199,7 +1198,7 @@ void RendererSceneGIRD::SDFGI::debug_draw(const CameraMatrix &p_projection, cons RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.debug_pipeline); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, debug_uniform_set, 0); - SDGIShader::DebugPushConstant push_constant; + SDFGIShader::DebugPushConstant push_constant; push_constant.grid_size[0] = cascade_size; push_constant.grid_size[1] = cascade_size; push_constant.grid_size[2] = cascade_size; @@ -1232,7 +1231,7 @@ void RendererSceneGIRD::SDFGI::debug_draw(const CameraMatrix &p_projection, cons push_constant.cam_transform[14] = p_transform.origin.z; push_constant.cam_transform[15] = 1; - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::DebugPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::DebugPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_width, p_height, 1); RD::get_singleton()->compute_list_end(); @@ -1242,7 +1241,7 @@ void RendererSceneGIRD::SDFGI::debug_draw(const CameraMatrix &p_projection, cons } void RendererSceneGIRD::SDFGI::debug_probes(RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform) { - SDGIShader::DebugProbesPushConstant push_constant; + SDFGIShader::DebugProbesPushConstant push_constant; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { @@ -1302,9 +1301,9 @@ void RendererSceneGIRD::SDFGI::debug_probes(RD::DrawListID p_draw_list, RID p_fr debug_probes_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.debug_probes.version_get_shader(gi->sdfgi_shader.debug_probes_shader, 0), 0); } - RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, gi->sdfgi_shader.debug_probes_pipeline[SDGIShader::PROBE_DEBUG_PROBES].get_render_pipeline(RD::INVALID_FORMAT_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer))); + RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, gi->sdfgi_shader.debug_probes_pipeline[SDFGIShader::PROBE_DEBUG_PROBES].get_render_pipeline(RD::INVALID_FORMAT_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer))); RD::get_singleton()->draw_list_bind_uniform_set(p_draw_list, debug_probes_uniform_set, 0); - RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(SDGIShader::DebugProbesPushConstant)); + RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(SDFGIShader::DebugProbesPushConstant)); RD::get_singleton()->draw_list_draw(p_draw_list, false, total_probes, total_points); if (gi->sdfgi_debug_probe_dir != Vector3()) { @@ -1363,9 +1362,9 @@ void RendererSceneGIRD::SDFGI::debug_probes(RD::DrawListID p_draw_list, RID p_fr uint32_t cell_count = probe_cells * 2 * probe_cells * 2 * probe_cells * 2; - RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, gi->sdfgi_shader.debug_probes_pipeline[SDGIShader::PROBE_DEBUG_VISIBILITY].get_render_pipeline(RD::INVALID_FORMAT_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer))); + RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, gi->sdfgi_shader.debug_probes_pipeline[SDFGIShader::PROBE_DEBUG_VISIBILITY].get_render_pipeline(RD::INVALID_FORMAT_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer))); RD::get_singleton()->draw_list_bind_uniform_set(p_draw_list, debug_probes_uniform_set, 0); - RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(SDGIShader::DebugProbesPushConstant)); + RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(SDFGIShader::DebugProbesPushConstant)); RD::get_singleton()->draw_list_draw(p_draw_list, false, cell_count, total_points); } } @@ -1446,7 +1445,7 @@ void RendererSceneGIRD::SDFGI::pre_process_gi(const Transform &p_transform, Rend for (uint32_t i = 0; i < cascades.size(); i++) { SDFGI::Cascade &cascade = cascades[i]; - SDGIShader::Light lights[SDFGI::MAX_DYNAMIC_LIGHTS]; + SDFGIShader::Light lights[SDFGI::MAX_DYNAMIC_LIGHTS]; uint32_t idx = 0; for (uint32_t j = 0; j < (uint32_t)p_scene_render->render_state.sdfgi_update_data->directional_lights->size(); j++) { if (idx == SDFGI::MAX_DYNAMIC_LIGHTS) { @@ -1528,7 +1527,7 @@ void RendererSceneGIRD::SDFGI::pre_process_gi(const Transform &p_transform, Rend } if (idx > 0) { - RD::get_singleton()->buffer_update(cascade.lights_buffer, 0, idx * sizeof(SDGIShader::Light), lights, RD::BARRIER_MASK_COMPUTE); + RD::get_singleton()->buffer_update(cascade.lights_buffer, 0, idx * sizeof(SDFGIShader::Light), lights, RD::BARRIER_MASK_COMPUTE); } cascade_dynamic_light_count[i] = idx; @@ -1566,8 +1565,8 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, //done rendering! must update SDF //clear dispatch indirect data - SDGIShader::PreprocessPushConstant push_constant; - zeromem(&push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + SDFGIShader::PreprocessPushConstant push_constant; + zeromem(&push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RENDER_TIMESTAMP("Scroll SDF"); @@ -1594,14 +1593,14 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); //must pre scroll existing data because not all is dirty - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_SCROLL]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_SCROLL]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].scroll_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_indirect(compute_list, cascades[cascade].solid_cell_dispatch_buffer, 0); // no barrier do all together - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_SCROLL_OCCLUSION]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_SCROLL_OCCLUSION]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].scroll_occlusion_uniform_set, 0); Vector3i dirty = cascades[cascade].dirty_regions; @@ -1610,7 +1609,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, groups.y = cascade_size - ABS(dirty.y); groups.z = cascade_size - ABS(dirty.z); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, groups.x, groups.y, groups.z); //no barrier, continue together @@ -1618,7 +1617,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, { //scroll probes and their history also - SDGIShader::IntegratePushConstant ipush_constant; + SDFGIShader::IntegratePushConstant ipush_constant; ipush_constant.grid_size[1] = cascade_size; ipush_constant.grid_size[2] = cascade_size; ipush_constant.grid_size[0] = cascade_size; @@ -1649,18 +1648,18 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, ipush_constant.scroll[1] = dirty.y / probe_divisor; ipush_constant.scroll[2] = dirty.z / probe_divisor; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDGIShader::INTEGRATE_MODE_SCROLL]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDFGIShader::INTEGRATE_MODE_SCROLL]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].integrate_uniform_set, 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, gi->sdfgi_shader.integrate_default_sky_uniform_set, 1); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDGIShader::IntegratePushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDFGIShader::IntegratePushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, probe_axis_count * probe_axis_count, probe_axis_count, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDGIShader::INTEGRATE_MODE_SCROLL_STORE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDFGIShader::INTEGRATE_MODE_SCROLL_STORE]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].integrate_uniform_set, 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, gi->sdfgi_shader.integrate_default_sky_uniform_set, 1); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDGIShader::IntegratePushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDFGIShader::IntegratePushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, probe_axis_count * probe_axis_count, probe_axis_count, 1); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1668,7 +1667,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, if (bounce_feedback > 0.0) { //multibounce requires this to be stored so direct light can read from it - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDGIShader::INTEGRATE_MODE_STORE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.integrate_pipeline[SDFGIShader::INTEGRATE_MODE_STORE]); //convert to octahedral to store ipush_constant.image_size[0] *= SDFGI::LIGHTPROBE_OCT_SIZE; @@ -1676,7 +1675,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].integrate_uniform_set, 0); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, gi->sdfgi_shader.integrate_default_sky_uniform_set, 1); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDGIShader::IntegratePushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &ipush_constant, sizeof(SDFGIShader::IntegratePushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, probe_axis_count * probe_axis_count * SDFGI::LIGHTPROBE_OCT_SIZE, probe_axis_count * SDFGI::LIGHTPROBE_OCT_SIZE, 1); } } @@ -1698,9 +1697,9 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, push_constant.grid_size >>= 1; uint32_t cascade_half_size = cascade_size >> 1; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE_HALF]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_initialize_half_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_half_size, cascade_half_size, cascade_half_size); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1712,7 +1711,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, uint32_t s = cascade_half_size; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD]); int jf_us = 0; //start with regular jump flood for very coarse reads, as this is impossible to optimize @@ -1720,7 +1719,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, s /= 2; push_constant.step_size = s; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, jump_flood_half_uniform_set[jf_us], 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_half_size, cascade_half_size, cascade_half_size); RD::get_singleton()->compute_list_add_barrier(compute_list); jf_us = jf_us == 0 ? 1 : 0; @@ -1733,12 +1732,12 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, RENDER_TIMESTAMP("SDFGI Jump Flood Optimized (Half Size)"); //continue with optimized jump flood for smaller reads - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); while (s > 1) { s /= 2; push_constant.step_size = s; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, jump_flood_half_uniform_set[jf_us], 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_half_size, cascade_half_size, cascade_half_size); RD::get_singleton()->compute_list_add_barrier(compute_list); jf_us = jf_us == 0 ? 1 : 0; @@ -1748,9 +1747,9 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, // restore grid size for last passes push_constant.grid_size = cascade_size; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_UPSCALE]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_upscale_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1758,9 +1757,9 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, push_constant.half_size = false; push_constant.step_size = 1; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, jump_flood_uniform_set[upscale_jfa_uniform_set_index], 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1768,9 +1767,9 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, //full size jumpflood RENDER_TIMESTAMP("SDFGI Jump Flood"); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_INITIALIZE]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, sdf_initialize_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_add_barrier(compute_list); @@ -1779,7 +1778,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, { uint32_t s = cascade_size; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD]); int jf_us = 0; //start with regular jump flood for very coarse reads, as this is impossible to optimize @@ -1787,7 +1786,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, s /= 2; push_constant.step_size = s; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, jump_flood_uniform_set[jf_us], 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_add_barrier(compute_list); jf_us = jf_us == 0 ? 1 : 0; @@ -1800,12 +1799,12 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, RENDER_TIMESTAMP("SDFGI Jump Flood Optimized"); //continue with optimized jump flood for smaller reads - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_JUMP_FLOOD_OPTIMIZED]); while (s > 1) { s /= 2; push_constant.step_size = s; RD::get_singleton()->compute_list_bind_uniform_set(compute_list, jump_flood_uniform_set[jf_us], 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_add_barrier(compute_list); jf_us = jf_us == 0 ? 1 : 0; @@ -1820,7 +1819,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, uint32_t probe_size = cascade_size / SDFGI::PROBE_DIVISOR; Vector3i probe_global_pos = cascades[cascade].position / probe_size; - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_OCCLUSION]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_OCCLUSION]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, occlusion_uniform_set, 0); for (int i = 0; i < 8; i++) { //dispatch all at once for performance @@ -1839,7 +1838,7 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, push_constant.probe_offset[1] = offset.y; push_constant.probe_offset[2] = offset.z; push_constant.occlusion_index = i; - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); Vector3i groups = Vector3i(probe_size + 1, probe_size + 1, probe_size + 1) - offset; //if offset, it's one less probe per axis to compute RD::get_singleton()->compute_list_dispatch(compute_list, groups.x, groups.y, groups.z); @@ -1850,9 +1849,9 @@ void RendererSceneGIRD::SDFGI::render_region(RID p_render_buffers, int p_region, RENDER_TIMESTAMP("SDFGI Store"); // store - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDGIShader::PRE_PROCESS_STORE]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.preprocess_pipeline[SDFGIShader::PRE_PROCESS_STORE]); RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cascades[cascade].sdf_store_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDGIShader::PreprocessPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(SDFGIShader::PreprocessPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, cascade_size, cascade_size, cascade_size); RD::get_singleton()->compute_list_end(); @@ -1903,7 +1902,7 @@ void RendererSceneGIRD::SDFGI::render_static_lights(RID p_render_buffers, uint32 update_cascades(); ; //need cascades updated for this - SDGIShader::Light lights[SDFGI::MAX_STATIC_LIGHTS]; + SDFGIShader::Light lights[SDFGI::MAX_STATIC_LIGHTS]; uint32_t light_count[SDFGI::MAX_STATIC_LIGHTS]; for (uint32_t i = 0; i < p_cascade_count; i++) { @@ -1967,7 +1966,7 @@ void RendererSceneGIRD::SDFGI::render_static_lights(RID p_render_buffers, uint32 } if (idx > 0) { - RD::get_singleton()->buffer_update(cc.lights_buffer, 0, idx * sizeof(SDGIShader::Light), lights); + RD::get_singleton()->buffer_update(cc.lights_buffer, 0, idx * sizeof(SDFGIShader::Light), lights); } light_count[i] = idx; @@ -1977,9 +1976,9 @@ void RendererSceneGIRD::SDFGI::render_static_lights(RID p_render_buffers, uint32 /* Static Lights */ RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); - RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.direct_light_pipeline[SDGIShader::DIRECT_LIGHT_MODE_STATIC]); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, gi->sdfgi_shader.direct_light_pipeline[SDFGIShader::DIRECT_LIGHT_MODE_STATIC]); - SDGIShader::DirectLightPushConstant dl_push_constant; + SDFGIShader::DirectLightPushConstant dl_push_constant; dl_push_constant.grid_size[0] = cascade_size; dl_push_constant.grid_size[1] = cascade_size; @@ -2004,7 +2003,7 @@ void RendererSceneGIRD::SDFGI::render_static_lights(RID p_render_buffers, uint32 if (dl_push_constant.light_count > 0) { RD::get_singleton()->compute_list_bind_uniform_set(compute_list, cc.sdf_direct_light_uniform_set, 0); - RD::get_singleton()->compute_list_set_push_constant(compute_list, &dl_push_constant, sizeof(SDGIShader::DirectLightPushConstant)); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &dl_push_constant, sizeof(SDFGIShader::DirectLightPushConstant)); RD::get_singleton()->compute_list_dispatch_indirect(compute_list, cc.solid_cell_dispatch_buffer, 0); } } @@ -2879,7 +2878,7 @@ void RendererSceneGIRD::init_sdfgi(RendererSceneSkyRD *p_sky) { String defines = "\n#define OCCLUSION_SIZE " + itos(SDFGI::CASCADE_SIZE / SDFGI::PROBE_DIVISOR) + "\n"; sdfgi_shader.preprocess.initialize(preprocess_modes, defines); sdfgi_shader.preprocess_shader = sdfgi_shader.preprocess.version_create(); - for (int i = 0; i < SDGIShader::PRE_PROCESS_MAX; i++) { + for (int i = 0; i < SDFGIShader::PRE_PROCESS_MAX; i++) { sdfgi_shader.preprocess_pipeline[i] = RD::get_singleton()->compute_pipeline_create(sdfgi_shader.preprocess.version_get_shader(sdfgi_shader.preprocess_shader, i)); } } @@ -2893,7 +2892,7 @@ void RendererSceneGIRD::init_sdfgi(RendererSceneSkyRD *p_sky) { direct_light_modes.push_back("\n#define MODE_PROCESS_DYNAMIC\n"); sdfgi_shader.direct_light.initialize(direct_light_modes, defines); sdfgi_shader.direct_light_shader = sdfgi_shader.direct_light.version_create(); - for (int i = 0; i < SDGIShader::DIRECT_LIGHT_MODE_MAX; i++) { + for (int i = 0; i < SDFGIShader::DIRECT_LIGHT_MODE_MAX; i++) { sdfgi_shader.direct_light_pipeline[i] = RD::get_singleton()->compute_pipeline_create(sdfgi_shader.direct_light.version_get_shader(sdfgi_shader.direct_light_shader, i)); } } @@ -2914,7 +2913,7 @@ void RendererSceneGIRD::init_sdfgi(RendererSceneSkyRD *p_sky) { sdfgi_shader.integrate.initialize(integrate_modes, defines); sdfgi_shader.integrate_shader = sdfgi_shader.integrate.version_create(); - for (int i = 0; i < SDGIShader::INTEGRATE_MODE_MAX; i++) { + for (int i = 0; i < SDFGIShader::INTEGRATE_MODE_MAX; i++) { sdfgi_shader.integrate_pipeline[i] = RD::get_singleton()->compute_pipeline_create(sdfgi_shader.integrate.version_get_shader(sdfgi_shader.integrate_shader, i)); } @@ -2986,7 +2985,7 @@ void RendererSceneGIRD::init_sdfgi(RendererSceneSkyRD *p_sky) { ds.enable_depth_test = true; ds.enable_depth_write = true; ds.depth_compare_operator = RD::COMPARE_OP_LESS_OR_EQUAL; - for (int i = 0; i < SDGIShader::PROBE_DEBUG_MAX; i++) { + for (int i = 0; i < SDFGIShader::PROBE_DEBUG_MAX; i++) { RID debug_probes_shader_version = sdfgi_shader.debug_probes.version_get_shader(sdfgi_shader.debug_probes_shader, i); sdfgi_shader.debug_probes_pipeline[i].setup(debug_probes_shader_version, RD::RENDER_PRIMITIVE_TRIANGLE_STRIPS, rs, RD::PipelineMultisampleState(), ds, RD::PipelineColorBlendState::create_disabled(), 0); } @@ -3041,7 +3040,7 @@ void RendererSceneGIRD::setup_giprobes(RID p_render_buffers, const Transform &p_ for (int i = 0; i < MAX_GIPROBES; i++) { RID texture; if (i < (int)p_gi_probes.size()) { - GIProbeInstance *gipi = gi_probe_instance_owner.getornull(p_gi_probes[i]); + GIProbeInstance *gipi = get_probe_instance(p_gi_probes[i]); if (gipi) { texture = gipi->texture; @@ -3375,6 +3374,27 @@ RID RendererSceneGIRD::gi_probe_instance_create(RID p_base) { return rid; } +void RendererSceneGIRD::gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform) { + GIProbeInstance *gi_probe = get_probe_instance(p_probe); + ERR_FAIL_COND(!gi_probe); + + gi_probe->transform = p_xform; +} + +bool RendererSceneGIRD::gi_probe_needs_update(RID p_probe) const { + GIProbeInstance *gi_probe = get_probe_instance(p_probe); + ERR_FAIL_COND_V(!gi_probe, false); + + return gi_probe->last_probe_version != storage->gi_probe_get_version(gi_probe->probe); +} + +void RendererSceneGIRD::gi_probe_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RendererSceneRender::GeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render) { + GIProbeInstance *gi_probe = get_probe_instance(p_probe); + ERR_FAIL_COND(!gi_probe); + + gi_probe->update(p_update_light_instances, p_light_instances, p_dynamic_objects, p_scene_render); +} + void RendererSceneGIRD::debug_giprobe(RID p_gi_probe, RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha) { GIProbeInstance *gi_probe = gi_probe_instance_owner.getornull(p_gi_probe); ERR_FAIL_COND(!gi_probe); diff --git a/servers/rendering/renderer_rd/renderer_scene_gi_rd.h b/servers/rendering/renderer_rd/renderer_scene_gi_rd.h index 6cff9b7837..691a2e1841 100644 --- a/servers/rendering/renderer_rd/renderer_scene_gi_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_gi_rd.h @@ -33,8 +33,10 @@ #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" +#include "servers/rendering/renderer_compositor.h" #include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h" #include "servers/rendering/renderer_rd/renderer_scene_sky_rd.h" +#include "servers/rendering/renderer_rd/renderer_storage_rd.h" #include "servers/rendering/renderer_rd/shaders/gi.glsl.gen.h" #include "servers/rendering/renderer_rd/shaders/giprobe.glsl.gen.h" #include "servers/rendering/renderer_rd/shaders/giprobe_debug.glsl.gen.h" @@ -55,7 +57,6 @@ private: RendererStorageRD *storage; -public: /* GIPROBE INSTANCE */ struct GIProbeLight { @@ -110,56 +111,6 @@ public: float pad[3]; }; - struct GIProbeInstance { - // access to our containers - RendererStorageRD *storage; - RendererSceneGIRD *gi; - - RID probe; - RID texture; - RID write_buffer; - - struct Mipmap { - RID texture; - RID uniform_set; - RID second_bounce_uniform_set; - RID write_uniform_set; - uint32_t level; - uint32_t cell_offset; - uint32_t cell_count; - }; - Vector<Mipmap> mipmaps; - - struct DynamicMap { - RID texture; //color normally, or emission on first pass - RID fb_depth; //actual depth buffer for the first pass, float depth for later passes - RID depth; //actual depth buffer for the first pass, float depth for later passes - RID normal; //normal buffer for the first pass - RID albedo; //emission buffer for the first pass - RID orm; //orm buffer for the first pass - RID fb; //used for rendering, only valid on first map - RID uniform_set; - uint32_t size; - int mipmap; // mipmap to write to, -1 if no mipmap assigned - }; - - Vector<DynamicMap> dynamic_maps; - - int slot = -1; - uint32_t last_probe_version = 0; - uint32_t last_probe_data_version = 0; - - //uint64_t last_pass = 0; - uint32_t render_index = 0; - - bool has_dynamic_object_data = false; - - Transform transform; - - void update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RendererSceneRender::GeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render); - void debug(RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); - }; - GIProbeLight *gi_probe_lights; uint32_t gi_probe_max_lights; RID gi_probe_lights_uniform; @@ -181,10 +132,6 @@ public: RID giprobe_lighting_shader_version_shaders[GI_PROBE_SHADER_VERSION_MAX]; RID giprobe_lighting_shader_version_pipelines[GI_PROBE_SHADER_VERSION_MAX]; - mutable RID_Owner<GIProbeInstance> gi_probe_instance_owner; - - RS::GIProbeQuality gi_probe_quality = RS::GI_PROBE_QUALITY_HIGH; - enum { GI_PROBE_DEBUG_COLOR, GI_PROBE_DEBUG_LIGHT, @@ -211,156 +158,7 @@ public: /* SDFGI */ - struct SDFGI { - enum { - MAX_CASCADES = 8, - CASCADE_SIZE = 128, - PROBE_DIVISOR = 16, - ANISOTROPY_SIZE = 6, - MAX_DYNAMIC_LIGHTS = 128, - MAX_STATIC_LIGHTS = 1024, - LIGHTPROBE_OCT_SIZE = 6, - SH_SIZE = 16 - }; - - struct Cascade { - struct UBO { - float offset[3]; - float to_cell; - int32_t probe_offset[3]; - uint32_t pad; - }; - - //cascade blocks are full-size for volume (128^3), half size for albedo/emission - RID sdf_tex; - RID light_tex; - RID light_aniso_0_tex; - RID light_aniso_1_tex; - - RID light_data; - RID light_aniso_0_data; - RID light_aniso_1_data; - - struct SolidCell { // this struct is unused, but remains as reference for size - uint32_t position; - uint32_t albedo; - uint32_t static_light; - uint32_t static_light_aniso; - }; - - RID solid_cell_dispatch_buffer; //buffer for indirect compute dispatch - RID solid_cell_buffer; - - RID lightprobe_history_tex; - RID lightprobe_average_tex; - - float cell_size; - Vector3i position; - - static const Vector3i DIRTY_ALL; - Vector3i dirty_regions; //(0,0,0 is not dirty, negative is refresh from the end, DIRTY_ALL is refresh all. - - RID sdf_store_uniform_set; - RID sdf_direct_light_uniform_set; - RID scroll_uniform_set; - RID scroll_occlusion_uniform_set; - RID integrate_uniform_set; - RID lights_buffer; - - bool all_dynamic_lights_dirty = true; - }; - - // access to our containers - RendererStorageRD *storage; - RendererSceneGIRD *gi; - - // used for rendering (voxelization) - RID render_albedo; - RID render_emission; - RID render_emission_aniso; - RID render_occlusion[8]; - RID render_geom_facing; - - RID render_sdf[2]; - RID render_sdf_half[2]; - - // used for ping pong processing in cascades - RID sdf_initialize_uniform_set; - RID sdf_initialize_half_uniform_set; - RID jump_flood_uniform_set[2]; - RID jump_flood_half_uniform_set[2]; - RID sdf_upscale_uniform_set; - int upscale_jfa_uniform_set_index; - RID occlusion_uniform_set; - - uint32_t cascade_size = 128; - - LocalVector<Cascade> cascades; - - RID lightprobe_texture; - RID lightprobe_data; - RID occlusion_texture; - RID occlusion_data; - RID ambient_texture; //integrates with volumetric fog - - RID lightprobe_history_scroll; //used for scrolling lightprobes - RID lightprobe_average_scroll; //used for scrolling lightprobes - - uint32_t history_size = 0; - float solid_cell_ratio = 0; - uint32_t solid_cell_count = 0; - - RS::EnvironmentSDFGICascades cascade_mode; - float min_cell_size = 0; - uint32_t probe_axis_count = 0; //amount of probes per axis, this is an odd number because it encloses endpoints - - RID debug_uniform_set; - RID debug_probes_uniform_set; - RID cascades_ubo; - - bool uses_occlusion = false; - float bounce_feedback = 0.0; - bool reads_sky = false; - float energy = 1.0; - float normal_bias = 1.1; - float probe_bias = 1.1; - RS::EnvironmentSDFGIYScale y_scale_mode = RS::ENV_SDFGI_Y_SCALE_DISABLED; - - float y_mult = 1.0; - - uint32_t render_pass = 0; - - int32_t cascade_dynamic_light_count[SDFGI::MAX_CASCADES]; //used dynamically - RID integrate_sky_uniform_set; - - void create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, RendererSceneGIRD *p_gi); - void erase(); - void update(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position); - void update_light(); - void update_probes(RendererSceneEnvironmentRD *p_env, RendererSceneSkyRD::Sky *p_sky); - void store_probes(); - int get_pending_region_data(int p_region, Vector3i &r_local_offset, Vector3i &r_local_size, AABB &r_bounds) const; - void update_cascades(); - - void debug_draw(const CameraMatrix &p_projection, const Transform &p_transform, int p_width, int p_height, RID p_render_target, RID p_texture); - void debug_probes(RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform); - - void pre_process_gi(const Transform &p_transform, RendererSceneRenderRD *p_scene_render); - void render_region(RID p_render_buffers, int p_region, const PagedArray<RendererSceneRender::GeometryInstance *> &p_instances, RendererSceneRenderRD *p_scene_render); - void render_static_lights(RID p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result, RendererSceneRenderRD *p_scene_render); - }; - - RS::EnvironmentSDFGIRayCount sdfgi_ray_count = RS::ENV_SDFGI_RAY_COUNT_16; - RS::EnvironmentSDFGIFramesToConverge sdfgi_frames_to_converge = RS::ENV_SDFGI_CONVERGE_IN_10_FRAMES; - RS::EnvironmentSDFGIFramesToUpdateLight sdfgi_frames_to_update_light = RS::ENV_SDFGI_UPDATE_LIGHT_IN_4_FRAMES; - - float sdfgi_solid_cell_ratio = 0.25; - Vector3 sdfgi_debug_probe_pos; - Vector3 sdfgi_debug_probe_dir; - bool sdfgi_debug_probe_enabled = false; - Vector3i sdfgi_debug_probe_index; - - struct SDGIShader { + struct SDFGIShader { enum SDFGIPreprocessShaderVersion { PRE_PROCESS_SCROLL, PRE_PROCESS_SCROLL_OCCLUSION, @@ -528,6 +326,226 @@ public: } sdfgi_shader; +public: + /* GIPROBE INSTANCE */ + + //@TODO GIProbeInstance is still directly used in the render code, we'll address this when we refactor the render code itself. + + struct GIProbeInstance { + // access to our containers + RendererStorageRD *storage; + RendererSceneGIRD *gi; + + RID probe; + RID texture; + RID write_buffer; + + struct Mipmap { + RID texture; + RID uniform_set; + RID second_bounce_uniform_set; + RID write_uniform_set; + uint32_t level; + uint32_t cell_offset; + uint32_t cell_count; + }; + Vector<Mipmap> mipmaps; + + struct DynamicMap { + RID texture; //color normally, or emission on first pass + RID fb_depth; //actual depth buffer for the first pass, float depth for later passes + RID depth; //actual depth buffer for the first pass, float depth for later passes + RID normal; //normal buffer for the first pass + RID albedo; //emission buffer for the first pass + RID orm; //orm buffer for the first pass + RID fb; //used for rendering, only valid on first map + RID uniform_set; + uint32_t size; + int mipmap; // mipmap to write to, -1 if no mipmap assigned + }; + + Vector<DynamicMap> dynamic_maps; + + int slot = -1; + uint32_t last_probe_version = 0; + uint32_t last_probe_data_version = 0; + + //uint64_t last_pass = 0; + uint32_t render_index = 0; + + bool has_dynamic_object_data = false; + + Transform transform; + + void update(bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RendererSceneRender::GeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render); + void debug(RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); + }; + + mutable RID_Owner<GIProbeInstance> gi_probe_instance_owner; + + _FORCE_INLINE_ GIProbeInstance *get_probe_instance(RID p_probe) const { + return gi_probe_instance_owner.getornull(p_probe); + }; + + _FORCE_INLINE_ RID gi_probe_instance_get_texture(RID p_probe) { + GIProbeInstance *gi_probe = get_probe_instance(p_probe); + ERR_FAIL_COND_V(!gi_probe, RID()); + return gi_probe->texture; + }; + + RS::GIProbeQuality gi_probe_quality = RS::GI_PROBE_QUALITY_HIGH; + + /* SDFGI */ + + struct SDFGI { + enum { + MAX_CASCADES = 8, + CASCADE_SIZE = 128, + PROBE_DIVISOR = 16, + ANISOTROPY_SIZE = 6, + MAX_DYNAMIC_LIGHTS = 128, + MAX_STATIC_LIGHTS = 1024, + LIGHTPROBE_OCT_SIZE = 6, + SH_SIZE = 16 + }; + + struct Cascade { + struct UBO { + float offset[3]; + float to_cell; + int32_t probe_offset[3]; + uint32_t pad; + }; + + //cascade blocks are full-size for volume (128^3), half size for albedo/emission + RID sdf_tex; + RID light_tex; + RID light_aniso_0_tex; + RID light_aniso_1_tex; + + RID light_data; + RID light_aniso_0_data; + RID light_aniso_1_data; + + struct SolidCell { // this struct is unused, but remains as reference for size + uint32_t position; + uint32_t albedo; + uint32_t static_light; + uint32_t static_light_aniso; + }; + + RID solid_cell_dispatch_buffer; //buffer for indirect compute dispatch + RID solid_cell_buffer; + + RID lightprobe_history_tex; + RID lightprobe_average_tex; + + float cell_size; + Vector3i position; + + static const Vector3i DIRTY_ALL; + Vector3i dirty_regions; //(0,0,0 is not dirty, negative is refresh from the end, DIRTY_ALL is refresh all. + + RID sdf_store_uniform_set; + RID sdf_direct_light_uniform_set; + RID scroll_uniform_set; + RID scroll_occlusion_uniform_set; + RID integrate_uniform_set; + RID lights_buffer; + + bool all_dynamic_lights_dirty = true; + }; + + // access to our containers + RendererStorageRD *storage; + RendererSceneGIRD *gi; + + // used for rendering (voxelization) + RID render_albedo; + RID render_emission; + RID render_emission_aniso; + RID render_occlusion[8]; + RID render_geom_facing; + + RID render_sdf[2]; + RID render_sdf_half[2]; + + // used for ping pong processing in cascades + RID sdf_initialize_uniform_set; + RID sdf_initialize_half_uniform_set; + RID jump_flood_uniform_set[2]; + RID jump_flood_half_uniform_set[2]; + RID sdf_upscale_uniform_set; + int upscale_jfa_uniform_set_index; + RID occlusion_uniform_set; + + uint32_t cascade_size = 128; + + LocalVector<Cascade> cascades; + + RID lightprobe_texture; + RID lightprobe_data; + RID occlusion_texture; + RID occlusion_data; + RID ambient_texture; //integrates with volumetric fog + + RID lightprobe_history_scroll; //used for scrolling lightprobes + RID lightprobe_average_scroll; //used for scrolling lightprobes + + uint32_t history_size = 0; + float solid_cell_ratio = 0; + uint32_t solid_cell_count = 0; + + RS::EnvironmentSDFGICascades cascade_mode; + float min_cell_size = 0; + uint32_t probe_axis_count = 0; //amount of probes per axis, this is an odd number because it encloses endpoints + + RID debug_uniform_set; + RID debug_probes_uniform_set; + RID cascades_ubo; + + bool uses_occlusion = false; + float bounce_feedback = 0.0; + bool reads_sky = false; + float energy = 1.0; + float normal_bias = 1.1; + float probe_bias = 1.1; + RS::EnvironmentSDFGIYScale y_scale_mode = RS::ENV_SDFGI_Y_SCALE_DISABLED; + + float y_mult = 1.0; + + uint32_t render_pass = 0; + + int32_t cascade_dynamic_light_count[SDFGI::MAX_CASCADES]; //used dynamically + RID integrate_sky_uniform_set; + + void create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, RendererSceneGIRD *p_gi); + void erase(); + void update(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position); + void update_light(); + void update_probes(RendererSceneEnvironmentRD *p_env, RendererSceneSkyRD::Sky *p_sky); + void store_probes(); + int get_pending_region_data(int p_region, Vector3i &r_local_offset, Vector3i &r_local_size, AABB &r_bounds) const; + void update_cascades(); + + void debug_draw(const CameraMatrix &p_projection, const Transform &p_transform, int p_width, int p_height, RID p_render_target, RID p_texture); + void debug_probes(RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform); + + void pre_process_gi(const Transform &p_transform, RendererSceneRenderRD *p_scene_render); + void render_region(RID p_render_buffers, int p_region, const PagedArray<RendererSceneRender::GeometryInstance *> &p_instances, RendererSceneRenderRD *p_scene_render); + void render_static_lights(RID p_render_buffers, uint32_t p_cascade_count, const uint32_t *p_cascade_indices, const PagedArray<RID> *p_positional_light_cull_result, RendererSceneRenderRD *p_scene_render); + }; + + RS::EnvironmentSDFGIRayCount sdfgi_ray_count = RS::ENV_SDFGI_RAY_COUNT_16; + RS::EnvironmentSDFGIFramesToConverge sdfgi_frames_to_converge = RS::ENV_SDFGI_CONVERGE_IN_10_FRAMES; + RS::EnvironmentSDFGIFramesToUpdateLight sdfgi_frames_to_update_light = RS::ENV_SDFGI_UPDATE_LIGHT_IN_4_FRAMES; + + float sdfgi_solid_cell_ratio = 0.25; + Vector3 sdfgi_debug_probe_pos; + Vector3 sdfgi_debug_probe_dir; + bool sdfgi_debug_probe_enabled = false; + Vector3i sdfgi_debug_probe_index; + /* SDFGI UPDATE */ int sdfgi_get_lightprobe_octahedron_size() const { return SDFGI::LIGHTPROBE_OCT_SIZE; } @@ -547,7 +565,6 @@ public: RID full_mask; }; - // struct GI { struct SDFGIData { float grid_size[3]; uint32_t max_cascades; @@ -631,7 +648,6 @@ public: GiShaderRD shader; RID shader_version; RID pipelines[MODE_MAX]; - // } gi; RendererSceneGIRD(); ~RendererSceneGIRD(); @@ -647,6 +663,9 @@ public: void process_gi(RID p_render_buffers, RID p_normal_roughness_buffer, RID p_gi_probe_buffer, RID p_environment, const CameraMatrix &p_projection, const Transform &p_transform, const PagedArray<RID> &p_gi_probes, RendererSceneRenderRD *p_scene_render); RID gi_probe_instance_create(RID p_base); + void gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform); + bool gi_probe_needs_update(RID p_probe) const; + void gi_probe_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RendererSceneRender::GeometryInstance *> &p_dynamic_objects, RendererSceneRenderRD *p_scene_render); void debug_giprobe(RID p_gi_probe, RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); }; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_forward.cpp b/servers/rendering/renderer_rd/renderer_scene_render_forward.cpp index dd8bfda4d6..874389f7e9 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_forward.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_forward.cpp @@ -2515,7 +2515,7 @@ RID RendererSceneRenderForward::_setup_render_pass_uniform_set(RenderListType p_ RID default_tex = storage->texture_rd_get_default(RendererStorageRD::DEFAULT_RD_TEXTURE_3D_WHITE); for (int i = 0; i < MAX_GI_PROBES; i++) { if (i < (int)p_gi_probes.size()) { - RID tex = gi_probe_instance_get_texture(p_gi_probes[i]); + RID tex = gi.gi_probe_instance_get_texture(p_gi_probes[i]); if (!tex.is_valid()) { tex = default_tex; } diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 7a6900b0c4..f9ee01e751 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -1336,33 +1336,23 @@ RID RendererSceneRenderRD::gi_probe_instance_create(RID p_base) { } void RendererSceneRenderRD::gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - ERR_FAIL_COND(!gi_probe); - - gi_probe->transform = p_xform; + gi.gi_probe_instance_set_transform_to_data(p_probe, p_xform); } bool RendererSceneRenderRD::gi_probe_needs_update(RID p_probe) const { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - ERR_FAIL_COND_V(!gi_probe, false); - if (low_end) { return false; } - //return true; - return gi_probe->last_probe_version != storage->gi_probe_get_version(gi_probe->probe); + return gi.gi_probe_needs_update(p_probe); } void RendererSceneRenderRD::gi_probe_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<GeometryInstance *> &p_dynamic_objects) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - ERR_FAIL_COND(!gi_probe); - if (low_end) { return; } - gi_probe->update(p_update_light_instances, p_light_instances, p_dynamic_objects, this); + gi.gi_probe_update(p_probe, p_update_light_instances, p_light_instances, p_dynamic_objects, this); } void RendererSceneRenderRD::_debug_sdfgi_probes(RID p_render_buffers, RD::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform) { diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index d41dd3358d..eefaf237a4 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -1090,59 +1090,16 @@ public: return li->transform; } - // !BAS! Need to check which of these we move into RenderSceneGIRD or whether we keep this the way it is now + /* gi light probes */ RID gi_probe_instance_create(RID p_base); void gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform); bool gi_probe_needs_update(RID p_probe) const; void gi_probe_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RendererSceneRender::GeometryInstance *> &p_dynamic_objects); - void gi_probe_set_quality(RS::GIProbeQuality p_quality) { gi.gi_probe_quality = p_quality; } - _FORCE_INLINE_ uint32_t gi_probe_instance_get_slot(RID p_probe) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - return gi_probe->slot; - } - _FORCE_INLINE_ RID gi_probe_instance_get_base_probe(RID p_probe) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - return gi_probe->probe; - } - _FORCE_INLINE_ Transform gi_probe_instance_get_transform_to_cell(RID p_probe) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - return storage->gi_probe_get_to_cell_xform(gi_probe->probe) * gi_probe->transform.affine_inverse(); - } - - _FORCE_INLINE_ RID gi_probe_instance_get_texture(RID p_probe) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_probe); - return gi_probe->texture; - } - - _FORCE_INLINE_ void gi_probe_instance_set_render_index(RID p_instance, uint32_t p_render_index) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_instance); - ERR_FAIL_COND(!gi_probe); - gi_probe->render_index = p_render_index; - } - - _FORCE_INLINE_ uint32_t gi_probe_instance_get_render_index(RID p_instance) { - RendererSceneGIRD::GIProbeInstance *gi_probe = gi.gi_probe_instance_owner.getornull(p_instance); - ERR_FAIL_COND_V(!gi_probe, 0); + /* render buffers */ - return gi_probe->render_index; - } - /* - _FORCE_INLINE_ void gi_probe_instance_set_render_pass(RID p_instance, uint32_t p_render_pass) { - RendererSceneGIRD::GIProbeInstance *g_probe = gi_probe_instance_owner.getornull(p_instance); - ERR_FAIL_COND(!g_probe); - g_probe->last_pass = p_render_pass; - } - - _FORCE_INLINE_ uint32_t gi_probe_instance_get_render_pass(RID p_instance) { - RendererSceneGIRD::GIProbeInstance *g_probe = gi_probe_instance_owner.getornull(p_instance); - ERR_FAIL_COND_V(!g_probe, 0); - - return g_probe->last_pass; - } -*/ RID render_buffers_create(); void render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa, RS::ViewportScreenSpaceAA p_screen_space_aa, bool p_use_debanding); void gi_set_use_half_resolution(bool p_enable); diff --git a/servers/rendering/renderer_rd/renderer_storage_rd.h b/servers/rendering/renderer_rd/renderer_storage_rd.h index 68256dc155..cd3d4604eb 100644 --- a/servers/rendering/renderer_rd/renderer_storage_rd.h +++ b/servers/rendering/renderer_rd/renderer_storage_rd.h @@ -2263,7 +2263,7 @@ public: void render_info_end_capture() {} int get_captured_render_info(RS::RenderInfo p_info) { return 0; } - int get_render_info(RS::RenderInfo p_info) { return 0; } + uint64_t get_render_info(RS::RenderInfo p_info) { return 0; } String get_video_adapter_name() const { return String(); } String get_video_adapter_vendor() const { return String(); } diff --git a/servers/rendering/renderer_storage.h b/servers/rendering/renderer_storage.h index 69ad2cc191..22cf6acb19 100644 --- a/servers/rendering/renderer_storage.h +++ b/servers/rendering/renderer_storage.h @@ -608,7 +608,7 @@ public: virtual void render_info_end_capture() = 0; virtual int get_captured_render_info(RS::RenderInfo p_info) = 0; - virtual int get_render_info(RS::RenderInfo p_info) = 0; + virtual uint64_t get_render_info(RS::RenderInfo p_info) = 0; virtual String get_video_adapter_name() const = 0; virtual String get_video_adapter_vendor() const = 0; diff --git a/servers/rendering/rendering_server_default.cpp b/servers/rendering/rendering_server_default.cpp index 61d1efaf22..c6fe6a07e0 100644 --- a/servers/rendering/rendering_server_default.cpp +++ b/servers/rendering/rendering_server_default.cpp @@ -257,7 +257,7 @@ void RenderingServerDefault::finish() { /* STATUS INFORMATION */ -int RenderingServerDefault::get_render_info(RenderInfo p_info) { +uint64_t RenderingServerDefault::get_render_info(RenderInfo p_info) { return RSG::storage->get_render_info(p_info); } diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 73b463f6e7..c6be07a3de 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -901,7 +901,7 @@ public: /* STATUS INFORMATION */ - virtual int get_render_info(RenderInfo p_info) override; + virtual uint64_t get_render_info(RenderInfo p_info) override; virtual String get_video_adapter_name() const override; virtual String get_video_adapter_vendor() const override; diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 65065841a6..6a8bb83ec1 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -1419,7 +1419,7 @@ public: INFO_VERTEX_MEM_USED, }; - virtual int get_render_info(RenderInfo p_info) = 0; + virtual uint64_t get_render_info(RenderInfo p_info) = 0; virtual String get_video_adapter_name() const = 0; virtual String get_video_adapter_vendor() const = 0; diff --git a/tests/test_hashing_context.h b/tests/test_hashing_context.h new file mode 100644 index 0000000000..728a5f2cfa --- /dev/null +++ b/tests/test_hashing_context.h @@ -0,0 +1,165 @@ +/*************************************************************************/ +/* test_hashing_context.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_HASHING_CONTEXT_H +#define TEST_HASHING_CONTEXT_H + +#include "core/crypto/hashing_context.h" + +#include "tests/test_macros.h" + +namespace TestHashingContext { + +TEST_CASE("[HashingContext] Default - MD5/SHA1/SHA256") { + HashingContext ctx; + + static const uint8_t md5_expected[] = { + 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e + }; + static const uint8_t sha1_expected[] = { + 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, + 0xaf, 0xd8, 0x07, 0x09 + }; + static const uint8_t sha256_expected[] = { + 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, + 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 + }; + + CHECK(ctx.start(HashingContext::HASH_MD5) == OK); + PackedByteArray result = ctx.finish(); + REQUIRE(result.size() == 16); + CHECK(memcmp(result.ptr(), md5_expected, 16) == 0); + + CHECK(ctx.start(HashingContext::HASH_SHA1) == OK); + result = ctx.finish(); + REQUIRE(result.size() == 20); + CHECK(memcmp(result.ptr(), sha1_expected, 20) == 0); + + CHECK(ctx.start(HashingContext::HASH_SHA256) == OK); + result = ctx.finish(); + REQUIRE(result.size() == 32); + CHECK(memcmp(result.ptr(), sha256_expected, 32) == 0); +} + +TEST_CASE("[HashingContext] Multiple updates - MD5/SHA1/SHA256") { + HashingContext ctx; + const String s = "xyz"; + + const PackedByteArray s_byte_parts[] = { + String("x").to_ascii_buffer(), + String("y").to_ascii_buffer(), + String("z").to_ascii_buffer() + }; + + static const uint8_t md5_expected[] = { + 0xd1, 0x6f, 0xb3, 0x6f, 0x09, 0x11, 0xf8, 0x78, 0x99, 0x8c, 0x13, 0x61, 0x91, 0xaf, 0x70, 0x5e + }; + static const uint8_t sha1_expected[] = { + 0x66, 0xb2, 0x74, 0x17, 0xd3, 0x7e, 0x02, 0x4c, 0x46, 0x52, 0x6c, 0x2f, 0x6d, 0x35, 0x8a, 0x75, + 0x4f, 0xc5, 0x52, 0xf3 + }; + static const uint8_t sha256_expected[] = { + 0x36, 0x08, 0xbc, 0xa1, 0xe4, 0x4e, 0xa6, 0xc4, 0xd2, 0x68, 0xeb, 0x6d, 0xb0, 0x22, 0x60, 0x26, + 0x98, 0x92, 0xc0, 0xb4, 0x2b, 0x86, 0xbb, 0xf1, 0xe7, 0x7a, 0x6f, 0xa1, 0x6c, 0x3c, 0x92, 0x82 + }; + + CHECK(ctx.start(HashingContext::HASH_MD5) == OK); + CHECK(ctx.update(s_byte_parts[0]) == OK); + CHECK(ctx.update(s_byte_parts[1]) == OK); + CHECK(ctx.update(s_byte_parts[2]) == OK); + PackedByteArray result = ctx.finish(); + REQUIRE(result.size() == 16); + CHECK(memcmp(result.ptr(), md5_expected, 16) == 0); + + CHECK(ctx.start(HashingContext::HASH_SHA1) == OK); + CHECK(ctx.update(s_byte_parts[0]) == OK); + CHECK(ctx.update(s_byte_parts[1]) == OK); + CHECK(ctx.update(s_byte_parts[2]) == OK); + result = ctx.finish(); + REQUIRE(result.size() == 20); + CHECK(memcmp(result.ptr(), sha1_expected, 20) == 0); + + CHECK(ctx.start(HashingContext::HASH_SHA256) == OK); + CHECK(ctx.update(s_byte_parts[0]) == OK); + CHECK(ctx.update(s_byte_parts[1]) == OK); + CHECK(ctx.update(s_byte_parts[2]) == OK); + result = ctx.finish(); + REQUIRE(result.size() == 32); + CHECK(memcmp(result.ptr(), sha256_expected, 32) == 0); +} + +TEST_CASE("[HashingContext] Invalid use of start") { + HashingContext ctx; + + ERR_PRINT_OFF; + CHECK_MESSAGE( + ctx.start(static_cast<HashingContext::HashType>(-1)) == ERR_UNAVAILABLE, + "Using invalid hash types should fail."); + ERR_PRINT_ON; + + REQUIRE(ctx.start(HashingContext::HASH_MD5) == OK); + + ERR_PRINT_OFF; + CHECK_MESSAGE( + ctx.start(HashingContext::HASH_MD5) == ERR_ALREADY_IN_USE, + "Calling 'start' twice before 'finish' should fail."); + ERR_PRINT_ON; +} + +TEST_CASE("[HashingContext] Invalid use of update") { + HashingContext ctx; + + ERR_PRINT_OFF; + CHECK_MESSAGE( + ctx.update(PackedByteArray()) == ERR_UNCONFIGURED, + "Calling 'update' before 'start' should fail."); + ERR_PRINT_ON; + + REQUIRE(ctx.start(HashingContext::HASH_MD5) == OK); + + ERR_PRINT_OFF; + CHECK_MESSAGE( + ctx.update(PackedByteArray()) == FAILED, + "Calling 'update' with an empty byte array should fail."); + ERR_PRINT_ON; +} + +TEST_CASE("[HashingContext] Invalid use of finish") { + HashingContext ctx; + + ERR_PRINT_OFF; + CHECK_MESSAGE( + ctx.finish() == PackedByteArray(), + "Calling 'finish' before 'start' should return an empty byte array."); + ERR_PRINT_ON; +} +} // namespace TestHashingContext + +#endif // TEST_HASHING_CONTEXT_H diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 7e9f8319a0..f2a546de9b 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -48,6 +48,7 @@ #include "test_geometry_3d.h" #include "test_gradient.h" #include "test_gui.h" +#include "test_hashing_context.h" #include "test_image.h" #include "test_json.h" #include "test_list.h" |